ETH Price: $3,493.05 (+7.61%)
Gas: 7 Gwei

Token

Virtual Versions Genesis NFT (VVG)
 

Overview

Max Total Supply

0 VVG

Holders

274

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
VirtualVersionsGenesisNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-08
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/// @title Virtual Versions Genesis NFT
/// @author Andre Costa @ MyWeb3Startup.com


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

    uint256 internal lastOwnershipTransfer;

    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 Returns the address of the previous owner.
     */
    function oldOwner() public view virtual returns (address) {
        return _oldOwner;
    }

    /**
     * @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;
        _oldOwner = oldOwner_;
        _owner = newOwner;
        lastOwnershipTransfer = block.timestamp;
        emit OwnershipTransferred(oldOwner_, newOwner);
    }
}

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor() {
        _name = "Virtual Versions Genesis NFT";
        _symbol = "VVG";
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

contract VirtualVersionsGenesisNFT is ERC721, Ownable {
 
    /// @notice The base uri of the project
    string public baseURI; 

    /// @notice The collection's max supply
    uint256 public maxSupply = 555; 

    /// @notice Total reserved
    uint256 public reserved; 

    /// @notice Total guaranteed mint count 
    uint256 public guaranteed; 

    /// @dev Merkle tree root hash for guaranteed list
    bytes32 public rootForGuaranteed;

    /// @dev Merkle tree root hash for allowed list
    bytes32 public rootForOversubscribed;

    /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints
    mapping(address => bool) public mintedOnGuaranteed; 
    mapping(address => bool) public mintedOnOversubscribed; 

    /// @dev Counters library to track token id and counts
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    Counters.Counter private _guaranteedAllowListMintedCounter;
    Counters.Counter private _oversubscribedAllowListMintedCounter;

    /// @dev Different states of minting 
    enum MintState {
        PAUSED, // Minting is paused
        GUARANTEED, // Guaranteed allow list 
        OVERSUBSCRIBED, // General allow list 
        PUBLIC // Open to public
    }
    MintState public mintState = MintState.PAUSED; 

    constructor() {
        baseURI = "ipfs://QmNhzPdhxLjgNYapS58nuFL2VWhf4D2BCsgzvA5BMSryF2/";
    }

    /// Base uri functions
    ///@notice Returns the base uri 
    ///@return Base uri
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    ///@notice Sets a new base uri
    ///@dev Only callable by owner
    ///@param newBaseURI The new base uri 
    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    ///@notice Returns the token uri
    ///@dev Updated to include json 
    ///@param tokenId Token id
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token");

        return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : "";
    }

    /// Minting functions
    ///@notice Mints nft token for allowed list addresses
    ///@dev Uses Merkle tree proof
    ///@param proof The Merkle tree proof of the allow list address 
    function mintAllowlist(bytes32[] calldata proof) external {
        /// Check if the sale is paused
        require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states");

        require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); 

        /// Check if user is on the allow list
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        
        /// Update the root based on the state
        bytes32 root;

        // If current state is for guaranteed mints, set to the guaranteed hash
        if (mintState == MintState.GUARANTEED) {

            /// Set the correct root hash
            root = rootForGuaranteed; 

            /// Check that user has not minted on guaranteed list
            require(mintedOnGuaranteed[_msgSender()] == false, "User already minted on guaranteed list");
            
            // Check there is sufficient guaranteed mint supply left 
            require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); 
            
            /// Increase the allow list minted count
            _guaranteedAllowListMintedCounter.increment();

            /// Set that address has minted
            mintedOnGuaranteed[_msgSender()] = true;
        } 

        // If current state is for oversubscribed, set to the oversubscribed hash
        if (mintState == MintState.OVERSUBSCRIBED) {

            /// Set the correct root hash
            root = rootForOversubscribed; 

            /// Check that user has not minted on oversubscribed list
            require(mintedOnOversubscribed[_msgSender()] == false, "User already minted on oversubscribed list");

            /// Check there is sufficient oversubscribed supply left
            /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count
            require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); 

            _oversubscribedAllowListMintedCounter.increment();

            /// Set that address has minted
            mintedOnOversubscribed[_msgSender()] = true;
        }

        // Check the merkle proof
        require(MerkleProof.verify(proof, root, leaf), "Invalid proof");

        /// Get current token id then increase it
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();

        /// Mint the token
        _safeMint(_msgSender(), tokenId);
    }

    ///@notice Mints a token to caller addresses 
    function mintPublic() external {

        require(mintState == MintState.PUBLIC, "Public mint inactive"); 

        /// Check balance of supply 
        /// Total supply minus reserved
        require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); 

        /// Get current token id then increase it
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();

        /// Mint the token
        _safeMint(_msgSender(), tokenId);
    }

    ///@notice Mint from reserve supply
    ///@dev Only callable by owner
    ///@param to Array of addresses to receive airdrop 
    function mintFromReserved(address[] calldata to) external onlyOwner {
        /// Check balance of supply
        require(to.length <= reserved, "Amount exceeds reserved supply"); 
        
        for(uint i; i < to.length;) {
            /// Get current token id then increase it
            uint256 tokenId = _tokenIdCounter.current();
            _tokenIdCounter.increment();

            /// Mint the token
            _safeMint(to[i], tokenId);

            /// Unchecked i to save gas
            unchecked {
                i++;
            }
        }
    }

    /// Other view and admin functions

    /**
     * @param merkleRoot_ The new merkle root
     */
    function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner {
        rootForGuaranteed = merkleRoot_;
    }

    /**
     * @param merkleRoot_ The new merkle root
     */
    function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner {
        rootForOversubscribed = merkleRoot_;
    }

    ///@notice Returns the total number of nftes minted
    function totalMinted() public view returns(uint256) {
        /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
       return _tokenIdCounter.current(); 
    }

    ///@notice Returns the current number of guaranteed allow list minted
    function totalGuaranteedAllowListMinted() public view returns(uint256) {
        /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
       return _guaranteedAllowListMintedCounter.current(); 
    }

    ///@notice Returns the current number of oversubscribed allow list minted
    function totalOversubscribedAllowListMinted() public view returns(uint256) {
        /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
       return _oversubscribedAllowListMintedCounter.current(); 
    }

    ///@notice Returns the total allow list minted 
    function totalAllowListMinted() public view returns(uint256) {
        /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
       return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); 
    }

    /**
     * Set mint state.
     * @param mintState_ The new state of the contract.
     */
    function setMintState(uint256 mintState_) external onlyOwner {
        require(mintState_ < 5, "Invalid State!");
        
        if (mintState_ == 0) {
            mintState = MintState.PAUSED;
        }
        else if (mintState_ == 1) {
            mintState = MintState.GUARANTEED;
        }
        else if (mintState_ == 2) {
            mintState = MintState.OVERSUBSCRIBED;
        }
        else {
            mintState = MintState.PUBLIC;
        }
    }

    ///@notice Function to update guaranteed mint count 
    ///@param count New guaranteed mint count
    function setGuaranteedCount(uint256 count) external onlyOwner {
        guaranteed = count; 
    }

    ///@notice Function to update reserved mint count 
    ///@param count New reserved mint count
    function setReservedCount(uint256 count) external onlyOwner {
        reserved = count; 
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum VirtualVersionsGenesisNFT.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","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":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","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"}]

608060405261022b600a556000601460006101000a81548160ff021916908360038111156200003357620000326200023b565b5b02179055503480156200004557600080fd5b506040518060400160405280601c81526020017f5669727475616c2056657273696f6e732047656e65736973204e465400000000815250600090816200008c9190620004e4565b506040518060400160405280600381526020017f565647000000000000000000000000000000000000000000000000000000000081525060019081620000d39190620004e4565b50620000f4620000e86200012560201b60201c565b6200012d60201b60201c565b60405180606001604052806036815260200162004efb60369139600990816200011e9190620004e4565b50620005cb565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ec57607f821691505b602082108103620003025762000301620002a4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200036c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200032d565b6200037886836200032d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003c5620003bf620003b98462000390565b6200039a565b62000390565b9050919050565b6000819050919050565b620003e183620003a4565b620003f9620003f082620003cc565b8484546200033a565b825550505050565b600090565b6200041062000401565b6200041d818484620003d6565b505050565b5b8181101562000445576200043960008262000406565b60018101905062000423565b5050565b601f82111562000494576200045e8162000308565b62000469846200031d565b8101602085101562000479578190505b6200049162000488856200031d565b83018262000422565b50505b505050565b600082821c905092915050565b6000620004b96000198460080262000499565b1980831691505092915050565b6000620004d48383620004a6565b9150826002028217905092915050565b620004ef826200026a565b67ffffffffffffffff8111156200050b576200050a62000275565b5b620005178254620002d3565b6200052482828562000449565b600060209050601f8311600181146200055c576000841562000547578287015190505b620005538582620004c6565b865550620005c3565b601f1984166200056c8662000308565b60005b8281101562000596578489015182556001820191506020850194506020810190506200056f565b86831015620005b65784890151620005b2601f891682620004a6565b8355505b6001600288020188555050505b505050505050565b61492080620005db6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f20423141461068e578063f2fde38b146106ac578063f487404f146106c8578063f9c957d8146106e6578063fe60d12c146107025761023d565b8063c87b56dd146105d4578063d371f76b14610604578063d5abeb0114610622578063e921dad214610640578063e985e9c51461065e5761023d565b8063a2309ff8116100ff578063a2309ff814610530578063ad8c3f331461054e578063b24222321461056a578063b88d4fde1461059a578063c051e38a146105b65761023d565b8063893807aa1461049e5780638c874ebd146104ce5780638da5cb5b146104d857806395d89b41146104f6578063a22cb465146105145761023d565b806332f4681c116101c95780636352211e1161018d5780636352211e146103fa5780636c0360eb1461042a5780636c96b0831461044857806370a0823114610464578063715018a6146104945761023d565b806332f4681c1461036a57806335d5959a146103885780633c186018146103a457806342842e0e146103c257806355f804b3146103de5761023d565b80630bb862d1116102105780630bb862d1146102dc57806316f9b707146102f8578063229fafe21461031457806323b872dd146103305780632dc7b8551461034c5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c60048036038101906102579190612c5b565b610720565b6040516102699190612ca3565b60405180910390f35b61027a610802565b6040516102879190612d4e565b60405180910390f35b6102aa60048036038101906102a59190612da6565b610894565b6040516102b79190612e14565b60405180910390f35b6102da60048036038101906102d59190612e5b565b6108da565b005b6102f660048036038101906102f19190612da6565b6109f1565b005b610312600480360381019061030d9190612da6565b610b89565b005b61032e60048036038101906103299190612f00565b610c0f565b005b61034a60048036038101906103459190612f4d565b610d3d565b005b610354610d9d565b6040516103619190612fb9565b60405180910390f35b610372610da3565b60405161037f9190612fe3565b60405180910390f35b6103a2600480360381019061039d919061302a565b610da9565b005b6103ac610e2f565b6040516103b99190612fe3565b60405180910390f35b6103dc60048036038101906103d79190612f4d565b610e54565b005b6103f860048036038101906103f39190613187565b610e74565b005b610414600480360381019061040f9190612da6565b610f03565b6040516104219190612e14565b60405180910390f35b610432610f89565b60405161043f9190612d4e565b60405180910390f35b610462600480360381019061045d9190613226565b611017565b005b61047e60048036038101906104799190613273565b61153f565b60405161048b9190612fe3565b60405180910390f35b61049c6115f6565b005b6104b860048036038101906104b39190613273565b61167e565b6040516104c59190612ca3565b60405180910390f35b6104d661169e565b005b6104e0611799565b6040516104ed9190612e14565b60405180910390f35b6104fe6117c3565b60405161050b9190612d4e565b60405180910390f35b61052e600480360381019061052991906132cc565b611855565b005b61053861186b565b6040516105459190612fe3565b60405180910390f35b6105686004803603810190610563919061302a565b61187c565b005b610584600480360381019061057f9190613273565b611902565b6040516105919190612ca3565b60405180910390f35b6105b460048036038101906105af91906133ad565b611922565b005b6105be611984565b6040516105cb91906134a7565b60405180910390f35b6105ee60048036038101906105e99190612da6565b611997565b6040516105fb9190612d4e565b60405180910390f35b61060c611a43565b6040516106199190612fe3565b60405180910390f35b61062a611a54565b6040516106379190612fe3565b60405180910390f35b610648611a5a565b6040516106559190612fb9565b60405180910390f35b610678600480360381019061067391906134c2565b611a60565b6040516106859190612ca3565b60405180910390f35b610696611af4565b6040516106a39190612fe3565b60405180910390f35b6106c660048036038101906106c19190613273565b611b05565b005b6106d0611bfc565b6040516106dd9190612e14565b60405180910390f35b61070060048036038101906106fb9190612da6565b611c26565b005b61070a611cac565b6040516107179190612fe3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fb57506107fa82611cb2565b5b9050919050565b60606000805461081190613531565b80601f016020809104026020016040519081016040528092919081815260200182805461083d90613531565b801561088a5780601f1061085f5761010080835404028352916020019161088a565b820191906000526020600020905b81548152906001019060200180831161086d57829003601f168201915b5050505050905090565b600061089f82611d1c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610f03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c906135d4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610974611d67565b73ffffffffffffffffffffffffffffffffffffffff1614806109a357506109a28161099d611d67565b611a60565b5b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613666565b60405180910390fd5b6109ec8383611d6f565b505050565b6109f9611d67565b73ffffffffffffffffffffffffffffffffffffffff16610a17611799565b73ffffffffffffffffffffffffffffffffffffffff1614610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a64906136d2565b60405180910390fd5b60058110610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa79061373e565b60405180910390fd5b60008103610ae8576000601460006101000a81548160ff02191690836003811115610ade57610add613430565b5b0217905550610b86565b60018103610b20576001601460006101000a81548160ff02191690836003811115610b1657610b15613430565b5b0217905550610b85565b60028103610b58576002601460006101000a81548160ff02191690836003811115610b4e57610b4d613430565b5b0217905550610b84565b6003601460006101000a81548160ff02191690836003811115610b7e57610b7d613430565b5b02179055505b5b5b50565b610b91611d67565b73ffffffffffffffffffffffffffffffffffffffff16610baf611799565b73ffffffffffffffffffffffffffffffffffffffff1614610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc906136d2565b60405180910390fd5b80600b8190555050565b610c17611d67565b73ffffffffffffffffffffffffffffffffffffffff16610c35611799565b73ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906136d2565b60405180910390fd5b600b54828290501115610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906137aa565b60405180910390fd5b60005b82829050811015610d38576000610ced6011611e28565b9050610cf96011611e36565b610d2a848484818110610d0f57610d0e6137ca565b5b9050602002016020810190610d249190613273565b82611e4c565b818060010192505050610cd6565b505050565b610d4e610d48611d67565b82611e6a565b610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d849061386b565b60405180910390fd5b610d98838383611f48565b505050565b600d5481565b600c5481565b610db1611d67565b73ffffffffffffffffffffffffffffffffffffffff16610dcf611799565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c906136d2565b60405180910390fd5b80600d8190555050565b6000610e3b6013611e28565b610e456012611e28565b610e4f91906138ba565b905090565b610e6f83838360405180602001604052806000815250611922565b505050565b610e7c611d67565b73ffffffffffffffffffffffffffffffffffffffff16610e9a611799565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906136d2565b60405180910390fd5b8060099081610eff9190613a9a565b5050565b600080610f0f83612253565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790613bb8565b60405180910390fd5b80915050919050565b60098054610f9690613531565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc290613531565b801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b505050505081565b6001600381111561102b5761102a613430565b5b601460009054906101000a900460ff16600381111561104d5761104c613430565b5b148061108c57506002600381111561106857611067613430565b5b601460009054906101000a900460ff16600381111561108a57611089613430565b5b145b6110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290613c24565b60405180910390fd5b600a546110d86011611e28565b10611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613c90565b60405180910390fd5b6000611122611d67565b6040516020016111329190613cf8565b6040516020818303038152906040528051906020012090506000600160038111156111605761115f613430565b5b601460009054906101000a900460ff16600381111561118257611181613430565b5b036112db57600d54905060001515600f600061119c611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613d85565b60405180910390fd5b600c54611231611af4565b10611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126890613df1565b60405180910390fd5b61127b6012611e36565b6001600f6000611289611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260038111156112ef576112ee613430565b5b601460009054906101000a900460ff16600381111561131157611310613430565b5b0361148457600e549050600015156010600061132b611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90613e83565b60405180910390fd5b600c54600b54600a546113c89190613ea3565b6113d29190613ea3565b6113da611a43565b1061141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613f23565b60405180910390fd5b6114246013611e36565b600160106000611432611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6114d0848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508284612290565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613f8f565b60405180910390fd5b600061151b6011611e28565b90506115276011611e36565b611538611532611d67565b82611e4c565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690614021565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115fe611d67565b73ffffffffffffffffffffffffffffffffffffffff1661161c611799565b73ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611669906136d2565b60405180910390fd5b61167c60006122a7565b565b60106020528060005260406000206000915054906101000a900460ff1681565b6003808111156116b1576116b0613430565b5b601460009054906101000a900460ff1660038111156116d3576116d2613430565b5b14611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061408d565b60405180910390fd5b600b54600a546117239190613ea3565b61172d6011611e28565b1061176d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117649061411f565b60405180910390fd5b60006117796011611e28565b90506117856011611e36565b611796611790611d67565b82611e4c565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117d290613531565b80601f01602080910402602001604051908101604052809291908181526020018280546117fe90613531565b801561184b5780601f106118205761010080835404028352916020019161184b565b820191906000526020600020905b81548152906001019060200180831161182e57829003601f168201915b5050505050905090565b611867611860611d67565b83836123b5565b5050565b60006118776011611e28565b905090565b611884611d67565b73ffffffffffffffffffffffffffffffffffffffff166118a2611799565b73ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef906136d2565b60405180910390fd5b80600e8190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61193361192d611d67565b83611e6a565b611972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119699061386b565b60405180910390fd5b61197e84848484612521565b50505050565b601460009054906101000a900460ff1681565b60606119a36011611e28565b8211156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc9061418b565b60405180910390fd5b6000600980546119f490613531565b905011611a105760405180602001604052806000815250611a3c565b6009611a1b8361257d565b604051602001611a2c929190614290565b6040516020818303038152906040525b9050919050565b6000611a4f6013611e28565b905090565b600a5481565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611b006012611e28565b905090565b611b0d611d67565b73ffffffffffffffffffffffffffffffffffffffff16611b2b611799565b73ffffffffffffffffffffffffffffffffffffffff1614611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b78906136d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790614335565b60405180910390fd5b611bf9816122a7565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c2e611d67565b73ffffffffffffffffffffffffffffffffffffffff16611c4c611799565b73ffffffffffffffffffffffffffffffffffffffff1614611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906136d2565b60405180910390fd5b80600c8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d25816126dd565b611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90613bb8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611de283610f03565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611e6682826040518060200160405280600081525061271e565b5050565b6000611e75826126dd565b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab906143c7565b60405180910390fd5b6000611ebf83610f03565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f015750611f008185611a60565b5b80611f3f57508373ffffffffffffffffffffffffffffffffffffffff16611f2784610894565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6882610f03565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906144eb565b60405180910390fd5b61203a8383836001612779565b8273ffffffffffffffffffffffffffffffffffffffff1661205a82610f03565b73ffffffffffffffffffffffffffffffffffffffff16146120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790614459565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121369190613ea3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218d91906138ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224e838383600161277f565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008261229d8584612785565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614557565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125149190612ca3565b60405180910390a3505050565b61252c848484611f48565b61253884848484612838565b612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e906145e9565b60405180910390fd5b50505050565b6060600082036125c4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d8565b600082905060005b600082146125f65780806125df90614609565b915050600a826125ef9190614680565b91506125cc565b60008167ffffffffffffffff8111156126125761261161305c565b5b6040519080825280601f01601f1916602001820160405280156126445781602001600182028036833780820191505090505b5090505b600085146126d15760018261265d9190613ea3565b9150600a8561266c91906146b1565b603061267891906138ba565b60f81b81838151811061268e5761268d6137ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ca9190614680565b9450612648565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166126ff83612253565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61272883836129bf565b6127356000848484612838565b612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b906145e9565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561282d5760008582815181106127ac576127ab6137ca565b5b602002602001015190508083116127ed5782816040516020016127d0929190614703565b604051602081830303815290604052805190602001209250612819565b8083604051602001612800929190614703565b6040516020818303038152906040528051906020012092505b50808061282590614609565b91505061278e565b508091505092915050565b60006128598473ffffffffffffffffffffffffffffffffffffffff16612bdc565b156129b2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612882611d67565b8786866040518563ffffffff1660e01b81526004016128a49493929190614784565b6020604051808303816000875af19250505080156128e057506040513d601f19601f820116820180604052508101906128dd91906147e5565b60015b612962573d8060008114612910576040519150601f19603f3d011682016040523d82523d6000602084013e612915565b606091505b50600081510361295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906145e9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b7565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a259061485e565b60405180910390fd5b612a37816126dd565b15612a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6e906148ca565b60405180910390fd5b612a85600083836001612779565b612a8e816126dd565b15612ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac5906148ca565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd860008383600161277f565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bf9565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d2082612cbe565b612d2a8185612cc9565b9350612d3a818560208601612cda565b612d4381612d04565b840191505092915050565b60006020820190508181036000830152612d688184612d15565b905092915050565b6000819050919050565b612d8381612d70565b8114612d8e57600080fd5b50565b600081359050612da081612d7a565b92915050565b600060208284031215612dbc57612dbb612bf9565b5b6000612dca84828501612d91565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dfe82612dd3565b9050919050565b612e0e81612df3565b82525050565b6000602082019050612e296000830184612e05565b92915050565b612e3881612df3565b8114612e4357600080fd5b50565b600081359050612e5581612e2f565b92915050565b60008060408385031215612e7257612e71612bf9565b5b6000612e8085828601612e46565b9250506020612e9185828601612d91565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612ec057612ebf612e9b565b5b8235905067ffffffffffffffff811115612edd57612edc612ea0565b5b602083019150836020820283011115612ef957612ef8612ea5565b5b9250929050565b60008060208385031215612f1757612f16612bf9565b5b600083013567ffffffffffffffff811115612f3557612f34612bfe565b5b612f4185828601612eaa565b92509250509250929050565b600080600060608486031215612f6657612f65612bf9565b5b6000612f7486828701612e46565b9350506020612f8586828701612e46565b9250506040612f9686828701612d91565b9150509250925092565b6000819050919050565b612fb381612fa0565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612d70565b82525050565b6000602082019050612ff86000830184612fd4565b92915050565b61300781612fa0565b811461301257600080fd5b50565b60008135905061302481612ffe565b92915050565b6000602082840312156130405761303f612bf9565b5b600061304e84828501613015565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61309482612d04565b810181811067ffffffffffffffff821117156130b3576130b261305c565b5b80604052505050565b60006130c6612bef565b90506130d2828261308b565b919050565b600067ffffffffffffffff8211156130f2576130f161305c565b5b6130fb82612d04565b9050602081019050919050565b82818337600083830152505050565b600061312a613125846130d7565b6130bc565b90508281526020810184848401111561314657613145613057565b5b613151848285613108565b509392505050565b600082601f83011261316e5761316d612e9b565b5b813561317e848260208601613117565b91505092915050565b60006020828403121561319d5761319c612bf9565b5b600082013567ffffffffffffffff8111156131bb576131ba612bfe565b5b6131c784828501613159565b91505092915050565b60008083601f8401126131e6576131e5612e9b565b5b8235905067ffffffffffffffff81111561320357613202612ea0565b5b60208301915083602082028301111561321f5761321e612ea5565b5b9250929050565b6000806020838503121561323d5761323c612bf9565b5b600083013567ffffffffffffffff81111561325b5761325a612bfe565b5b613267858286016131d0565b92509250509250929050565b60006020828403121561328957613288612bf9565b5b600061329784828501612e46565b91505092915050565b6132a981612c88565b81146132b457600080fd5b50565b6000813590506132c6816132a0565b92915050565b600080604083850312156132e3576132e2612bf9565b5b60006132f185828601612e46565b9250506020613302858286016132b7565b9150509250929050565b600067ffffffffffffffff8211156133275761332661305c565b5b61333082612d04565b9050602081019050919050565b600061335061334b8461330c565b6130bc565b90508281526020810184848401111561336c5761336b613057565b5b613377848285613108565b509392505050565b600082601f83011261339457613393612e9b565b5b81356133a484826020860161333d565b91505092915050565b600080600080608085870312156133c7576133c6612bf9565b5b60006133d587828801612e46565b94505060206133e687828801612e46565b93505060406133f787828801612d91565b925050606085013567ffffffffffffffff81111561341857613417612bfe565b5b6134248782880161337f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106134705761346f613430565b5b50565b60008190506134818261345f565b919050565b600061349182613473565b9050919050565b6134a181613486565b82525050565b60006020820190506134bc6000830184613498565b92915050565b600080604083850312156134d9576134d8612bf9565b5b60006134e785828601612e46565b92505060206134f885828601612e46565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061354957607f821691505b60208210810361355c5761355b613502565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135be602183612cc9565b91506135c982613562565b604082019050919050565b600060208201905081810360008301526135ed816135b1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613650603d83612cc9565b915061365b826135f4565b604082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136bc602083612cc9565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f496e76616c696420537461746521000000000000000000000000000000000000600082015250565b6000613728600e83612cc9565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613794601e83612cc9565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613855602d83612cc9565b9150613860826137f9565b604082019050919050565b6000602082019050818103600083015261388481613848565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c582612d70565b91506138d083612d70565b92508282019050808211156138e8576138e761388b565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613913565b61395a8683613913565b95508019841693508086168417925050509392505050565b6000819050919050565b600061399761399261398d84612d70565b613972565b612d70565b9050919050565b6000819050919050565b6139b18361397c565b6139c56139bd8261399e565b848454613920565b825550505050565b600090565b6139da6139cd565b6139e58184846139a8565b505050565b5b81811015613a09576139fe6000826139d2565b6001810190506139eb565b5050565b601f821115613a4e57613a1f816138ee565b613a2884613903565b81016020851015613a37578190505b613a4b613a4385613903565b8301826139ea565b50505b505050565b600082821c905092915050565b6000613a7160001984600802613a53565b1980831691505092915050565b6000613a8a8383613a60565b9150826002028217905092915050565b613aa382612cbe565b67ffffffffffffffff811115613abc57613abb61305c565b5b613ac68254613531565b613ad1828285613a0d565b600060209050601f831160018114613b045760008415613af2578287015190505b613afc8582613a7e565b865550613b64565b601f198416613b12866138ee565b60005b82811015613b3a57848901518255600182019150602085019450602081019050613b15565b86831015613b575784890151613b53601f891682613a60565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ba2601883612cc9565b9150613bad82613b6c565b602082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613c0e601f83612cc9565b9150613c1982613bd8565b602082019050919050565b60006020820190508181036000830152613c3d81613c01565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613c7a601183612cc9565b9150613c8582613c44565b602082019050919050565b60006020820190508181036000830152613ca981613c6d565b9050919050565b60008160601b9050919050565b6000613cc882613cb0565b9050919050565b6000613cda82613cbd565b9050919050565b613cf2613ced82612df3565b613ccf565b82525050565b6000613d048284613ce1565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613d6f602683612cc9565b9150613d7a82613d13565b604082019050919050565b60006020820190508181036000830152613d9e81613d62565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613ddb601c83612cc9565b9150613de682613da5565b602082019050919050565b60006020820190508181036000830152613e0a81613dce565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613e6d602a83612cc9565b9150613e7882613e11565b604082019050919050565b60006020820190508181036000830152613e9c81613e60565b9050919050565b6000613eae82612d70565b9150613eb983612d70565b9250828203905081811115613ed157613ed061388b565b5b92915050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613f0d601c83612cc9565b9150613f1882613ed7565b602082019050919050565b60006020820190508181036000830152613f3c81613f00565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613f79600d83612cc9565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061400b602983612cc9565b915061401682613faf565b604082019050919050565b6000602082019050818103600083015261403a81613ffe565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000614077601483612cc9565b915061408282614041565b602082019050919050565b600060208201905081810360008301526140a68161406a565b9050919050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000614109602283612cc9565b9150614114826140ad565b604082019050919050565b60006020820190508181036000830152614138816140fc565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614175601f83612cc9565b91506141808261413f565b602082019050919050565b600060208201905081810360008301526141a481614168565b9050919050565b600081905092915050565b600081546141c381613531565b6141cd81866141ab565b945060018216600081146141e857600181146141fd57614230565b60ff1983168652811515820286019350614230565b614206856138ee565b60005b8381101561422857815481890152600182019150602081019050614209565b838801955050505b50505092915050565b600061424482612cbe565b61424e81856141ab565b935061425e818560208601612cda565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061429c82856141b6565b91506142a88284614239565b91506142b38261426a565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061431f602683612cc9565b915061432a826142c3565b604082019050919050565b6000602082019050818103600083015261434e81614312565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006143b1602c83612cc9565b91506143bc82614355565b604082019050919050565b600060208201905081810360008301526143e0816143a4565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614443602583612cc9565b915061444e826143e7565b604082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144d5602483612cc9565b91506144e082614479565b604082019050919050565b60006020820190508181036000830152614504816144c8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614541601983612cc9565b915061454c8261450b565b602082019050919050565b6000602082019050818103600083015261457081614534565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145d3603283612cc9565b91506145de82614577565b604082019050919050565b60006020820190508181036000830152614602816145c6565b9050919050565b600061461482612d70565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146465761464561388b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468b82612d70565b915061469683612d70565b9250826146a6576146a5614651565b5b828204905092915050565b60006146bc82612d70565b91506146c783612d70565b9250826146d7576146d6614651565b5b828206905092915050565b6000819050919050565b6146fd6146f882612fa0565b6146e2565b82525050565b600061470f82856146ec565b60208201915061471f82846146ec565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006147568261472f565b614760818561473a565b9350614770818560208601612cda565b61477981612d04565b840191505092915050565b60006080820190506147996000830187612e05565b6147a66020830186612e05565b6147b36040830185612fd4565b81810360608301526147c5818461474b565b905095945050505050565b6000815190506147df81612c2f565b92915050565b6000602082840312156147fb576147fa612bf9565b5b6000614809848285016147d0565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614848602083612cc9565b915061485382614812565b602082019050919050565b600060208201905081810360008301526148778161483b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148b4601c83612cc9565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b905091905056fea2646970667358221220674491dc654e809cfa3fb4bd52d5df17730a8ad1fde0c9e4b8222efc4fc9b6b664736f6c63430008120033697066733a2f2f516d4e687a506468784c6a674e5961705335386e75464c3256576866344432424373677a764135424d53727946322f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f20423141461068e578063f2fde38b146106ac578063f487404f146106c8578063f9c957d8146106e6578063fe60d12c146107025761023d565b8063c87b56dd146105d4578063d371f76b14610604578063d5abeb0114610622578063e921dad214610640578063e985e9c51461065e5761023d565b8063a2309ff8116100ff578063a2309ff814610530578063ad8c3f331461054e578063b24222321461056a578063b88d4fde1461059a578063c051e38a146105b65761023d565b8063893807aa1461049e5780638c874ebd146104ce5780638da5cb5b146104d857806395d89b41146104f6578063a22cb465146105145761023d565b806332f4681c116101c95780636352211e1161018d5780636352211e146103fa5780636c0360eb1461042a5780636c96b0831461044857806370a0823114610464578063715018a6146104945761023d565b806332f4681c1461036a57806335d5959a146103885780633c186018146103a457806342842e0e146103c257806355f804b3146103de5761023d565b80630bb862d1116102105780630bb862d1146102dc57806316f9b707146102f8578063229fafe21461031457806323b872dd146103305780632dc7b8551461034c5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c60048036038101906102579190612c5b565b610720565b6040516102699190612ca3565b60405180910390f35b61027a610802565b6040516102879190612d4e565b60405180910390f35b6102aa60048036038101906102a59190612da6565b610894565b6040516102b79190612e14565b60405180910390f35b6102da60048036038101906102d59190612e5b565b6108da565b005b6102f660048036038101906102f19190612da6565b6109f1565b005b610312600480360381019061030d9190612da6565b610b89565b005b61032e60048036038101906103299190612f00565b610c0f565b005b61034a60048036038101906103459190612f4d565b610d3d565b005b610354610d9d565b6040516103619190612fb9565b60405180910390f35b610372610da3565b60405161037f9190612fe3565b60405180910390f35b6103a2600480360381019061039d919061302a565b610da9565b005b6103ac610e2f565b6040516103b99190612fe3565b60405180910390f35b6103dc60048036038101906103d79190612f4d565b610e54565b005b6103f860048036038101906103f39190613187565b610e74565b005b610414600480360381019061040f9190612da6565b610f03565b6040516104219190612e14565b60405180910390f35b610432610f89565b60405161043f9190612d4e565b60405180910390f35b610462600480360381019061045d9190613226565b611017565b005b61047e60048036038101906104799190613273565b61153f565b60405161048b9190612fe3565b60405180910390f35b61049c6115f6565b005b6104b860048036038101906104b39190613273565b61167e565b6040516104c59190612ca3565b60405180910390f35b6104d661169e565b005b6104e0611799565b6040516104ed9190612e14565b60405180910390f35b6104fe6117c3565b60405161050b9190612d4e565b60405180910390f35b61052e600480360381019061052991906132cc565b611855565b005b61053861186b565b6040516105459190612fe3565b60405180910390f35b6105686004803603810190610563919061302a565b61187c565b005b610584600480360381019061057f9190613273565b611902565b6040516105919190612ca3565b60405180910390f35b6105b460048036038101906105af91906133ad565b611922565b005b6105be611984565b6040516105cb91906134a7565b60405180910390f35b6105ee60048036038101906105e99190612da6565b611997565b6040516105fb9190612d4e565b60405180910390f35b61060c611a43565b6040516106199190612fe3565b60405180910390f35b61062a611a54565b6040516106379190612fe3565b60405180910390f35b610648611a5a565b6040516106559190612fb9565b60405180910390f35b610678600480360381019061067391906134c2565b611a60565b6040516106859190612ca3565b60405180910390f35b610696611af4565b6040516106a39190612fe3565b60405180910390f35b6106c660048036038101906106c19190613273565b611b05565b005b6106d0611bfc565b6040516106dd9190612e14565b60405180910390f35b61070060048036038101906106fb9190612da6565b611c26565b005b61070a611cac565b6040516107179190612fe3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fb57506107fa82611cb2565b5b9050919050565b60606000805461081190613531565b80601f016020809104026020016040519081016040528092919081815260200182805461083d90613531565b801561088a5780601f1061085f5761010080835404028352916020019161088a565b820191906000526020600020905b81548152906001019060200180831161086d57829003601f168201915b5050505050905090565b600061089f82611d1c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610f03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c906135d4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610974611d67565b73ffffffffffffffffffffffffffffffffffffffff1614806109a357506109a28161099d611d67565b611a60565b5b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613666565b60405180910390fd5b6109ec8383611d6f565b505050565b6109f9611d67565b73ffffffffffffffffffffffffffffffffffffffff16610a17611799565b73ffffffffffffffffffffffffffffffffffffffff1614610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a64906136d2565b60405180910390fd5b60058110610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa79061373e565b60405180910390fd5b60008103610ae8576000601460006101000a81548160ff02191690836003811115610ade57610add613430565b5b0217905550610b86565b60018103610b20576001601460006101000a81548160ff02191690836003811115610b1657610b15613430565b5b0217905550610b85565b60028103610b58576002601460006101000a81548160ff02191690836003811115610b4e57610b4d613430565b5b0217905550610b84565b6003601460006101000a81548160ff02191690836003811115610b7e57610b7d613430565b5b02179055505b5b5b50565b610b91611d67565b73ffffffffffffffffffffffffffffffffffffffff16610baf611799565b73ffffffffffffffffffffffffffffffffffffffff1614610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc906136d2565b60405180910390fd5b80600b8190555050565b610c17611d67565b73ffffffffffffffffffffffffffffffffffffffff16610c35611799565b73ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906136d2565b60405180910390fd5b600b54828290501115610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906137aa565b60405180910390fd5b60005b82829050811015610d38576000610ced6011611e28565b9050610cf96011611e36565b610d2a848484818110610d0f57610d0e6137ca565b5b9050602002016020810190610d249190613273565b82611e4c565b818060010192505050610cd6565b505050565b610d4e610d48611d67565b82611e6a565b610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d849061386b565b60405180910390fd5b610d98838383611f48565b505050565b600d5481565b600c5481565b610db1611d67565b73ffffffffffffffffffffffffffffffffffffffff16610dcf611799565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c906136d2565b60405180910390fd5b80600d8190555050565b6000610e3b6013611e28565b610e456012611e28565b610e4f91906138ba565b905090565b610e6f83838360405180602001604052806000815250611922565b505050565b610e7c611d67565b73ffffffffffffffffffffffffffffffffffffffff16610e9a611799565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906136d2565b60405180910390fd5b8060099081610eff9190613a9a565b5050565b600080610f0f83612253565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790613bb8565b60405180910390fd5b80915050919050565b60098054610f9690613531565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc290613531565b801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b505050505081565b6001600381111561102b5761102a613430565b5b601460009054906101000a900460ff16600381111561104d5761104c613430565b5b148061108c57506002600381111561106857611067613430565b5b601460009054906101000a900460ff16600381111561108a57611089613430565b5b145b6110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290613c24565b60405180910390fd5b600a546110d86011611e28565b10611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613c90565b60405180910390fd5b6000611122611d67565b6040516020016111329190613cf8565b6040516020818303038152906040528051906020012090506000600160038111156111605761115f613430565b5b601460009054906101000a900460ff16600381111561118257611181613430565b5b036112db57600d54905060001515600f600061119c611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613d85565b60405180910390fd5b600c54611231611af4565b10611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126890613df1565b60405180910390fd5b61127b6012611e36565b6001600f6000611289611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260038111156112ef576112ee613430565b5b601460009054906101000a900460ff16600381111561131157611310613430565b5b0361148457600e549050600015156010600061132b611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90613e83565b60405180910390fd5b600c54600b54600a546113c89190613ea3565b6113d29190613ea3565b6113da611a43565b1061141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613f23565b60405180910390fd5b6114246013611e36565b600160106000611432611d67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6114d0848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508284612290565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613f8f565b60405180910390fd5b600061151b6011611e28565b90506115276011611e36565b611538611532611d67565b82611e4c565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690614021565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115fe611d67565b73ffffffffffffffffffffffffffffffffffffffff1661161c611799565b73ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611669906136d2565b60405180910390fd5b61167c60006122a7565b565b60106020528060005260406000206000915054906101000a900460ff1681565b6003808111156116b1576116b0613430565b5b601460009054906101000a900460ff1660038111156116d3576116d2613430565b5b14611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061408d565b60405180910390fd5b600b54600a546117239190613ea3565b61172d6011611e28565b1061176d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117649061411f565b60405180910390fd5b60006117796011611e28565b90506117856011611e36565b611796611790611d67565b82611e4c565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117d290613531565b80601f01602080910402602001604051908101604052809291908181526020018280546117fe90613531565b801561184b5780601f106118205761010080835404028352916020019161184b565b820191906000526020600020905b81548152906001019060200180831161182e57829003601f168201915b5050505050905090565b611867611860611d67565b83836123b5565b5050565b60006118776011611e28565b905090565b611884611d67565b73ffffffffffffffffffffffffffffffffffffffff166118a2611799565b73ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef906136d2565b60405180910390fd5b80600e8190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61193361192d611d67565b83611e6a565b611972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119699061386b565b60405180910390fd5b61197e84848484612521565b50505050565b601460009054906101000a900460ff1681565b60606119a36011611e28565b8211156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc9061418b565b60405180910390fd5b6000600980546119f490613531565b905011611a105760405180602001604052806000815250611a3c565b6009611a1b8361257d565b604051602001611a2c929190614290565b6040516020818303038152906040525b9050919050565b6000611a4f6013611e28565b905090565b600a5481565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611b006012611e28565b905090565b611b0d611d67565b73ffffffffffffffffffffffffffffffffffffffff16611b2b611799565b73ffffffffffffffffffffffffffffffffffffffff1614611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b78906136d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790614335565b60405180910390fd5b611bf9816122a7565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c2e611d67565b73ffffffffffffffffffffffffffffffffffffffff16611c4c611799565b73ffffffffffffffffffffffffffffffffffffffff1614611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906136d2565b60405180910390fd5b80600c8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d25816126dd565b611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90613bb8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611de283610f03565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611e6682826040518060200160405280600081525061271e565b5050565b6000611e75826126dd565b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab906143c7565b60405180910390fd5b6000611ebf83610f03565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f015750611f008185611a60565b5b80611f3f57508373ffffffffffffffffffffffffffffffffffffffff16611f2784610894565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6882610f03565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906144eb565b60405180910390fd5b61203a8383836001612779565b8273ffffffffffffffffffffffffffffffffffffffff1661205a82610f03565b73ffffffffffffffffffffffffffffffffffffffff16146120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790614459565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121369190613ea3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218d91906138ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224e838383600161277f565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008261229d8584612785565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614557565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125149190612ca3565b60405180910390a3505050565b61252c848484611f48565b61253884848484612838565b612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e906145e9565b60405180910390fd5b50505050565b6060600082036125c4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d8565b600082905060005b600082146125f65780806125df90614609565b915050600a826125ef9190614680565b91506125cc565b60008167ffffffffffffffff8111156126125761261161305c565b5b6040519080825280601f01601f1916602001820160405280156126445781602001600182028036833780820191505090505b5090505b600085146126d15760018261265d9190613ea3565b9150600a8561266c91906146b1565b603061267891906138ba565b60f81b81838151811061268e5761268d6137ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ca9190614680565b9450612648565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166126ff83612253565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61272883836129bf565b6127356000848484612838565b612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b906145e9565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561282d5760008582815181106127ac576127ab6137ca565b5b602002602001015190508083116127ed5782816040516020016127d0929190614703565b604051602081830303815290604052805190602001209250612819565b8083604051602001612800929190614703565b6040516020818303038152906040528051906020012092505b50808061282590614609565b91505061278e565b508091505092915050565b60006128598473ffffffffffffffffffffffffffffffffffffffff16612bdc565b156129b2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612882611d67565b8786866040518563ffffffff1660e01b81526004016128a49493929190614784565b6020604051808303816000875af19250505080156128e057506040513d601f19601f820116820180604052508101906128dd91906147e5565b60015b612962573d8060008114612910576040519150601f19603f3d011682016040523d82523d6000602084013e612915565b606091505b50600081510361295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906145e9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b7565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a259061485e565b60405180910390fd5b612a37816126dd565b15612a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6e906148ca565b60405180910390fd5b612a85600083836001612779565b612a8e816126dd565b15612ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac5906148ca565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd860008383600161277f565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bf9565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d2082612cbe565b612d2a8185612cc9565b9350612d3a818560208601612cda565b612d4381612d04565b840191505092915050565b60006020820190508181036000830152612d688184612d15565b905092915050565b6000819050919050565b612d8381612d70565b8114612d8e57600080fd5b50565b600081359050612da081612d7a565b92915050565b600060208284031215612dbc57612dbb612bf9565b5b6000612dca84828501612d91565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dfe82612dd3565b9050919050565b612e0e81612df3565b82525050565b6000602082019050612e296000830184612e05565b92915050565b612e3881612df3565b8114612e4357600080fd5b50565b600081359050612e5581612e2f565b92915050565b60008060408385031215612e7257612e71612bf9565b5b6000612e8085828601612e46565b9250506020612e9185828601612d91565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612ec057612ebf612e9b565b5b8235905067ffffffffffffffff811115612edd57612edc612ea0565b5b602083019150836020820283011115612ef957612ef8612ea5565b5b9250929050565b60008060208385031215612f1757612f16612bf9565b5b600083013567ffffffffffffffff811115612f3557612f34612bfe565b5b612f4185828601612eaa565b92509250509250929050565b600080600060608486031215612f6657612f65612bf9565b5b6000612f7486828701612e46565b9350506020612f8586828701612e46565b9250506040612f9686828701612d91565b9150509250925092565b6000819050919050565b612fb381612fa0565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612d70565b82525050565b6000602082019050612ff86000830184612fd4565b92915050565b61300781612fa0565b811461301257600080fd5b50565b60008135905061302481612ffe565b92915050565b6000602082840312156130405761303f612bf9565b5b600061304e84828501613015565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61309482612d04565b810181811067ffffffffffffffff821117156130b3576130b261305c565b5b80604052505050565b60006130c6612bef565b90506130d2828261308b565b919050565b600067ffffffffffffffff8211156130f2576130f161305c565b5b6130fb82612d04565b9050602081019050919050565b82818337600083830152505050565b600061312a613125846130d7565b6130bc565b90508281526020810184848401111561314657613145613057565b5b613151848285613108565b509392505050565b600082601f83011261316e5761316d612e9b565b5b813561317e848260208601613117565b91505092915050565b60006020828403121561319d5761319c612bf9565b5b600082013567ffffffffffffffff8111156131bb576131ba612bfe565b5b6131c784828501613159565b91505092915050565b60008083601f8401126131e6576131e5612e9b565b5b8235905067ffffffffffffffff81111561320357613202612ea0565b5b60208301915083602082028301111561321f5761321e612ea5565b5b9250929050565b6000806020838503121561323d5761323c612bf9565b5b600083013567ffffffffffffffff81111561325b5761325a612bfe565b5b613267858286016131d0565b92509250509250929050565b60006020828403121561328957613288612bf9565b5b600061329784828501612e46565b91505092915050565b6132a981612c88565b81146132b457600080fd5b50565b6000813590506132c6816132a0565b92915050565b600080604083850312156132e3576132e2612bf9565b5b60006132f185828601612e46565b9250506020613302858286016132b7565b9150509250929050565b600067ffffffffffffffff8211156133275761332661305c565b5b61333082612d04565b9050602081019050919050565b600061335061334b8461330c565b6130bc565b90508281526020810184848401111561336c5761336b613057565b5b613377848285613108565b509392505050565b600082601f83011261339457613393612e9b565b5b81356133a484826020860161333d565b91505092915050565b600080600080608085870312156133c7576133c6612bf9565b5b60006133d587828801612e46565b94505060206133e687828801612e46565b93505060406133f787828801612d91565b925050606085013567ffffffffffffffff81111561341857613417612bfe565b5b6134248782880161337f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106134705761346f613430565b5b50565b60008190506134818261345f565b919050565b600061349182613473565b9050919050565b6134a181613486565b82525050565b60006020820190506134bc6000830184613498565b92915050565b600080604083850312156134d9576134d8612bf9565b5b60006134e785828601612e46565b92505060206134f885828601612e46565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061354957607f821691505b60208210810361355c5761355b613502565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135be602183612cc9565b91506135c982613562565b604082019050919050565b600060208201905081810360008301526135ed816135b1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613650603d83612cc9565b915061365b826135f4565b604082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136bc602083612cc9565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f496e76616c696420537461746521000000000000000000000000000000000000600082015250565b6000613728600e83612cc9565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613794601e83612cc9565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613855602d83612cc9565b9150613860826137f9565b604082019050919050565b6000602082019050818103600083015261388481613848565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c582612d70565b91506138d083612d70565b92508282019050808211156138e8576138e761388b565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613913565b61395a8683613913565b95508019841693508086168417925050509392505050565b6000819050919050565b600061399761399261398d84612d70565b613972565b612d70565b9050919050565b6000819050919050565b6139b18361397c565b6139c56139bd8261399e565b848454613920565b825550505050565b600090565b6139da6139cd565b6139e58184846139a8565b505050565b5b81811015613a09576139fe6000826139d2565b6001810190506139eb565b5050565b601f821115613a4e57613a1f816138ee565b613a2884613903565b81016020851015613a37578190505b613a4b613a4385613903565b8301826139ea565b50505b505050565b600082821c905092915050565b6000613a7160001984600802613a53565b1980831691505092915050565b6000613a8a8383613a60565b9150826002028217905092915050565b613aa382612cbe565b67ffffffffffffffff811115613abc57613abb61305c565b5b613ac68254613531565b613ad1828285613a0d565b600060209050601f831160018114613b045760008415613af2578287015190505b613afc8582613a7e565b865550613b64565b601f198416613b12866138ee565b60005b82811015613b3a57848901518255600182019150602085019450602081019050613b15565b86831015613b575784890151613b53601f891682613a60565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ba2601883612cc9565b9150613bad82613b6c565b602082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613c0e601f83612cc9565b9150613c1982613bd8565b602082019050919050565b60006020820190508181036000830152613c3d81613c01565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613c7a601183612cc9565b9150613c8582613c44565b602082019050919050565b60006020820190508181036000830152613ca981613c6d565b9050919050565b60008160601b9050919050565b6000613cc882613cb0565b9050919050565b6000613cda82613cbd565b9050919050565b613cf2613ced82612df3565b613ccf565b82525050565b6000613d048284613ce1565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613d6f602683612cc9565b9150613d7a82613d13565b604082019050919050565b60006020820190508181036000830152613d9e81613d62565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613ddb601c83612cc9565b9150613de682613da5565b602082019050919050565b60006020820190508181036000830152613e0a81613dce565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613e6d602a83612cc9565b9150613e7882613e11565b604082019050919050565b60006020820190508181036000830152613e9c81613e60565b9050919050565b6000613eae82612d70565b9150613eb983612d70565b9250828203905081811115613ed157613ed061388b565b5b92915050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613f0d601c83612cc9565b9150613f1882613ed7565b602082019050919050565b60006020820190508181036000830152613f3c81613f00565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613f79600d83612cc9565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061400b602983612cc9565b915061401682613faf565b604082019050919050565b6000602082019050818103600083015261403a81613ffe565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000614077601483612cc9565b915061408282614041565b602082019050919050565b600060208201905081810360008301526140a68161406a565b9050919050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000614109602283612cc9565b9150614114826140ad565b604082019050919050565b60006020820190508181036000830152614138816140fc565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614175601f83612cc9565b91506141808261413f565b602082019050919050565b600060208201905081810360008301526141a481614168565b9050919050565b600081905092915050565b600081546141c381613531565b6141cd81866141ab565b945060018216600081146141e857600181146141fd57614230565b60ff1983168652811515820286019350614230565b614206856138ee565b60005b8381101561422857815481890152600182019150602081019050614209565b838801955050505b50505092915050565b600061424482612cbe565b61424e81856141ab565b935061425e818560208601612cda565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061429c82856141b6565b91506142a88284614239565b91506142b38261426a565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061431f602683612cc9565b915061432a826142c3565b604082019050919050565b6000602082019050818103600083015261434e81614312565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006143b1602c83612cc9565b91506143bc82614355565b604082019050919050565b600060208201905081810360008301526143e0816143a4565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614443602583612cc9565b915061444e826143e7565b604082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144d5602483612cc9565b91506144e082614479565b604082019050919050565b60006020820190508181036000830152614504816144c8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614541601983612cc9565b915061454c8261450b565b602082019050919050565b6000602082019050818103600083015261457081614534565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145d3603283612cc9565b91506145de82614577565b604082019050919050565b60006020820190508181036000830152614602816145c6565b9050919050565b600061461482612d70565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146465761464561388b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468b82612d70565b915061469683612d70565b9250826146a6576146a5614651565b5b828204905092915050565b60006146bc82612d70565b91506146c783612d70565b9250826146d7576146d6614651565b5b828206905092915050565b6000819050919050565b6146fd6146f882612fa0565b6146e2565b82525050565b600061470f82856146ec565b60208201915061471f82846146ec565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006147568261472f565b614760818561473a565b9350614770818560208601612cda565b61477981612d04565b840191505092915050565b60006080820190506147996000830187612e05565b6147a66020830186612e05565b6147b36040830185612fd4565b81810360608301526147c5818461474b565b905095945050505050565b6000815190506147df81612c2f565b92915050565b6000602082840312156147fb576147fa612bf9565b5b6000614809848285016147d0565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614848602083612cc9565b915061485382614812565b602082019050919050565b600060208201905081810360008301526148778161483b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148b4601c83612cc9565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b905091905056fea2646970667358221220674491dc654e809cfa3fb4bd52d5df17730a8ad1fde0c9e4b8222efc4fc9b6b664736f6c63430008120033

Deployed Bytecode Sourcemap

42362:9197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27078:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28006:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29518:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29036:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50653:481;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51456:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48162:583;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30218:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42789:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42698:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48860:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50242:304;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30590:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44159:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27716:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42471:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44877:2563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27447:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21943:103;;;:::i;:::-;;43092:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47499:521;;;:::i;:::-;;21117:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28175:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29761:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49248:227;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49056:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43034:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30812:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43682:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44379:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49909:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42547:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42883:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29987:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49558:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22201:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21286:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51247:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42619:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27078:305;27180:4;27232:25;27217:40;;;:11;:40;;;;:105;;;;27289:33;27274:48;;;:11;:48;;;;27217:105;:158;;;;27339:36;27363:11;27339:23;:36::i;:::-;27217:158;27197:178;;27078:305;;;:::o;28006:100::-;28060:13;28093:5;28086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28006:100;:::o;29518:171::-;29594:7;29614:23;29629:7;29614:14;:23::i;:::-;29657:15;:24;29673:7;29657:24;;;;;;;;;;;;;;;;;;;;;29650:31;;29518:171;;;:::o;29036:416::-;29117:13;29133:23;29148:7;29133:14;:23::i;:::-;29117:39;;29181:5;29175:11;;:2;:11;;;29167:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29275:5;29259:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29284:37;29301:5;29308:12;:10;:12::i;:::-;29284:16;:37::i;:::-;29259:62;29237:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;29423:21;29432:2;29436:7;29423:8;:21::i;:::-;29106:346;29036:416;;:::o;50653:481::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50746:1:::1;50733:10;:14;50725:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50805:1;50791:10;:15:::0;50787:340:::1;;50835:16;50823:9;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50787:340;;;50896:1;50882:10;:15:::0;50878:249:::1;;50926:20;50914:9;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50878:249;;;50991:1;50977:10;:15:::0;50973:154:::1;;51021:24;51009:9;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50973:154;;;51099:16;51087:9;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50973:154;50878:249;50787:340;50653:481:::0;:::o;51456:96::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51538:5:::1;51527:8;:16;;;;51456:96:::0;:::o;48162:583::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48299:8:::1;;48286:2;;:9;;:21;;48278:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48368:6;48364:374;48380:2;;:9;;48376:1;:13;48364:374;;;48462:15;48480:25;:15;:23;:25::i;:::-;48462:43;;48520:27;:15;:25;:27::i;:::-;48596:25;48606:2;;48609:1;48606:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;48613:7;48596:9;:25::i;:::-;48708:3;;;;;;;48392:346;48364:374;;;;48162:583:::0;;:::o;30218:301::-;30379:41;30398:12;:10;:12::i;:::-;30412:7;30379:18;:41::i;:::-;30371:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30483:28;30493:4;30499:2;30503:7;30483:9;:28::i;:::-;30218:301;;;:::o;42789:32::-;;;;:::o;42698:25::-;;;;:::o;48860:123::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48964:11:::1;48944:17;:31;;;;48860:123:::0;:::o;50242:304::-;50294:7;50490:47;:37;:45;:47::i;:::-;50444:43;:33;:41;:43::i;:::-;:93;;;;:::i;:::-;50437:100;;50242:304;:::o;30590:151::-;30694:39;30711:4;30717:2;30721:7;30694:39;;;;;;;;;;;;:16;:39::i;:::-;30590:151;;;:::o;44159:104::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44245:10:::1;44235:7;:20;;;;;;:::i;:::-;;44159:104:::0;:::o;27716:223::-;27788:7;27808:13;27824:17;27833:7;27824:8;:17::i;:::-;27808:33;;27877:1;27860:19;;:5;:19;;;27852:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27926:5;27919:12;;;27716:223;;;:::o;42471:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44877:2563::-;45008:20;44995:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;:74;;;;45045:24;45032:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;44995:74;44987:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45154:9;;45126:25;:15;:23;:25::i;:::-;:37;45118:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45247:12;45289;:10;:12::i;:::-;45272:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;45262:41;;;;;;45247:56;;45372:12;45495:20;45482:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;45478:728;;45584:17;;45577:24;;45730:5;45694:41;;:18;:32;45713:12;:10;:12::i;:::-;45694:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;45686:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;45921:10;;45886:32;:30;:32::i;:::-;:45;45878:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46048:45;:33;:43;:45::i;:::-;46190:4;46155:18;:32;46174:12;:10;:12::i;:::-;46155:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;45478:728;46319:24;46306:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;46302:802;;46412:21;;46405:28;;46570:5;46530:45;;:22;:36;46553:12;:10;:12::i;:::-;46530:36;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;46522:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46877:10;;46866:8;;46854:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46815:36;:34;:36::i;:::-;:72;46807:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46938:49;:37;:47;:49::i;:::-;47088:4;47049:22;:36;47072:12;:10;:12::i;:::-;47049:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;46302:802;47159:37;47178:5;;47159:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47185:4;47191;47159:18;:37::i;:::-;47151:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47278:15;47296:25;:15;:23;:25::i;:::-;47278:43;;47332:27;:15;:25;:27::i;:::-;47400:32;47410:12;:10;:12::i;:::-;47424:7;47400:9;:32::i;:::-;44935:2505;;;44877:2563;;:::o;27447:207::-;27519:7;27564:1;27547:19;;:5;:19;;;27539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27630:9;:16;27640:5;27630:16;;;;;;;;;;;;;;;;27623:23;;27447:207;;;:::o;21943:103::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22008:30:::1;22035:1;22008:18;:30::i;:::-;21943:103::o:0;43092:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;47499:521::-;47564:16;47551:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;47543:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47746:8;;47734:9;;:20;;;;:::i;:::-;47706:25;:15;:23;:25::i;:::-;:48;47698:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47858:15;47876:25;:15;:23;:25::i;:::-;47858:43;;47912:27;:15;:25;:27::i;:::-;47980:32;47990:12;:10;:12::i;:::-;48004:7;47980:9;:32::i;:::-;47530:490;47499:521::o;21117:87::-;21163:7;21190:6;;;;;;;;;;;21183:13;;21117:87;:::o;28175:104::-;28231:13;28264:7;28257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28175:104;:::o;29761:155::-;29856:52;29875:12;:10;:12::i;:::-;29889:8;29899;29856:18;:52::i;:::-;29761:155;;:::o;49248:227::-;49291:7;49441:25;:15;:23;:25::i;:::-;49434:32;;49248:227;:::o;49056:127::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49164:11:::1;49140:21;:35;;;;49056:127:::0;:::o;43034:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30812:279::-;30943:41;30962:12;:10;:12::i;:::-;30976:7;30943:18;:41::i;:::-;30935:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;31045:38;31059:4;31065:2;31069:7;31078:4;31045:13;:38::i;:::-;30812:279;;;;:::o;43682:45::-;;;;;;;;;;;;;:::o;44379:298::-;44452:13;44497:25;:15;:23;:25::i;:::-;44486:7;:36;;44478:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44602:1;44584:7;44578:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44620:7;44629:25;44646:7;44629:16;:25::i;:::-;44606:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44578:91;44571:98;;44379:298;;;:::o;49909:272::-;49975:7;50125:47;:37;:45;:47::i;:::-;50118:54;;49909:272;:::o;42547:30::-;;;;:::o;42883:36::-;;;;:::o;29987:164::-;30084:4;30108:18;:25;30127:5;30108:25;;;;;;;;;;;;;;;:35;30134:8;30108:35;;;;;;;;;;;;;;;;;;;;;;;;;30101:42;;29987:164;;;;:::o;49558:264::-;49620:7;49770:43;:33;:41;:43::i;:::-;49763:50;;49558:264;:::o;22201:201::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22310:1:::1;22290:22;;:8;:22;;::::0;22282:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22366:28;22385:8;22366:18;:28::i;:::-;22201:201:::0;:::o;21286:93::-;21335:7;21362:9;;;;;;;;;;;21355:16;;21286:93;:::o;51247:100::-;21523:12;:10;:12::i;:::-;21512:23;;:7;:5;:7::i;:::-;:23;;;21504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51333:5:::1;51320:10;:18;;;;51247:100:::0;:::o;42619:23::-;;;;:::o;25706:157::-;25791:4;25830:25;25815:40;;;:11;:40;;;;25808:47;;25706:157;;;:::o;38512:135::-;38594:16;38602:7;38594;:16::i;:::-;38586:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38512:135;:::o;19761:98::-;19814:7;19841:10;19834:17;;19761:98;:::o;37825:174::-;37927:2;37900:15;:24;37916:7;37900:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37983:7;37979:2;37945:46;;37954:23;37969:7;37954:14;:23::i;:::-;37945:46;;;;;;;;;;;;37825:174;;:::o;966:114::-;1031:7;1058;:14;;;1051:21;;966:114;;;:::o;1088:127::-;1195:1;1177:7;:14;;;:19;;;;;;;;;;;1088:127;:::o;33771:110::-;33847:26;33857:2;33861:7;33847:26;;;;;;;;;;;;:9;:26::i;:::-;33771:110;;:::o;33081:348::-;33174:4;33199:16;33207:7;33199;:16::i;:::-;33191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33275:13;33291:23;33306:7;33291:14;:23::i;:::-;33275:39;;33344:5;33333:16;;:7;:16;;;:52;;;;33353:32;33370:5;33377:7;33353:16;:32::i;:::-;33333:52;:87;;;;33413:7;33389:31;;:20;33401:7;33389:11;:20::i;:::-;:31;;;33333:87;33325:96;;;33081:348;;;;:::o;36921:785::-;37046:4;37019:31;;:23;37034:7;37019:14;:23::i;:::-;:31;;;37011:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37125:1;37111:16;;:2;:16;;;37103:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37181:42;37202:4;37208:2;37212:7;37221:1;37181:20;:42::i;:::-;37353:4;37326:31;;:23;37341:7;37326:14;:23::i;:::-;:31;;;37318:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37471:15;:24;37487:7;37471:24;;;;;;;;;;;;37464:31;;;;;;;;;;;37527:1;37508:9;:15;37518:4;37508:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37556:1;37539:9;:13;37549:2;37539:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37597:2;37578:7;:16;37586:7;37578:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37636:7;37632:2;37617:27;;37626:4;37617:27;;;;;;;;;;;;37657:41;37677:4;37683:2;37687:7;37696:1;37657:19;:41::i;:::-;36921:785;;;:::o;32356:117::-;32422:7;32449;:16;32457:7;32449:16;;;;;;;;;;;;;;;;;;;;;32442:23;;32356:117;;;:::o;2394:190::-;2519:4;2572;2543:25;2556:5;2563:4;2543:12;:25::i;:::-;:33;2536:40;;2394:190;;;;;:::o;22562:275::-;22636:17;22656:6;;;;;;;;;;;22636:26;;22685:9;22673;;:21;;;;;;;;;;;;;;;;;;22714:8;22705:6;;:17;;;;;;;;;;;;;;;;;;22757:15;22733:21;:39;;;;22820:8;22788:41;;22809:9;22788:41;;;;;;;;;;;;22625:212;22562:275;:::o;38142:281::-;38263:8;38254:17;;:5;:17;;;38246:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38350:8;38312:18;:25;38331:5;38312:25;;;;;;;;;;;;;;;:35;38338:8;38312:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38396:8;38374:41;;38389:5;38374:41;;;38406:8;38374:41;;;;;;:::i;:::-;;;;;;;;38142:281;;;:::o;31972:270::-;32085:28;32095:4;32101:2;32105:7;32085:9;:28::i;:::-;32132:47;32155:4;32161:2;32165:7;32174:4;32132:22;:47::i;:::-;32124:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31972:270;;;;:::o;23153:723::-;23209:13;23439:1;23430:5;:10;23426:53;;23457:10;;;;;;;;;;;;;;;;;;;;;23426:53;23489:12;23504:5;23489:20;;23520:14;23545:78;23560:1;23552:4;:9;23545:78;;23578:8;;;;;:::i;:::-;;;;23609:2;23601:10;;;;;:::i;:::-;;;23545:78;;;23633:19;23665:6;23655:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23633:39;;23683:154;23699:1;23690:5;:10;23683:154;;23727:1;23717:11;;;;;:::i;:::-;;;23794:2;23786:5;:10;;;;:::i;:::-;23773:2;:24;;;;:::i;:::-;23760:39;;23743:6;23750;23743:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23823:2;23814:11;;;;;:::i;:::-;;;23683:154;;;23861:6;23847:21;;;;;23153:723;;;;:::o;32786:128::-;32851:4;32904:1;32875:31;;:17;32884:7;32875:8;:17::i;:::-;:31;;;;32868:38;;32786:128;;;:::o;34108:285::-;34203:18;34209:2;34213:7;34203:5;:18::i;:::-;34254:53;34285:1;34289:2;34293:7;34302:4;34254:22;:53::i;:::-;34232:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34108:285;;;:::o;40796:116::-;;;;;:::o;41634:115::-;;;;;:::o;2946:701::-;3029:7;3049:20;3072:4;3049:27;;3092:9;3087:523;3111:5;:12;3107:1;:16;3087:523;;;3145:20;3168:5;3174:1;3168:8;;;;;;;;:::i;:::-;;;;;;;;3145:31;;3211:12;3195;:28;3191:408;;3365:12;3379;3348:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3338:55;;;;;;3323:70;;3191:408;;;3555:12;3569;3538:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3528:55;;;;;;3513:70;;3191:408;3130:480;3125:3;;;;;:::i;:::-;;;;3087:523;;;;3627:12;3620:19;;;2946:701;;;;:::o;39211:853::-;39365:4;39386:15;:2;:13;;;:15::i;:::-;39382:675;;;39438:2;39422:36;;;39459:12;:10;:12::i;:::-;39473:4;39479:7;39488:4;39422:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39418:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39680:1;39663:6;:13;:18;39659:328;;39706:60;;;;;;;;;;:::i;:::-;;;;;;;;39659:328;39937:6;39931:13;39922:6;39918:2;39914:15;39907:38;39418:584;39554:41;;;39544:51;;;:6;:51;;;;39537:58;;;;;39382:675;40041:4;40034:11;;39211:853;;;;;;;:::o;34729:942::-;34823:1;34809:16;;:2;:16;;;34801:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34882:16;34890:7;34882;:16::i;:::-;34881:17;34873:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34944:48;34973:1;34977:2;34981:7;34990:1;34944:20;:48::i;:::-;35091:16;35099:7;35091;:16::i;:::-;35090:17;35082:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35506:1;35489:9;:13;35499:2;35489:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;35550:2;35531:7;:16;35539:7;35531:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35595:7;35591:2;35570:33;;35587:1;35570:33;;;;;;;;;;;;35616:47;35644:1;35648:2;35652:7;35661:1;35616:19;:47::i;:::-;34729:942;;:::o;11751:387::-;11811:4;12019:12;12086:7;12074:20;12066:28;;12129:1;12122:4;:8;12115:15;;;11751:387;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5276:568;5349:8;5359:6;5409:3;5402:4;5394:6;5390:17;5386:27;5376:122;;5417:79;;:::i;:::-;5376:122;5530:6;5517:20;5507:30;;5560:18;5552:6;5549:30;5546:117;;;5582:79;;:::i;:::-;5546:117;5696:4;5688:6;5684:17;5672:29;;5750:3;5742:4;5734:6;5730:17;5720:8;5716:32;5713:41;5710:128;;;5757:79;;:::i;:::-;5710:128;5276:568;;;;;:::o;5850:559::-;5936:6;5944;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6147:1;6136:9;6132:17;6119:31;6177:18;6169:6;6166:30;6163:117;;;6199:79;;:::i;:::-;6163:117;6312:80;6384:7;6375:6;6364:9;6360:22;6312:80;:::i;:::-;6294:98;;;;6090:312;5850:559;;;;;:::o;6415:619::-;6492:6;6500;6508;6557:2;6545:9;6536:7;6532:23;6528:32;6525:119;;;6563:79;;:::i;:::-;6525:119;6683:1;6708:53;6753:7;6744:6;6733:9;6729:22;6708:53;:::i;:::-;6698:63;;6654:117;6810:2;6836:53;6881:7;6872:6;6861:9;6857:22;6836:53;:::i;:::-;6826:63;;6781:118;6938:2;6964:53;7009:7;7000:6;6989:9;6985:22;6964:53;:::i;:::-;6954:63;;6909:118;6415:619;;;;;:::o;7040:77::-;7077:7;7106:5;7095:16;;7040:77;;;:::o;7123:118::-;7210:24;7228:5;7210:24;:::i;:::-;7205:3;7198:37;7123:118;;:::o;7247:222::-;7340:4;7378:2;7367:9;7363:18;7355:26;;7391:71;7459:1;7448:9;7444:17;7435:6;7391:71;:::i;:::-;7247:222;;;;:::o;7475:118::-;7562:24;7580:5;7562:24;:::i;:::-;7557:3;7550:37;7475:118;;:::o;7599:222::-;7692:4;7730:2;7719:9;7715:18;7707:26;;7743:71;7811:1;7800:9;7796:17;7787:6;7743:71;:::i;:::-;7599:222;;;;:::o;7827:122::-;7900:24;7918:5;7900:24;:::i;:::-;7893:5;7890:35;7880:63;;7939:1;7936;7929:12;7880:63;7827:122;:::o;7955:139::-;8001:5;8039:6;8026:20;8017:29;;8055:33;8082:5;8055:33;:::i;:::-;7955:139;;;;:::o;8100:329::-;8159:6;8208:2;8196:9;8187:7;8183:23;8179:32;8176:119;;;8214:79;;:::i;:::-;8176:119;8334:1;8359:53;8404:7;8395:6;8384:9;8380:22;8359:53;:::i;:::-;8349:63;;8305:117;8100:329;;;;:::o;8435:117::-;8544:1;8541;8534:12;8558:180;8606:77;8603:1;8596:88;8703:4;8700:1;8693:15;8727:4;8724:1;8717:15;8744:281;8827:27;8849:4;8827:27;:::i;:::-;8819:6;8815:40;8957:6;8945:10;8942:22;8921:18;8909:10;8906:34;8903:62;8900:88;;;8968:18;;:::i;:::-;8900:88;9008:10;9004:2;8997:22;8787:238;8744:281;;:::o;9031:129::-;9065:6;9092:20;;:::i;:::-;9082:30;;9121:33;9149:4;9141:6;9121:33;:::i;:::-;9031:129;;;:::o;9166:308::-;9228:4;9318:18;9310:6;9307:30;9304:56;;;9340:18;;:::i;:::-;9304:56;9378:29;9400:6;9378:29;:::i;:::-;9370:37;;9462:4;9456;9452:15;9444:23;;9166:308;;;:::o;9480:146::-;9577:6;9572:3;9567;9554:30;9618:1;9609:6;9604:3;9600:16;9593:27;9480:146;;;:::o;9632:425::-;9710:5;9735:66;9751:49;9793:6;9751:49;:::i;:::-;9735:66;:::i;:::-;9726:75;;9824:6;9817:5;9810:21;9862:4;9855:5;9851:16;9900:3;9891:6;9886:3;9882:16;9879:25;9876:112;;;9907:79;;:::i;:::-;9876:112;9997:54;10044:6;10039:3;10034;9997:54;:::i;:::-;9716:341;9632:425;;;;;:::o;10077:340::-;10133:5;10182:3;10175:4;10167:6;10163:17;10159:27;10149:122;;10190:79;;:::i;:::-;10149:122;10307:6;10294:20;10332:79;10407:3;10399:6;10392:4;10384:6;10380:17;10332:79;:::i;:::-;10323:88;;10139:278;10077:340;;;;:::o;10423:509::-;10492:6;10541:2;10529:9;10520:7;10516:23;10512:32;10509:119;;;10547:79;;:::i;:::-;10509:119;10695:1;10684:9;10680:17;10667:31;10725:18;10717:6;10714:30;10711:117;;;10747:79;;:::i;:::-;10711:117;10852:63;10907:7;10898:6;10887:9;10883:22;10852:63;:::i;:::-;10842:73;;10638:287;10423:509;;;;:::o;10955:568::-;11028:8;11038:6;11088:3;11081:4;11073:6;11069:17;11065:27;11055:122;;11096:79;;:::i;:::-;11055:122;11209:6;11196:20;11186:30;;11239:18;11231:6;11228:30;11225:117;;;11261:79;;:::i;:::-;11225:117;11375:4;11367:6;11363:17;11351:29;;11429:3;11421:4;11413:6;11409:17;11399:8;11395:32;11392:41;11389:128;;;11436:79;;:::i;:::-;11389:128;10955:568;;;;;:::o;11529:559::-;11615:6;11623;11672:2;11660:9;11651:7;11647:23;11643:32;11640:119;;;11678:79;;:::i;:::-;11640:119;11826:1;11815:9;11811:17;11798:31;11856:18;11848:6;11845:30;11842:117;;;11878:79;;:::i;:::-;11842:117;11991:80;12063:7;12054:6;12043:9;12039:22;11991:80;:::i;:::-;11973:98;;;;11769:312;11529:559;;;;;:::o;12094:329::-;12153:6;12202:2;12190:9;12181:7;12177:23;12173:32;12170:119;;;12208:79;;:::i;:::-;12170:119;12328:1;12353:53;12398:7;12389:6;12378:9;12374:22;12353:53;:::i;:::-;12343:63;;12299:117;12094:329;;;;:::o;12429:116::-;12499:21;12514:5;12499:21;:::i;:::-;12492:5;12489:32;12479:60;;12535:1;12532;12525:12;12479:60;12429:116;:::o;12551:133::-;12594:5;12632:6;12619:20;12610:29;;12648:30;12672:5;12648:30;:::i;:::-;12551:133;;;;:::o;12690:468::-;12755:6;12763;12812:2;12800:9;12791:7;12787:23;12783:32;12780:119;;;12818:79;;:::i;:::-;12780:119;12938:1;12963:53;13008:7;12999:6;12988:9;12984:22;12963:53;:::i;:::-;12953:63;;12909:117;13065:2;13091:50;13133:7;13124:6;13113:9;13109:22;13091:50;:::i;:::-;13081:60;;13036:115;12690:468;;;;;:::o;13164:307::-;13225:4;13315:18;13307:6;13304:30;13301:56;;;13337:18;;:::i;:::-;13301:56;13375:29;13397:6;13375:29;:::i;:::-;13367:37;;13459:4;13453;13449:15;13441:23;;13164:307;;;:::o;13477:423::-;13554:5;13579:65;13595:48;13636:6;13595:48;:::i;:::-;13579:65;:::i;:::-;13570:74;;13667:6;13660:5;13653:21;13705:4;13698:5;13694:16;13743:3;13734:6;13729:3;13725:16;13722:25;13719:112;;;13750:79;;:::i;:::-;13719:112;13840:54;13887:6;13882:3;13877;13840:54;:::i;:::-;13560:340;13477:423;;;;;:::o;13919:338::-;13974:5;14023:3;14016:4;14008:6;14004:17;14000:27;13990:122;;14031:79;;:::i;:::-;13990:122;14148:6;14135:20;14173:78;14247:3;14239:6;14232:4;14224:6;14220:17;14173:78;:::i;:::-;14164:87;;13980:277;13919:338;;;;:::o;14263:943::-;14358:6;14366;14374;14382;14431:3;14419:9;14410:7;14406:23;14402:33;14399:120;;;14438:79;;:::i;:::-;14399:120;14558:1;14583:53;14628:7;14619:6;14608:9;14604:22;14583:53;:::i;:::-;14573:63;;14529:117;14685:2;14711:53;14756:7;14747:6;14736:9;14732:22;14711:53;:::i;:::-;14701:63;;14656:118;14813:2;14839:53;14884:7;14875:6;14864:9;14860:22;14839:53;:::i;:::-;14829:63;;14784:118;14969:2;14958:9;14954:18;14941:32;15000:18;14992:6;14989:30;14986:117;;;15022:79;;:::i;:::-;14986:117;15127:62;15181:7;15172:6;15161:9;15157:22;15127:62;:::i;:::-;15117:72;;14912:287;14263:943;;;;;;;:::o;15212:180::-;15260:77;15257:1;15250:88;15357:4;15354:1;15347:15;15381:4;15378:1;15371:15;15398:119;15485:1;15478:5;15475:12;15465:46;;15491:18;;:::i;:::-;15465:46;15398:119;:::o;15523:139::-;15574:7;15603:5;15592:16;;15609:47;15650:5;15609:47;:::i;:::-;15523:139;;;:::o;15668:::-;15730:9;15763:38;15795:5;15763:38;:::i;:::-;15750:51;;15668:139;;;:::o;15813:155::-;15912:49;15955:5;15912:49;:::i;:::-;15907:3;15900:62;15813:155;;:::o;15974:246::-;16079:4;16117:2;16106:9;16102:18;16094:26;;16130:83;16210:1;16199:9;16195:17;16186:6;16130:83;:::i;:::-;15974:246;;;;:::o;16226:474::-;16294:6;16302;16351:2;16339:9;16330:7;16326:23;16322:32;16319:119;;;16357:79;;:::i;:::-;16319:119;16477:1;16502:53;16547:7;16538:6;16527:9;16523:22;16502:53;:::i;:::-;16492:63;;16448:117;16604:2;16630:53;16675:7;16666:6;16655:9;16651:22;16630:53;:::i;:::-;16620:63;;16575:118;16226:474;;;;;:::o;16706:180::-;16754:77;16751:1;16744:88;16851:4;16848:1;16841:15;16875:4;16872:1;16865:15;16892:320;16936:6;16973:1;16967:4;16963:12;16953:22;;17020:1;17014:4;17010:12;17041:18;17031:81;;17097:4;17089:6;17085:17;17075:27;;17031:81;17159:2;17151:6;17148:14;17128:18;17125:38;17122:84;;17178:18;;:::i;:::-;17122:84;16943:269;16892:320;;;:::o;17218:220::-;17358:34;17354:1;17346:6;17342:14;17335:58;17427:3;17422:2;17414:6;17410:15;17403:28;17218:220;:::o;17444:366::-;17586:3;17607:67;17671:2;17666:3;17607:67;:::i;:::-;17600:74;;17683:93;17772:3;17683:93;:::i;:::-;17801:2;17796:3;17792:12;17785:19;;17444:366;;;:::o;17816:419::-;17982:4;18020:2;18009:9;18005:18;17997:26;;18069:9;18063:4;18059:20;18055:1;18044:9;18040:17;18033:47;18097:131;18223:4;18097:131;:::i;:::-;18089:139;;17816:419;;;:::o;18241:248::-;18381:34;18377:1;18369:6;18365:14;18358:58;18450:31;18445:2;18437:6;18433:15;18426:56;18241:248;:::o;18495:366::-;18637:3;18658:67;18722:2;18717:3;18658:67;:::i;:::-;18651:74;;18734:93;18823:3;18734:93;:::i;:::-;18852:2;18847:3;18843:12;18836:19;;18495:366;;;:::o;18867:419::-;19033:4;19071:2;19060:9;19056:18;19048:26;;19120:9;19114:4;19110:20;19106:1;19095:9;19091:17;19084:47;19148:131;19274:4;19148:131;:::i;:::-;19140:139;;18867:419;;;:::o;19292:182::-;19432:34;19428:1;19420:6;19416:14;19409:58;19292:182;:::o;19480:366::-;19622:3;19643:67;19707:2;19702:3;19643:67;:::i;:::-;19636:74;;19719:93;19808:3;19719:93;:::i;:::-;19837:2;19832:3;19828:12;19821:19;;19480:366;;;:::o;19852:419::-;20018:4;20056:2;20045:9;20041:18;20033:26;;20105:9;20099:4;20095:20;20091:1;20080:9;20076:17;20069:47;20133:131;20259:4;20133:131;:::i;:::-;20125:139;;19852:419;;;:::o;20277:164::-;20417:16;20413:1;20405:6;20401:14;20394:40;20277:164;:::o;20447:366::-;20589:3;20610:67;20674:2;20669:3;20610:67;:::i;:::-;20603:74;;20686:93;20775:3;20686:93;:::i;:::-;20804:2;20799:3;20795:12;20788:19;;20447:366;;;:::o;20819:419::-;20985:4;21023:2;21012:9;21008:18;21000:26;;21072:9;21066:4;21062:20;21058:1;21047:9;21043:17;21036:47;21100:131;21226:4;21100:131;:::i;:::-;21092:139;;20819:419;;;:::o;21244:180::-;21384:32;21380:1;21372:6;21368:14;21361:56;21244:180;:::o;21430:366::-;21572:3;21593:67;21657:2;21652:3;21593:67;:::i;:::-;21586:74;;21669:93;21758:3;21669:93;:::i;:::-;21787:2;21782:3;21778:12;21771:19;;21430:366;;;:::o;21802:419::-;21968:4;22006:2;21995:9;21991:18;21983:26;;22055:9;22049:4;22045:20;22041:1;22030:9;22026:17;22019:47;22083:131;22209:4;22083:131;:::i;:::-;22075:139;;21802:419;;;:::o;22227:180::-;22275:77;22272:1;22265:88;22372:4;22369:1;22362:15;22396:4;22393:1;22386:15;22413:232;22553:34;22549:1;22541:6;22537:14;22530:58;22622:15;22617:2;22609:6;22605:15;22598:40;22413:232;:::o;22651:366::-;22793:3;22814:67;22878:2;22873:3;22814:67;:::i;:::-;22807:74;;22890:93;22979:3;22890:93;:::i;:::-;23008:2;23003:3;22999:12;22992:19;;22651:366;;;:::o;23023:419::-;23189:4;23227:2;23216:9;23212:18;23204:26;;23276:9;23270:4;23266:20;23262:1;23251:9;23247:17;23240:47;23304:131;23430:4;23304:131;:::i;:::-;23296:139;;23023:419;;;:::o;23448:180::-;23496:77;23493:1;23486:88;23593:4;23590:1;23583:15;23617:4;23614:1;23607:15;23634:191;23674:3;23693:20;23711:1;23693:20;:::i;:::-;23688:25;;23727:20;23745:1;23727:20;:::i;:::-;23722:25;;23770:1;23767;23763:9;23756:16;;23791:3;23788:1;23785:10;23782:36;;;23798:18;;:::i;:::-;23782:36;23634:191;;;;:::o;23831:141::-;23880:4;23903:3;23895:11;;23926:3;23923:1;23916:14;23960:4;23957:1;23947:18;23939:26;;23831:141;;;:::o;23978:93::-;24015:6;24062:2;24057;24050:5;24046:14;24042:23;24032:33;;23978:93;;;:::o;24077:107::-;24121:8;24171:5;24165:4;24161:16;24140:37;;24077:107;;;;:::o;24190:393::-;24259:6;24309:1;24297:10;24293:18;24332:97;24362:66;24351:9;24332:97;:::i;:::-;24450:39;24480:8;24469:9;24450:39;:::i;:::-;24438:51;;24522:4;24518:9;24511:5;24507:21;24498:30;;24571:4;24561:8;24557:19;24550:5;24547:30;24537:40;;24266:317;;24190:393;;;;;:::o;24589:60::-;24617:3;24638:5;24631:12;;24589:60;;;:::o;24655:142::-;24705:9;24738:53;24756:34;24765:24;24783:5;24765:24;:::i;:::-;24756:34;:::i;:::-;24738:53;:::i;:::-;24725:66;;24655:142;;;:::o;24803:75::-;24846:3;24867:5;24860:12;;24803:75;;;:::o;24884:269::-;24994:39;25025:7;24994:39;:::i;:::-;25055:91;25104:41;25128:16;25104:41;:::i;:::-;25096:6;25089:4;25083:11;25055:91;:::i;:::-;25049:4;25042:105;24960:193;24884:269;;;:::o;25159:73::-;25204:3;25159:73;:::o;25238:189::-;25315:32;;:::i;:::-;25356:65;25414:6;25406;25400:4;25356:65;:::i;:::-;25291:136;25238:189;;:::o;25433:186::-;25493:120;25510:3;25503:5;25500:14;25493:120;;;25564:39;25601:1;25594:5;25564:39;:::i;:::-;25537:1;25530:5;25526:13;25517:22;;25493:120;;;25433:186;;:::o;25625:543::-;25726:2;25721:3;25718:11;25715:446;;;25760:38;25792:5;25760:38;:::i;:::-;25844:29;25862:10;25844:29;:::i;:::-;25834:8;25830:44;26027:2;26015:10;26012:18;26009:49;;;26048:8;26033:23;;26009:49;26071:80;26127:22;26145:3;26127:22;:::i;:::-;26117:8;26113:37;26100:11;26071:80;:::i;:::-;25730:431;;25715:446;25625:543;;;:::o;26174:117::-;26228:8;26278:5;26272:4;26268:16;26247:37;;26174:117;;;;:::o;26297:169::-;26341:6;26374:51;26422:1;26418:6;26410:5;26407:1;26403:13;26374:51;:::i;:::-;26370:56;26455:4;26449;26445:15;26435:25;;26348:118;26297:169;;;;:::o;26471:295::-;26547:4;26693:29;26718:3;26712:4;26693:29;:::i;:::-;26685:37;;26755:3;26752:1;26748:11;26742:4;26739:21;26731:29;;26471:295;;;;:::o;26771:1395::-;26888:37;26921:3;26888:37;:::i;:::-;26990:18;26982:6;26979:30;26976:56;;;27012:18;;:::i;:::-;26976:56;27056:38;27088:4;27082:11;27056:38;:::i;:::-;27141:67;27201:6;27193;27187:4;27141:67;:::i;:::-;27235:1;27259:4;27246:17;;27291:2;27283:6;27280:14;27308:1;27303:618;;;;27965:1;27982:6;27979:77;;;28031:9;28026:3;28022:19;28016:26;28007:35;;27979:77;28082:67;28142:6;28135:5;28082:67;:::i;:::-;28076:4;28069:81;27938:222;27273:887;;27303:618;27355:4;27351:9;27343:6;27339:22;27389:37;27421:4;27389:37;:::i;:::-;27448:1;27462:208;27476:7;27473:1;27470:14;27462:208;;;27555:9;27550:3;27546:19;27540:26;27532:6;27525:42;27606:1;27598:6;27594:14;27584:24;;27653:2;27642:9;27638:18;27625:31;;27499:4;27496:1;27492:12;27487:17;;27462:208;;;27698:6;27689:7;27686:19;27683:179;;;27756:9;27751:3;27747:19;27741:26;27799:48;27841:4;27833:6;27829:17;27818:9;27799:48;:::i;:::-;27791:6;27784:64;27706:156;27683:179;27908:1;27904;27896:6;27892:14;27888:22;27882:4;27875:36;27310:611;;;27273:887;;26863:1303;;;26771:1395;;:::o;28172:174::-;28312:26;28308:1;28300:6;28296:14;28289:50;28172:174;:::o;28352:366::-;28494:3;28515:67;28579:2;28574:3;28515:67;:::i;:::-;28508:74;;28591:93;28680:3;28591:93;:::i;:::-;28709:2;28704:3;28700:12;28693:19;;28352:366;;;:::o;28724:419::-;28890:4;28928:2;28917:9;28913:18;28905:26;;28977:9;28971:4;28967:20;28963:1;28952:9;28948:17;28941:47;29005:131;29131:4;29005:131;:::i;:::-;28997:139;;28724:419;;;:::o;29149:181::-;29289:33;29285:1;29277:6;29273:14;29266:57;29149:181;:::o;29336:366::-;29478:3;29499:67;29563:2;29558:3;29499:67;:::i;:::-;29492:74;;29575:93;29664:3;29575:93;:::i;:::-;29693:2;29688:3;29684:12;29677:19;;29336:366;;;:::o;29708:419::-;29874:4;29912:2;29901:9;29897:18;29889:26;;29961:9;29955:4;29951:20;29947:1;29936:9;29932:17;29925:47;29989:131;30115:4;29989:131;:::i;:::-;29981:139;;29708:419;;;:::o;30133:167::-;30273:19;30269:1;30261:6;30257:14;30250:43;30133:167;:::o;30306:366::-;30448:3;30469:67;30533:2;30528:3;30469:67;:::i;:::-;30462:74;;30545:93;30634:3;30545:93;:::i;:::-;30663:2;30658:3;30654:12;30647:19;;30306:366;;;:::o;30678:419::-;30844:4;30882:2;30871:9;30867:18;30859:26;;30931:9;30925:4;30921:20;30917:1;30906:9;30902:17;30895:47;30959:131;31085:4;30959:131;:::i;:::-;30951:139;;30678:419;;;:::o;31103:94::-;31136:8;31184:5;31180:2;31176:14;31155:35;;31103:94;;;:::o;31203:::-;31242:7;31271:20;31285:5;31271:20;:::i;:::-;31260:31;;31203:94;;;:::o;31303:100::-;31342:7;31371:26;31391:5;31371:26;:::i;:::-;31360:37;;31303:100;;;:::o;31409:157::-;31514:45;31534:24;31552:5;31534:24;:::i;:::-;31514:45;:::i;:::-;31509:3;31502:58;31409:157;;:::o;31572:256::-;31684:3;31699:75;31770:3;31761:6;31699:75;:::i;:::-;31799:2;31794:3;31790:12;31783:19;;31819:3;31812:10;;31572:256;;;;:::o;31834:225::-;31974:34;31970:1;31962:6;31958:14;31951:58;32043:8;32038:2;32030:6;32026:15;32019:33;31834:225;:::o;32065:366::-;32207:3;32228:67;32292:2;32287:3;32228:67;:::i;:::-;32221:74;;32304:93;32393:3;32304:93;:::i;:::-;32422:2;32417:3;32413:12;32406:19;;32065:366;;;:::o;32437:419::-;32603:4;32641:2;32630:9;32626:18;32618:26;;32690:9;32684:4;32680:20;32676:1;32665:9;32661:17;32654:47;32718:131;32844:4;32718:131;:::i;:::-;32710:139;;32437:419;;;:::o;32862:178::-;33002:30;32998:1;32990:6;32986:14;32979:54;32862:178;:::o;33046:366::-;33188:3;33209:67;33273:2;33268:3;33209:67;:::i;:::-;33202:74;;33285:93;33374:3;33285:93;:::i;:::-;33403:2;33398:3;33394:12;33387:19;;33046:366;;;:::o;33418:419::-;33584:4;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33418:419;;;:::o;33843:229::-;33983:34;33979:1;33971:6;33967:14;33960:58;34052:12;34047:2;34039:6;34035:15;34028:37;33843:229;:::o;34078:366::-;34220:3;34241:67;34305:2;34300:3;34241:67;:::i;:::-;34234:74;;34317:93;34406:3;34317:93;:::i;:::-;34435:2;34430:3;34426:12;34419:19;;34078:366;;;:::o;34450:419::-;34616:4;34654:2;34643:9;34639:18;34631:26;;34703:9;34697:4;34693:20;34689:1;34678:9;34674:17;34667:47;34731:131;34857:4;34731:131;:::i;:::-;34723:139;;34450:419;;;:::o;34875:194::-;34915:4;34935:20;34953:1;34935:20;:::i;:::-;34930:25;;34969:20;34987:1;34969:20;:::i;:::-;34964:25;;35013:1;35010;35006:9;34998:17;;35037:1;35031:4;35028:11;35025:37;;;35042:18;;:::i;:::-;35025:37;34875:194;;;;:::o;35075:178::-;35215:30;35211:1;35203:6;35199:14;35192:54;35075:178;:::o;35259:366::-;35401:3;35422:67;35486:2;35481:3;35422:67;:::i;:::-;35415:74;;35498:93;35587:3;35498:93;:::i;:::-;35616:2;35611:3;35607:12;35600:19;;35259:366;;;:::o;35631:419::-;35797:4;35835:2;35824:9;35820:18;35812:26;;35884:9;35878:4;35874:20;35870:1;35859:9;35855:17;35848:47;35912:131;36038:4;35912:131;:::i;:::-;35904:139;;35631:419;;;:::o;36056:163::-;36196:15;36192:1;36184:6;36180:14;36173:39;36056:163;:::o;36225:366::-;36367:3;36388:67;36452:2;36447:3;36388:67;:::i;:::-;36381:74;;36464:93;36553:3;36464:93;:::i;:::-;36582:2;36577:3;36573:12;36566:19;;36225:366;;;:::o;36597:419::-;36763:4;36801:2;36790:9;36786:18;36778:26;;36850:9;36844:4;36840:20;36836:1;36825:9;36821:17;36814:47;36878:131;37004:4;36878:131;:::i;:::-;36870:139;;36597:419;;;:::o;37022:228::-;37162:34;37158:1;37150:6;37146:14;37139:58;37231:11;37226:2;37218:6;37214:15;37207:36;37022:228;:::o;37256:366::-;37398:3;37419:67;37483:2;37478:3;37419:67;:::i;:::-;37412:74;;37495:93;37584:3;37495:93;:::i;:::-;37613:2;37608:3;37604:12;37597:19;;37256:366;;;:::o;37628:419::-;37794:4;37832:2;37821:9;37817:18;37809:26;;37881:9;37875:4;37871:20;37867:1;37856:9;37852:17;37845:47;37909:131;38035:4;37909:131;:::i;:::-;37901:139;;37628:419;;;:::o;38053:170::-;38193:22;38189:1;38181:6;38177:14;38170:46;38053:170;:::o;38229:366::-;38371:3;38392:67;38456:2;38451:3;38392:67;:::i;:::-;38385:74;;38468:93;38557:3;38468:93;:::i;:::-;38586:2;38581:3;38577:12;38570:19;;38229:366;;;:::o;38601:419::-;38767:4;38805:2;38794:9;38790:18;38782:26;;38854:9;38848:4;38844:20;38840:1;38829:9;38825:17;38818:47;38882:131;39008:4;38882:131;:::i;:::-;38874:139;;38601:419;;;:::o;39026:221::-;39166:34;39162:1;39154:6;39150:14;39143:58;39235:4;39230:2;39222:6;39218:15;39211:29;39026:221;:::o;39253:366::-;39395:3;39416:67;39480:2;39475:3;39416:67;:::i;:::-;39409:74;;39492:93;39581:3;39492:93;:::i;:::-;39610:2;39605:3;39601:12;39594:19;;39253:366;;;:::o;39625:419::-;39791:4;39829:2;39818:9;39814:18;39806:26;;39878:9;39872:4;39868:20;39864:1;39853:9;39849:17;39842:47;39906:131;40032:4;39906:131;:::i;:::-;39898:139;;39625:419;;;:::o;40050:181::-;40190:33;40186:1;40178:6;40174:14;40167:57;40050:181;:::o;40237:366::-;40379:3;40400:67;40464:2;40459:3;40400:67;:::i;:::-;40393:74;;40476:93;40565:3;40476:93;:::i;:::-;40594:2;40589:3;40585:12;40578:19;;40237:366;;;:::o;40609:419::-;40775:4;40813:2;40802:9;40798:18;40790:26;;40862:9;40856:4;40852:20;40848:1;40837:9;40833:17;40826:47;40890:131;41016:4;40890:131;:::i;:::-;40882:139;;40609:419;;;:::o;41034:148::-;41136:11;41173:3;41158:18;;41034:148;;;;:::o;41212:874::-;41315:3;41352:5;41346:12;41381:36;41407:9;41381:36;:::i;:::-;41433:89;41515:6;41510:3;41433:89;:::i;:::-;41426:96;;41553:1;41542:9;41538:17;41569:1;41564:166;;;;41744:1;41739:341;;;;41531:549;;41564:166;41648:4;41644:9;41633;41629:25;41624:3;41617:38;41710:6;41703:14;41696:22;41688:6;41684:35;41679:3;41675:45;41668:52;;41564:166;;41739:341;41806:38;41838:5;41806:38;:::i;:::-;41866:1;41880:154;41894:6;41891:1;41888:13;41880:154;;;41968:7;41962:14;41958:1;41953:3;41949:11;41942:35;42018:1;42009:7;42005:15;41994:26;;41916:4;41913:1;41909:12;41904:17;;41880:154;;;42063:6;42058:3;42054:16;42047:23;;41746:334;;41531:549;;41319:767;;41212:874;;;;:::o;42092:390::-;42198:3;42226:39;42259:5;42226:39;:::i;:::-;42281:89;42363:6;42358:3;42281:89;:::i;:::-;42274:96;;42379:65;42437:6;42432:3;42425:4;42418:5;42414:16;42379:65;:::i;:::-;42469:6;42464:3;42460:16;42453:23;;42202:280;42092:390;;;;:::o;42488:182::-;42656:7;42651:3;42644:20;42488:182;:::o;42676:693::-;42943:3;42965:92;43053:3;43044:6;42965:92;:::i;:::-;42958:99;;43074:95;43165:3;43156:6;43074:95;:::i;:::-;43067:102;;43179:137;43312:3;43179:137;:::i;:::-;43341:1;43336:3;43332:11;43325:18;;43360:3;43353:10;;42676:693;;;;;:::o;43375:225::-;43515:34;43511:1;43503:6;43499:14;43492:58;43584:8;43579:2;43571:6;43567:15;43560:33;43375:225;:::o;43606:366::-;43748:3;43769:67;43833:2;43828:3;43769:67;:::i;:::-;43762:74;;43845:93;43934:3;43845:93;:::i;:::-;43963:2;43958:3;43954:12;43947:19;;43606:366;;;:::o;43978:419::-;44144:4;44182:2;44171:9;44167:18;44159:26;;44231:9;44225:4;44221:20;44217:1;44206:9;44202:17;44195:47;44259:131;44385:4;44259:131;:::i;:::-;44251:139;;43978:419;;;:::o;44403:231::-;44543:34;44539:1;44531:6;44527:14;44520:58;44612:14;44607:2;44599:6;44595:15;44588:39;44403:231;:::o;44640:366::-;44782:3;44803:67;44867:2;44862:3;44803:67;:::i;:::-;44796:74;;44879:93;44968:3;44879:93;:::i;:::-;44997:2;44992:3;44988:12;44981:19;;44640:366;;;:::o;45012:419::-;45178:4;45216:2;45205:9;45201:18;45193:26;;45265:9;45259:4;45255:20;45251:1;45240:9;45236:17;45229:47;45293:131;45419:4;45293:131;:::i;:::-;45285:139;;45012:419;;;:::o;45437:224::-;45577:34;45573:1;45565:6;45561:14;45554:58;45646:7;45641:2;45633:6;45629:15;45622:32;45437:224;:::o;45667:366::-;45809:3;45830:67;45894:2;45889:3;45830:67;:::i;:::-;45823:74;;45906:93;45995:3;45906:93;:::i;:::-;46024:2;46019:3;46015:12;46008:19;;45667:366;;;:::o;46039:419::-;46205:4;46243:2;46232:9;46228:18;46220:26;;46292:9;46286:4;46282:20;46278:1;46267:9;46263:17;46256:47;46320:131;46446:4;46320:131;:::i;:::-;46312:139;;46039:419;;;:::o;46464:223::-;46604:34;46600:1;46592:6;46588:14;46581:58;46673:6;46668:2;46660:6;46656:15;46649:31;46464:223;:::o;46693:366::-;46835:3;46856:67;46920:2;46915:3;46856:67;:::i;:::-;46849:74;;46932:93;47021:3;46932:93;:::i;:::-;47050:2;47045:3;47041:12;47034:19;;46693:366;;;:::o;47065:419::-;47231:4;47269:2;47258:9;47254:18;47246:26;;47318:9;47312:4;47308:20;47304:1;47293:9;47289:17;47282:47;47346:131;47472:4;47346:131;:::i;:::-;47338:139;;47065:419;;;:::o;47490:175::-;47630:27;47626:1;47618:6;47614:14;47607:51;47490:175;:::o;47671:366::-;47813:3;47834:67;47898:2;47893:3;47834:67;:::i;:::-;47827:74;;47910:93;47999:3;47910:93;:::i;:::-;48028:2;48023:3;48019:12;48012:19;;47671:366;;;:::o;48043:419::-;48209:4;48247:2;48236:9;48232:18;48224:26;;48296:9;48290:4;48286:20;48282:1;48271:9;48267:17;48260:47;48324:131;48450:4;48324:131;:::i;:::-;48316:139;;48043:419;;;:::o;48468:237::-;48608:34;48604:1;48596:6;48592:14;48585:58;48677:20;48672:2;48664:6;48660:15;48653:45;48468:237;:::o;48711:366::-;48853:3;48874:67;48938:2;48933:3;48874:67;:::i;:::-;48867:74;;48950:93;49039:3;48950:93;:::i;:::-;49068:2;49063:3;49059:12;49052:19;;48711:366;;;:::o;49083:419::-;49249:4;49287:2;49276:9;49272:18;49264:26;;49336:9;49330:4;49326:20;49322:1;49311:9;49307:17;49300:47;49364:131;49490:4;49364:131;:::i;:::-;49356:139;;49083:419;;;:::o;49508:233::-;49547:3;49570:24;49588:5;49570:24;:::i;:::-;49561:33;;49616:66;49609:5;49606:77;49603:103;;49686:18;;:::i;:::-;49603:103;49733:1;49726:5;49722:13;49715:20;;49508:233;;;:::o;49747:180::-;49795:77;49792:1;49785:88;49892:4;49889:1;49882:15;49916:4;49913:1;49906:15;49933:185;49973:1;49990:20;50008:1;49990:20;:::i;:::-;49985:25;;50024:20;50042:1;50024:20;:::i;:::-;50019:25;;50063:1;50053:35;;50068:18;;:::i;:::-;50053:35;50110:1;50107;50103:9;50098:14;;49933:185;;;;:::o;50124:176::-;50156:1;50173:20;50191:1;50173:20;:::i;:::-;50168:25;;50207:20;50225:1;50207:20;:::i;:::-;50202:25;;50246:1;50236:35;;50251:18;;:::i;:::-;50236:35;50292:1;50289;50285:9;50280:14;;50124:176;;;;:::o;50306:79::-;50345:7;50374:5;50363:16;;50306:79;;;:::o;50391:157::-;50496:45;50516:24;50534:5;50516:24;:::i;:::-;50496:45;:::i;:::-;50491:3;50484:58;50391:157;;:::o;50554:397::-;50694:3;50709:75;50780:3;50771:6;50709:75;:::i;:::-;50809:2;50804:3;50800:12;50793:19;;50822:75;50893:3;50884:6;50822:75;:::i;:::-;50922:2;50917:3;50913:12;50906:19;;50942:3;50935:10;;50554:397;;;;;:::o;50957:98::-;51008:6;51042:5;51036:12;51026:22;;50957:98;;;:::o;51061:168::-;51144:11;51178:6;51173:3;51166:19;51218:4;51213:3;51209:14;51194:29;;51061:168;;;;:::o;51235:373::-;51321:3;51349:38;51381:5;51349:38;:::i;:::-;51403:70;51466:6;51461:3;51403:70;:::i;:::-;51396:77;;51482:65;51540:6;51535:3;51528:4;51521:5;51517:16;51482:65;:::i;:::-;51572:29;51594:6;51572:29;:::i;:::-;51567:3;51563:39;51556:46;;51325:283;51235:373;;;;:::o;51614:640::-;51809:4;51847:3;51836:9;51832:19;51824:27;;51861:71;51929:1;51918:9;51914:17;51905:6;51861:71;:::i;:::-;51942:72;52010:2;51999:9;51995:18;51986:6;51942:72;:::i;:::-;52024;52092:2;52081:9;52077:18;52068:6;52024:72;:::i;:::-;52143:9;52137:4;52133:20;52128:2;52117:9;52113:18;52106:48;52171:76;52242:4;52233:6;52171:76;:::i;:::-;52163:84;;51614:640;;;;;;;:::o;52260:141::-;52316:5;52347:6;52341:13;52332:22;;52363:32;52389:5;52363:32;:::i;:::-;52260:141;;;;:::o;52407:349::-;52476:6;52525:2;52513:9;52504:7;52500:23;52496:32;52493:119;;;52531:79;;:::i;:::-;52493:119;52651:1;52676:63;52731:7;52722:6;52711:9;52707:22;52676:63;:::i;:::-;52666:73;;52622:127;52407:349;;;;:::o;52762:182::-;52902:34;52898:1;52890:6;52886:14;52879:58;52762:182;:::o;52950:366::-;53092:3;53113:67;53177:2;53172:3;53113:67;:::i;:::-;53106:74;;53189:93;53278:3;53189:93;:::i;:::-;53307:2;53302:3;53298:12;53291:19;;52950:366;;;:::o;53322:419::-;53488:4;53526:2;53515:9;53511:18;53503:26;;53575:9;53569:4;53565:20;53561:1;53550:9;53546:17;53539:47;53603:131;53729:4;53603:131;:::i;:::-;53595:139;;53322:419;;;:::o;53747:178::-;53887:30;53883:1;53875:6;53871:14;53864:54;53747:178;:::o;53931:366::-;54073:3;54094:67;54158:2;54153:3;54094:67;:::i;:::-;54087:74;;54170:93;54259:3;54170:93;:::i;:::-;54288:2;54283:3;54279:12;54272:19;;53931:366;;;:::o;54303:419::-;54469:4;54507:2;54496:9;54492:18;54484:26;;54556:9;54550:4;54546:20;54542:1;54531:9;54527:17;54520:47;54584:131;54710:4;54584:131;:::i;:::-;54576:139;;54303:419;;;:::o

Swarm Source

ipfs://674491dc654e809cfa3fb4bd52d5df17730a8ad1fde0c9e4b8222efc4fc9b6b6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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