ETH Price: $2,421.61 (+2.79%)

Token

toona feesh (tf)
 

Overview

Max Total Supply

374 tf

Holders

108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 tf
0xc96173612168dba9ffaf4624397b629c1f2865a4
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:
ToonaFeesh

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

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

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract ToonaFeesh is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 5151;
    uint256 public constant MAX_PRESALE_MINTS = 2;
    
    uint256 public constant TREASURY_LIMIT = 282;
    
    uint256 public constant PRESALE_PRICE = 0 ether; // 00000000000000000

    uint256 public presaleStartTime;
    uint256 public presaleDuration;

    bool public revealed = false;
    string public notRevealedUri;

    bytes32 public merkleRoot;
    mapping(address => uint256) private _allowed;

    string private _baseURIextended;

    constructor() ERC721A("toona feesh", "tf") {
        presaleStartTime = 1658271600; // Tue Jul 19 2022 23:00:00 GMT+0000
        presaleDuration = 24.93 hours;
    }

    modifier isValidMerkleProof(bytes32[] memory merkleProof, bytes32 root) {
        require(MerkleProof.verify(merkleProof, root, keccak256(abi.encodePacked(msg.sender))), "Address does not exist in list");
        _;
    }

    function setNotRevealUri(string memory _uri) external onlyOwner {
        notRevealedUri = _uri;
    }
    
    function reveal() external onlyOwner {
        revealed = true;
    }

    function preSaleMint(bytes32[] calldata _proof, uint256 nMints) external payable isValidMerkleProof(_proof, merkleRoot) nonReentrant {
        require(msg.sender == tx.origin, "Can't mint through another contract");
        require(block.timestamp >= presaleStartTime, "Presale not active");
        require(nMints <= MAX_PRESALE_MINTS, "Exceeds max token purchase");
        require(totalSupply() + nMints <= MAX_SUPPLY - TREASURY_LIMIT, "Mint exceeds total supply");
        require(PRESALE_PRICE * nMints <= msg.value, "Sent incorrect ETH value");
        require(_allowed[msg.sender] + nMints <= MAX_PRESALE_MINTS, "Exceeds presale mint limit");

        // Keep track of mints for each address
        if (_allowed[msg.sender] > 0) {
        _allowed[msg.sender] = _allowed[msg.sender] + nMints;
        } else {
        _allowed[msg.sender] = nMints;
        }

        _safeMint(msg.sender, nMints);
    }

    function mintForOwner(uint256 nMints) external payable nonReentrant onlyOwner {
        require(msg.sender == tx.origin, "Can't mint through another contract");
        // require(block.timestamp >= (presaleStartTime  + presaleDuration), "Public sale not active");
        require(nMints <= MAX_PRESALE_MINTS, "Exceeds max token purchase");
        require(totalSupply() + nMints <= MAX_SUPPLY, "Mint exceeds total supply");
        require(isPresaleActive(), "Can't mint");
        _safeMint(msg.sender, nMints);
    }

    function withdrawAll() external onlyOwner {
        require(address(this).balance > 0, "No funds to withdraw");
        uint256 contractBalance = address(this).balance;
        _withdraw(msg.sender, contractBalance);
    }

    function reserveMint(uint256 nMints, uint256 batchSize, address to) external onlyOwner {
        require(totalSupply() + nMints <= MAX_SUPPLY, "Mint exceeds total supply");
        require(nMints % batchSize == 0, "Can only mint a multiple of batchSize");

        for (uint256 i = 0; i < nMints / batchSize; i++) {
            _safeMint(to, batchSize);
        }
    }

    function setBaseURI(string calldata baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

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

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

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

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

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function setPresaleStartTime(uint256 _presaleStartTime) external onlyOwner {
        presaleStartTime = _presaleStartTime;
    }

    function setPresaleDuration(uint256 _presaleDuration) external onlyOwner {
        presaleDuration = _presaleDuration;
    }

    function isPresaleActive() public view returns (bool) {
        return block.timestamp >= presaleStartTime;
    }

    function currentBlockTimeStamp() public view returns (uint256) {
        return block.timestamp;
    }
}

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":[],"name":"MAX_PRESALE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentBlockTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"mintForOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"},{"internalType":"uint256","name":"batchSize","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setNotRevealUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleDuration","type":"uint256"}],"name":"setPresaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStartTime","type":"uint256"}],"name":"setPresaleStartTime","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600b81526020017f746f6f6e612066656573680000000000000000000000000000000000000000008152506040518060400160405280600281526020017f74660000000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000b1929190620001de565b508060029080519060200190620000ca929190620001de565b505050620000ed620000e16200011060201b60201c565b6200011860201b60201c565b60016008819055506362d7377060098190555062015e94600a81905550620002f3565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ec906200028e565b90600052602060002090601f0160209004810192826200021057600085556200025c565b82601f106200022b57805160ff19168380011785556200025c565b828001600101855582156200025c579182015b828111156200025b5782518255916020019190600101906200023e565b5b5090506200026b91906200026f565b5090565b5b808211156200028a57600081600090555060010162000270565b5090565b60006002820490506001821680620002a757607f821691505b60208210811415620002be57620002bd620002c4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6153d780620003036000396000f3fe60806040526004361061023b5760003560e01c806363bc312a1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461081f578063d417b8631461085c578063e1a6e05514610885578063e985e9c5146108b0578063f2fde38b146108ed5761023b565b8063a22cb46514610762578063a475b5dd1461078b578063a82524b2146107a2578063aa08f396146107cd578063b88d4fde146107f65761023b565b80637cb64759116100f25780637cb64759146106a1578063853828b6146106ca5780638da5cb5b146106e15780639208383a1461070c57806395d89b41146107375761023b565b806363bc312a146105ea5780636ea409ba1461060657806370a0823114610631578063715018a61461066e57806378179976146106855761023b565b80632f745c59116101bc57806355f804b31161018057806355f804b3146105035780635868c32a1461052c57806360d938dc1461055757806362dc6e21146105825780636352211e146105ad5761023b565b80632f745c591461040a57806332cb6b0c1461044757806342842e0e146104725780634f6ccce71461049b57806351830227146104d85761023b565b8063095ea7b311610203578063095ea7b31461033957806318160ddd1461036257806323b872dd1461038d578063296cab55146103b65780632eb4a7ab146103df5761023b565b806301ffc9a7146102405780630259dae71461027d57806306fdde03146102a6578063081812fc146102d1578063081c8c441461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613a65565b610916565b6040516102749190614214565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190613b55565b610a60565b005b3480156102b257600080fd5b506102bb610ae6565b6040516102c8919061424a565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613b55565b610b78565b60405161030591906141ad565b60405180910390f35b34801561031a57600080fd5b50610323610bfd565b604051610330919061424a565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613998565b610c8b565b005b34801561036e57600080fd5b50610377610da4565b604051610384919061464c565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613882565b610dad565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613b55565b610dbd565b005b3480156103eb57600080fd5b506103f4610e43565b604051610401919061422f565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190613998565b610e49565b60405161043e919061464c565b60405180910390f35b34801561045357600080fd5b5061045c61103b565b604051610469919061464c565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613882565b611041565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613b55565b611061565b6040516104cf919061464c565b60405180910390f35b3480156104e457600080fd5b506104ed6110b4565b6040516104fa9190614214565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613abf565b6110c7565b005b34801561053857600080fd5b50610541611159565b60405161054e919061464c565b60405180910390f35b34801561056357600080fd5b5061056c61115f565b6040516105799190614214565b60405180910390f35b34801561058e57600080fd5b5061059761116c565b6040516105a4919061464c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf9190613b55565b611171565b6040516105e191906141ad565b60405180910390f35b61060460048036038101906105ff9190613b55565b611187565b005b34801561061257600080fd5b5061061b6113b6565b604051610628919061464c565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613815565b6113be565b604051610665919061464c565b60405180910390f35b34801561067a57600080fd5b506106836114a7565b005b61069f600480360381019061069a91906139d8565b61152f565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613a38565b6119a3565b005b3480156106d657600080fd5b506106df611a29565b005b3480156106ed57600080fd5b506106f6611afa565b60405161070391906141ad565b60405180910390f35b34801561071857600080fd5b50610721611b24565b60405161072e919061464c565b60405180910390f35b34801561074357600080fd5b5061074c611b29565b604051610759919061424a565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613958565b611bbb565b005b34801561079757600080fd5b506107a0611d3c565b005b3480156107ae57600080fd5b506107b7611dd5565b6040516107c4919061464c565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613b0c565b611ddb565b005b34801561080257600080fd5b5061081d600480360381019061081891906138d5565b611e71565b005b34801561082b57600080fd5b5061084660048036038101906108419190613b55565b611ecd565b604051610853919061424a565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613b82565b612030565b005b34801561089157600080fd5b5061089a61218a565b6040516108a7919061464c565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613842565b612190565b6040516108e49190614214565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613815565b612224565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a595750610a588261231c565b5b9050919050565b610a68612386565b73ffffffffffffffffffffffffffffffffffffffff16610a86611afa565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad39061446c565b60405180910390fd5b80600a8190555050565b606060018054610af590614911565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190614911565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b5050505050905090565b6000610b838261238e565b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061460c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610c0a90614911565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3690614911565b8015610c835780601f10610c5857610100808354040283529160200191610c83565b820191906000526020600020905b815481529060010190602001808311610c6657829003601f168201915b505050505081565b6000610c9682611171565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe906144ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d26612386565b73ffffffffffffffffffffffffffffffffffffffff161480610d555750610d5481610d4f612386565b612190565b5b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906143ec565b60405180910390fd5b610d9f83838361239b565b505050565b60008054905090565b610db883838361244d565b505050565b610dc5612386565b73ffffffffffffffffffffffffffffffffffffffff16610de3611afa565b73ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e309061446c565b60405180910390fd5b8060098190555050565b600d5481565b6000610e54836113be565b8210610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c9061426c565b60405180910390fd5b6000610e9f610da4565b905060008060005b83811015610ff9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610feb5786841415610fe2578195505050505050611035565b83806001019450505b508080600101915050610ea7565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906145ac565b60405180910390fd5b92915050565b61141f81565b61105c83838360405180602001604052806000815250611e71565b505050565b600061106b610da4565b82106110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061432c565b60405180910390fd5b819050919050565b600b60009054906101000a900460ff1681565b6110cf612386565b73ffffffffffffffffffffffffffffffffffffffff166110ed611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061446c565b60405180910390fd5b8181600f91906111549291906134a8565b505050565b600a5481565b6000600954421015905090565b600081565b600061117c8261298d565b600001519050919050565b600260085414156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906145cc565b60405180910390fd5b60026008819055506111dd612386565b73ffffffffffffffffffffffffffffffffffffffff166111fb611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061446c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b69061462c565b60405180910390fd5b6002811115611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa9061430c565b60405180910390fd5b61141f8161130f610da4565b611319919061473c565b111561135a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113519061442c565b60405180910390fd5b61136261115f565b6113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906142ac565b60405180910390fd5b6113ab3382612b27565b600160088190555050565b600042905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114269061440c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114af612386565b73ffffffffffffffffffffffffffffffffffffffff166114cd611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a9061446c565b60405180910390fd5b61152d6000612b45565b565b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d546115a582823360405160200161158a919061414e565b60405160208183030381529060405280519060200120612c0b565b6115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906143cc565b60405180910390fd5b6002600854141561162a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611621906145cc565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061462c565b60405180910390fd5b6009544210156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061438c565b60405180910390fd5b6002831115611729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117209061430c565b60405180910390fd5b61011a61141f611739919061481d565b83611742610da4565b61174c919061473c565b111561178d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117849061442c565b60405180910390fd5b3483600061179b91906147c3565b11156117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39061436c565b60405180910390fd5b600283600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611829919061473c565b111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061428c565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156119455782600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118fd919061473c565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061198a565b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6119943384612b27565b60016008819055505050505050565b6119ab612386565b73ffffffffffffffffffffffffffffffffffffffff166119c9611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a169061446c565b60405180910390fd5b80600d8190555050565b611a31612386565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061446c565b60405180910390fd5b60004711611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf906143ac565b60405180910390fd5b6000479050611af73382612c22565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600281565b606060028054611b3890614911565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6490614911565b8015611bb15780601f10611b8657610100808354040283529160200191611bb1565b820191906000526020600020905b815481529060010190602001808311611b9457829003601f168201915b5050505050905090565b611bc3612386565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c28906144ac565b60405180910390fd5b8060066000611c3e612386565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ceb612386565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d309190614214565b60405180910390a35050565b611d44612386565b73ffffffffffffffffffffffffffffffffffffffff16611d62611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf9061446c565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60095481565b611de3612386565b73ffffffffffffffffffffffffffffffffffffffff16611e01611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061446c565b60405180910390fd5b80600c9080519060200190611e6d92919061352e565b5050565b611e7c84848461244d565b611e8884848484612cd3565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061452c565b60405180910390fd5b50505050565b6060611ed88261238e565b611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e9061448c565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611fc557600c8054611f4090614911565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6c90614911565b8015611fb95780601f10611f8e57610100808354040283529160200191611fb9565b820191906000526020600020905b815481529060010190602001808311611f9c57829003601f168201915b5050505050905061202b565b6000611fcf612e6a565b9050600081511415611ff05760405180602001604052806000815250612027565b80612006600185612001919061473c565b612efc565b604051602001612017929190614169565b6040516020818303038152906040525b9150505b919050565b612038612386565b73ffffffffffffffffffffffffffffffffffffffff16612056611afa565b73ffffffffffffffffffffffffffffffffffffffff16146120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a39061446c565b60405180910390fd5b61141f836120b8610da4565b6120c2919061473c565b1115612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061442c565b60405180910390fd5b6000828461211191906149e1565b14612151576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121489061458c565b60405180910390fd5b60005b82846121609190614792565b811015612184576121718284612b27565b808061217c90614974565b915050612154565b50505050565b61011a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61222c612386565b73ffffffffffffffffffffffffffffffffffffffff1661224a611afa565b73ffffffffffffffffffffffffffffffffffffffff16146122a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122979061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612310576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612307906142cc565b60405180910390fd5b61231981612b45565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006124588261298d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661247f612386565b73ffffffffffffffffffffffffffffffffffffffff1614806124db57506124a4612386565b73ffffffffffffffffffffffffffffffffffffffff166124c384610b78565b73ffffffffffffffffffffffffffffffffffffffff16145b806124f757506124f682600001516124f1612386565b612190565b5b905080612539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612530906144cc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a29061444c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561261b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126129061434c565b60405180910390fd5b612628858585600161305d565b612638600084846000015161239b565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561291d5761287c8161238e565b1561291c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129868585856001613063565b5050505050565b6129956135b4565b61299e8261238e565b6129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d4906142ec565b60405180910390fd5b60008290505b60008110612ae6576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ad7578092505050612b22565b508080600190039150506129e3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b19906145ec565b60405180910390fd5b919050565b612b41828260405180602001604052806000815250613069565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612c18858461307b565b1490509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c4890614198565b60006040518083038185875af1925050503d8060008114612c85576040519150601f19603f3d011682016040523d82523d6000602084013e612c8a565b606091505b5050905080612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc59061450c565b60405180910390fd5b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff166130f0565b15612e5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d612386565b8786866040518563ffffffff1660e01b8152600401612d3f94939291906141c8565b602060405180830381600087803b158015612d5957600080fd5b505af1925050508015612d8a57506040513d601f19601f82011682018060405250810190612d879190613a92565b60015b612e0d573d8060008114612dba576040519150601f19603f3d011682016040523d82523d6000602084013e612dbf565b606091505b50600081511415612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc9061452c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e62565b600190505b949350505050565b6060600f8054612e7990614911565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea590614911565b8015612ef25780601f10612ec757610100808354040283529160200191612ef2565b820191906000526020600020905b815481529060010190602001808311612ed557829003601f168201915b5050505050905090565b60606000821415612f44576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f76578080612f5f90614974565b915050600a82612f6f9190614792565b9150612f4c565b60008167ffffffffffffffff811115612f9257612f91614ace565b5b6040519080825280601f01601f191660200182016040528015612fc45781602001600182028036833780820191505090505b5090505b6000851461305157600182612fdd919061481d565b9150600a85612fec91906149e1565b6030612ff8919061473c565b60f81b81838151811061300e5761300d614a9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304a9190614792565b9450612fc8565b8093505050505b919050565b50505050565b50505050565b6130768383836001613113565b505050565b60008082905060005b84518110156130e55760008582815181106130a2576130a1614a9f565b5b602002602001015190508083116130c4576130bd8382613491565b92506130d1565b6130ce8184613491565b92505b5080806130dd90614974565b915050613084565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131809061454c565b60405180910390fd5b60008414156131cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c49061456c565b60405180910390fd5b6131da600086838761305d565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561347457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561345f5761341f6000888488612cd3565b61345e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134559061452c565b60405180910390fd5b5b818060010192505080806001019150506133a8565b50806000819055505061348a6000868387613063565b5050505050565b600082600052816020526040600020905092915050565b8280546134b490614911565b90600052602060002090601f0160209004810192826134d6576000855561351d565b82601f106134ef57803560ff191683800117855561351d565b8280016001018555821561351d579182015b8281111561351c578235825591602001919060010190613501565b5b50905061352a91906135ee565b5090565b82805461353a90614911565b90600052602060002090601f01602090048101928261355c57600085556135a3565b82601f1061357557805160ff19168380011785556135a3565b828001600101855582156135a3579182015b828111156135a2578251825591602001919060010190613587565b5b5090506135b091906135ee565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136075760008160009055506001016135ef565b5090565b600061361e6136198461468c565b614667565b90508281526020810184848401111561363a57613639614b0c565b5b6136458482856148cf565b509392505050565b600061366061365b846146bd565b614667565b90508281526020810184848401111561367c5761367b614b0c565b5b6136878482856148cf565b509392505050565b60008135905061369e8161532e565b92915050565b60008083601f8401126136ba576136b9614b02565b5b8235905067ffffffffffffffff8111156136d7576136d6614afd565b5b6020830191508360208202830111156136f3576136f2614b07565b5b9250929050565b60008135905061370981615345565b92915050565b60008135905061371e8161535c565b92915050565b60008135905061373381615373565b92915050565b60008151905061374881615373565b92915050565b600082601f83011261376357613762614b02565b5b813561377384826020860161360b565b91505092915050565b60008083601f84011261379257613791614b02565b5b8235905067ffffffffffffffff8111156137af576137ae614afd565b5b6020830191508360018202830111156137cb576137ca614b07565b5b9250929050565b600082601f8301126137e7576137e6614b02565b5b81356137f784826020860161364d565b91505092915050565b60008135905061380f8161538a565b92915050565b60006020828403121561382b5761382a614b16565b5b60006138398482850161368f565b91505092915050565b6000806040838503121561385957613858614b16565b5b60006138678582860161368f565b92505060206138788582860161368f565b9150509250929050565b60008060006060848603121561389b5761389a614b16565b5b60006138a98682870161368f565b93505060206138ba8682870161368f565b92505060406138cb86828701613800565b9150509250925092565b600080600080608085870312156138ef576138ee614b16565b5b60006138fd8782880161368f565b945050602061390e8782880161368f565b935050604061391f87828801613800565b925050606085013567ffffffffffffffff8111156139405761393f614b11565b5b61394c8782880161374e565b91505092959194509250565b6000806040838503121561396f5761396e614b16565b5b600061397d8582860161368f565b925050602061398e858286016136fa565b9150509250929050565b600080604083850312156139af576139ae614b16565b5b60006139bd8582860161368f565b92505060206139ce85828601613800565b9150509250929050565b6000806000604084860312156139f1576139f0614b16565b5b600084013567ffffffffffffffff811115613a0f57613a0e614b11565b5b613a1b868287016136a4565b93509350506020613a2e86828701613800565b9150509250925092565b600060208284031215613a4e57613a4d614b16565b5b6000613a5c8482850161370f565b91505092915050565b600060208284031215613a7b57613a7a614b16565b5b6000613a8984828501613724565b91505092915050565b600060208284031215613aa857613aa7614b16565b5b6000613ab684828501613739565b91505092915050565b60008060208385031215613ad657613ad5614b16565b5b600083013567ffffffffffffffff811115613af457613af3614b11565b5b613b008582860161377c565b92509250509250929050565b600060208284031215613b2257613b21614b16565b5b600082013567ffffffffffffffff811115613b4057613b3f614b11565b5b613b4c848285016137d2565b91505092915050565b600060208284031215613b6b57613b6a614b16565b5b6000613b7984828501613800565b91505092915050565b600080600060608486031215613b9b57613b9a614b16565b5b6000613ba986828701613800565b9350506020613bba86828701613800565b9250506040613bcb8682870161368f565b9150509250925092565b613bde81614851565b82525050565b613bf5613bf082614851565b6149bd565b82525050565b613c0481614863565b82525050565b613c138161486f565b82525050565b6000613c24826146ee565b613c2e8185614704565b9350613c3e8185602086016148de565b613c4781614b1b565b840191505092915050565b6000613c5d826146f9565b613c678185614720565b9350613c778185602086016148de565b613c8081614b1b565b840191505092915050565b6000613c96826146f9565b613ca08185614731565b9350613cb08185602086016148de565b80840191505092915050565b6000613cc9602283614720565b9150613cd482614b39565b604082019050919050565b6000613cec601a83614720565b9150613cf782614b88565b602082019050919050565b6000613d0f600a83614720565b9150613d1a82614bb1565b602082019050919050565b6000613d32602683614720565b9150613d3d82614bda565b604082019050919050565b6000613d55602a83614720565b9150613d6082614c29565b604082019050919050565b6000613d78601a83614720565b9150613d8382614c78565b602082019050919050565b6000613d9b602383614720565b9150613da682614ca1565b604082019050919050565b6000613dbe602583614720565b9150613dc982614cf0565b604082019050919050565b6000613de1601883614720565b9150613dec82614d3f565b602082019050919050565b6000613e04601283614720565b9150613e0f82614d68565b602082019050919050565b6000613e27601483614720565b9150613e3282614d91565b602082019050919050565b6000613e4a601e83614720565b9150613e5582614dba565b602082019050919050565b6000613e6d603983614720565b9150613e7882614de3565b604082019050919050565b6000613e90602b83614720565b9150613e9b82614e32565b604082019050919050565b6000613eb3601983614720565b9150613ebe82614e81565b602082019050919050565b6000613ed6602683614720565b9150613ee182614eaa565b604082019050919050565b6000613ef9600583614731565b9150613f0482614ef9565b600582019050919050565b6000613f1c602083614720565b9150613f2782614f22565b602082019050919050565b6000613f3f602f83614720565b9150613f4a82614f4b565b604082019050919050565b6000613f62601a83614720565b9150613f6d82614f9a565b602082019050919050565b6000613f85603283614720565b9150613f9082614fc3565b604082019050919050565b6000613fa8602283614720565b9150613fb382615012565b604082019050919050565b6000613fcb600083614715565b9150613fd682615061565b600082019050919050565b6000613fee601083614720565b9150613ff982615064565b602082019050919050565b6000614011603383614720565b915061401c8261508d565b604082019050919050565b6000614034602183614720565b915061403f826150dc565b604082019050919050565b6000614057602883614720565b91506140628261512b565b604082019050919050565b600061407a602583614720565b91506140858261517a565b604082019050919050565b600061409d602e83614720565b91506140a8826151c9565b604082019050919050565b60006140c0601f83614720565b91506140cb82615218565b602082019050919050565b60006140e3602f83614720565b91506140ee82615241565b604082019050919050565b6000614106602d83614720565b915061411182615290565b604082019050919050565b6000614129602383614720565b9150614134826152df565b604082019050919050565b614148816148c5565b82525050565b600061415a8284613be4565b60148201915081905092915050565b60006141758285613c8b565b91506141818284613c8b565b915061418c82613eec565b91508190509392505050565b60006141a382613fbe565b9150819050919050565b60006020820190506141c26000830184613bd5565b92915050565b60006080820190506141dd6000830187613bd5565b6141ea6020830186613bd5565b6141f7604083018561413f565b81810360608301526142098184613c19565b905095945050505050565b60006020820190506142296000830184613bfb565b92915050565b60006020820190506142446000830184613c0a565b92915050565b600060208201905081810360008301526142648184613c52565b905092915050565b6000602082019050818103600083015261428581613cbc565b9050919050565b600060208201905081810360008301526142a581613cdf565b9050919050565b600060208201905081810360008301526142c581613d02565b9050919050565b600060208201905081810360008301526142e581613d25565b9050919050565b6000602082019050818103600083015261430581613d48565b9050919050565b6000602082019050818103600083015261432581613d6b565b9050919050565b6000602082019050818103600083015261434581613d8e565b9050919050565b6000602082019050818103600083015261436581613db1565b9050919050565b6000602082019050818103600083015261438581613dd4565b9050919050565b600060208201905081810360008301526143a581613df7565b9050919050565b600060208201905081810360008301526143c581613e1a565b9050919050565b600060208201905081810360008301526143e581613e3d565b9050919050565b6000602082019050818103600083015261440581613e60565b9050919050565b6000602082019050818103600083015261442581613e83565b9050919050565b6000602082019050818103600083015261444581613ea6565b9050919050565b6000602082019050818103600083015261446581613ec9565b9050919050565b6000602082019050818103600083015261448581613f0f565b9050919050565b600060208201905081810360008301526144a581613f32565b9050919050565b600060208201905081810360008301526144c581613f55565b9050919050565b600060208201905081810360008301526144e581613f78565b9050919050565b6000602082019050818103600083015261450581613f9b565b9050919050565b6000602082019050818103600083015261452581613fe1565b9050919050565b6000602082019050818103600083015261454581614004565b9050919050565b6000602082019050818103600083015261456581614027565b9050919050565b600060208201905081810360008301526145858161404a565b9050919050565b600060208201905081810360008301526145a58161406d565b9050919050565b600060208201905081810360008301526145c581614090565b9050919050565b600060208201905081810360008301526145e5816140b3565b9050919050565b60006020820190508181036000830152614605816140d6565b9050919050565b60006020820190508181036000830152614625816140f9565b9050919050565b600060208201905081810360008301526146458161411c565b9050919050565b6000602082019050614661600083018461413f565b92915050565b6000614671614682565b905061467d8282614943565b919050565b6000604051905090565b600067ffffffffffffffff8211156146a7576146a6614ace565b5b6146b082614b1b565b9050602081019050919050565b600067ffffffffffffffff8211156146d8576146d7614ace565b5b6146e182614b1b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614747826148c5565b9150614752836148c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561478757614786614a12565b5b828201905092915050565b600061479d826148c5565b91506147a8836148c5565b9250826147b8576147b7614a41565b5b828204905092915050565b60006147ce826148c5565b91506147d9836148c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481257614811614a12565b5b828202905092915050565b6000614828826148c5565b9150614833836148c5565b92508282101561484657614845614a12565b5b828203905092915050565b600061485c826148a5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148fc5780820151818401526020810190506148e1565b8381111561490b576000848401525b50505050565b6000600282049050600182168061492957607f821691505b6020821081141561493d5761493c614a70565b5b50919050565b61494c82614b1b565b810181811067ffffffffffffffff8211171561496b5761496a614ace565b5b80604052505050565b600061497f826148c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149b2576149b1614a12565b5b600182019050919050565b60006149c8826149cf565b9050919050565b60006149da82614b2c565b9050919050565b60006149ec826148c5565b91506149f7836148c5565b925082614a0757614a06614a41565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732070726573616c65206d696e74206c696d6974000000000000600082015250565b7f43616e2774206d696e7400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820746f6b656e207075726368617365000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f53656e7420696e636f7272656374204554482076616c75650000000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320746f74616c20737570706c7900000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e742061206d756c7469706c65206f66206261746360008201527f6853697a65000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74207468726f75676820616e6f7468657220636f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b61533781614851565b811461534257600080fd5b50565b61534e81614863565b811461535957600080fd5b50565b6153658161486f565b811461537057600080fd5b50565b61537c81614879565b811461538757600080fd5b50565b615393816148c5565b811461539e57600080fd5b5056fea264697066735822122094468d04e5f882af9e05099cfea7828d1dede50c8de6716e744ed02c6c3241d364736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806363bc312a1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461081f578063d417b8631461085c578063e1a6e05514610885578063e985e9c5146108b0578063f2fde38b146108ed5761023b565b8063a22cb46514610762578063a475b5dd1461078b578063a82524b2146107a2578063aa08f396146107cd578063b88d4fde146107f65761023b565b80637cb64759116100f25780637cb64759146106a1578063853828b6146106ca5780638da5cb5b146106e15780639208383a1461070c57806395d89b41146107375761023b565b806363bc312a146105ea5780636ea409ba1461060657806370a0823114610631578063715018a61461066e57806378179976146106855761023b565b80632f745c59116101bc57806355f804b31161018057806355f804b3146105035780635868c32a1461052c57806360d938dc1461055757806362dc6e21146105825780636352211e146105ad5761023b565b80632f745c591461040a57806332cb6b0c1461044757806342842e0e146104725780634f6ccce71461049b57806351830227146104d85761023b565b8063095ea7b311610203578063095ea7b31461033957806318160ddd1461036257806323b872dd1461038d578063296cab55146103b65780632eb4a7ab146103df5761023b565b806301ffc9a7146102405780630259dae71461027d57806306fdde03146102a6578063081812fc146102d1578063081c8c441461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613a65565b610916565b6040516102749190614214565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190613b55565b610a60565b005b3480156102b257600080fd5b506102bb610ae6565b6040516102c8919061424a565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613b55565b610b78565b60405161030591906141ad565b60405180910390f35b34801561031a57600080fd5b50610323610bfd565b604051610330919061424a565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613998565b610c8b565b005b34801561036e57600080fd5b50610377610da4565b604051610384919061464c565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613882565b610dad565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613b55565b610dbd565b005b3480156103eb57600080fd5b506103f4610e43565b604051610401919061422f565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190613998565b610e49565b60405161043e919061464c565b60405180910390f35b34801561045357600080fd5b5061045c61103b565b604051610469919061464c565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613882565b611041565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613b55565b611061565b6040516104cf919061464c565b60405180910390f35b3480156104e457600080fd5b506104ed6110b4565b6040516104fa9190614214565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613abf565b6110c7565b005b34801561053857600080fd5b50610541611159565b60405161054e919061464c565b60405180910390f35b34801561056357600080fd5b5061056c61115f565b6040516105799190614214565b60405180910390f35b34801561058e57600080fd5b5061059761116c565b6040516105a4919061464c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf9190613b55565b611171565b6040516105e191906141ad565b60405180910390f35b61060460048036038101906105ff9190613b55565b611187565b005b34801561061257600080fd5b5061061b6113b6565b604051610628919061464c565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613815565b6113be565b604051610665919061464c565b60405180910390f35b34801561067a57600080fd5b506106836114a7565b005b61069f600480360381019061069a91906139d8565b61152f565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613a38565b6119a3565b005b3480156106d657600080fd5b506106df611a29565b005b3480156106ed57600080fd5b506106f6611afa565b60405161070391906141ad565b60405180910390f35b34801561071857600080fd5b50610721611b24565b60405161072e919061464c565b60405180910390f35b34801561074357600080fd5b5061074c611b29565b604051610759919061424a565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613958565b611bbb565b005b34801561079757600080fd5b506107a0611d3c565b005b3480156107ae57600080fd5b506107b7611dd5565b6040516107c4919061464c565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613b0c565b611ddb565b005b34801561080257600080fd5b5061081d600480360381019061081891906138d5565b611e71565b005b34801561082b57600080fd5b5061084660048036038101906108419190613b55565b611ecd565b604051610853919061424a565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613b82565b612030565b005b34801561089157600080fd5b5061089a61218a565b6040516108a7919061464c565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613842565b612190565b6040516108e49190614214565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613815565b612224565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a595750610a588261231c565b5b9050919050565b610a68612386565b73ffffffffffffffffffffffffffffffffffffffff16610a86611afa565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad39061446c565b60405180910390fd5b80600a8190555050565b606060018054610af590614911565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190614911565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b5050505050905090565b6000610b838261238e565b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061460c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610c0a90614911565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3690614911565b8015610c835780601f10610c5857610100808354040283529160200191610c83565b820191906000526020600020905b815481529060010190602001808311610c6657829003601f168201915b505050505081565b6000610c9682611171565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe906144ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d26612386565b73ffffffffffffffffffffffffffffffffffffffff161480610d555750610d5481610d4f612386565b612190565b5b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906143ec565b60405180910390fd5b610d9f83838361239b565b505050565b60008054905090565b610db883838361244d565b505050565b610dc5612386565b73ffffffffffffffffffffffffffffffffffffffff16610de3611afa565b73ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e309061446c565b60405180910390fd5b8060098190555050565b600d5481565b6000610e54836113be565b8210610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c9061426c565b60405180910390fd5b6000610e9f610da4565b905060008060005b83811015610ff9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610feb5786841415610fe2578195505050505050611035565b83806001019450505b508080600101915050610ea7565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906145ac565b60405180910390fd5b92915050565b61141f81565b61105c83838360405180602001604052806000815250611e71565b505050565b600061106b610da4565b82106110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061432c565b60405180910390fd5b819050919050565b600b60009054906101000a900460ff1681565b6110cf612386565b73ffffffffffffffffffffffffffffffffffffffff166110ed611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061446c565b60405180910390fd5b8181600f91906111549291906134a8565b505050565b600a5481565b6000600954421015905090565b600081565b600061117c8261298d565b600001519050919050565b600260085414156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906145cc565b60405180910390fd5b60026008819055506111dd612386565b73ffffffffffffffffffffffffffffffffffffffff166111fb611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061446c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b69061462c565b60405180910390fd5b6002811115611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa9061430c565b60405180910390fd5b61141f8161130f610da4565b611319919061473c565b111561135a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113519061442c565b60405180910390fd5b61136261115f565b6113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906142ac565b60405180910390fd5b6113ab3382612b27565b600160088190555050565b600042905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114269061440c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114af612386565b73ffffffffffffffffffffffffffffffffffffffff166114cd611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a9061446c565b60405180910390fd5b61152d6000612b45565b565b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d546115a582823360405160200161158a919061414e565b60405160208183030381529060405280519060200120612c0b565b6115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906143cc565b60405180910390fd5b6002600854141561162a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611621906145cc565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061462c565b60405180910390fd5b6009544210156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061438c565b60405180910390fd5b6002831115611729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117209061430c565b60405180910390fd5b61011a61141f611739919061481d565b83611742610da4565b61174c919061473c565b111561178d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117849061442c565b60405180910390fd5b3483600061179b91906147c3565b11156117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39061436c565b60405180910390fd5b600283600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611829919061473c565b111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061428c565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156119455782600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118fd919061473c565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061198a565b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6119943384612b27565b60016008819055505050505050565b6119ab612386565b73ffffffffffffffffffffffffffffffffffffffff166119c9611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a169061446c565b60405180910390fd5b80600d8190555050565b611a31612386565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061446c565b60405180910390fd5b60004711611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf906143ac565b60405180910390fd5b6000479050611af73382612c22565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600281565b606060028054611b3890614911565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6490614911565b8015611bb15780601f10611b8657610100808354040283529160200191611bb1565b820191906000526020600020905b815481529060010190602001808311611b9457829003601f168201915b5050505050905090565b611bc3612386565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c28906144ac565b60405180910390fd5b8060066000611c3e612386565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ceb612386565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d309190614214565b60405180910390a35050565b611d44612386565b73ffffffffffffffffffffffffffffffffffffffff16611d62611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf9061446c565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60095481565b611de3612386565b73ffffffffffffffffffffffffffffffffffffffff16611e01611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061446c565b60405180910390fd5b80600c9080519060200190611e6d92919061352e565b5050565b611e7c84848461244d565b611e8884848484612cd3565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061452c565b60405180910390fd5b50505050565b6060611ed88261238e565b611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e9061448c565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611fc557600c8054611f4090614911565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6c90614911565b8015611fb95780601f10611f8e57610100808354040283529160200191611fb9565b820191906000526020600020905b815481529060010190602001808311611f9c57829003601f168201915b5050505050905061202b565b6000611fcf612e6a565b9050600081511415611ff05760405180602001604052806000815250612027565b80612006600185612001919061473c565b612efc565b604051602001612017929190614169565b6040516020818303038152906040525b9150505b919050565b612038612386565b73ffffffffffffffffffffffffffffffffffffffff16612056611afa565b73ffffffffffffffffffffffffffffffffffffffff16146120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a39061446c565b60405180910390fd5b61141f836120b8610da4565b6120c2919061473c565b1115612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061442c565b60405180910390fd5b6000828461211191906149e1565b14612151576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121489061458c565b60405180910390fd5b60005b82846121609190614792565b811015612184576121718284612b27565b808061217c90614974565b915050612154565b50505050565b61011a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61222c612386565b73ffffffffffffffffffffffffffffffffffffffff1661224a611afa565b73ffffffffffffffffffffffffffffffffffffffff16146122a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122979061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612310576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612307906142cc565b60405180910390fd5b61231981612b45565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006124588261298d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661247f612386565b73ffffffffffffffffffffffffffffffffffffffff1614806124db57506124a4612386565b73ffffffffffffffffffffffffffffffffffffffff166124c384610b78565b73ffffffffffffffffffffffffffffffffffffffff16145b806124f757506124f682600001516124f1612386565b612190565b5b905080612539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612530906144cc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a29061444c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561261b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126129061434c565b60405180910390fd5b612628858585600161305d565b612638600084846000015161239b565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561291d5761287c8161238e565b1561291c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129868585856001613063565b5050505050565b6129956135b4565b61299e8261238e565b6129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d4906142ec565b60405180910390fd5b60008290505b60008110612ae6576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ad7578092505050612b22565b508080600190039150506129e3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b19906145ec565b60405180910390fd5b919050565b612b41828260405180602001604052806000815250613069565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612c18858461307b565b1490509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c4890614198565b60006040518083038185875af1925050503d8060008114612c85576040519150601f19603f3d011682016040523d82523d6000602084013e612c8a565b606091505b5050905080612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc59061450c565b60405180910390fd5b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff166130f0565b15612e5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d612386565b8786866040518563ffffffff1660e01b8152600401612d3f94939291906141c8565b602060405180830381600087803b158015612d5957600080fd5b505af1925050508015612d8a57506040513d601f19601f82011682018060405250810190612d879190613a92565b60015b612e0d573d8060008114612dba576040519150601f19603f3d011682016040523d82523d6000602084013e612dbf565b606091505b50600081511415612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc9061452c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e62565b600190505b949350505050565b6060600f8054612e7990614911565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea590614911565b8015612ef25780601f10612ec757610100808354040283529160200191612ef2565b820191906000526020600020905b815481529060010190602001808311612ed557829003601f168201915b5050505050905090565b60606000821415612f44576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f76578080612f5f90614974565b915050600a82612f6f9190614792565b9150612f4c565b60008167ffffffffffffffff811115612f9257612f91614ace565b5b6040519080825280601f01601f191660200182016040528015612fc45781602001600182028036833780820191505090505b5090505b6000851461305157600182612fdd919061481d565b9150600a85612fec91906149e1565b6030612ff8919061473c565b60f81b81838151811061300e5761300d614a9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304a9190614792565b9450612fc8565b8093505050505b919050565b50505050565b50505050565b6130768383836001613113565b505050565b60008082905060005b84518110156130e55760008582815181106130a2576130a1614a9f565b5b602002602001015190508083116130c4576130bd8382613491565b92506130d1565b6130ce8184613491565b92505b5080806130dd90614974565b915050613084565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131809061454c565b60405180910390fd5b60008414156131cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c49061456c565b60405180910390fd5b6131da600086838761305d565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561347457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561345f5761341f6000888488612cd3565b61345e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134559061452c565b60405180910390fd5b5b818060010192505080806001019150506133a8565b50806000819055505061348a6000868387613063565b5050505050565b600082600052816020526040600020905092915050565b8280546134b490614911565b90600052602060002090601f0160209004810192826134d6576000855561351d565b82601f106134ef57803560ff191683800117855561351d565b8280016001018555821561351d579182015b8281111561351c578235825591602001919060010190613501565b5b50905061352a91906135ee565b5090565b82805461353a90614911565b90600052602060002090601f01602090048101928261355c57600085556135a3565b82601f1061357557805160ff19168380011785556135a3565b828001600101855582156135a3579182015b828111156135a2578251825591602001919060010190613587565b5b5090506135b091906135ee565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136075760008160009055506001016135ef565b5090565b600061361e6136198461468c565b614667565b90508281526020810184848401111561363a57613639614b0c565b5b6136458482856148cf565b509392505050565b600061366061365b846146bd565b614667565b90508281526020810184848401111561367c5761367b614b0c565b5b6136878482856148cf565b509392505050565b60008135905061369e8161532e565b92915050565b60008083601f8401126136ba576136b9614b02565b5b8235905067ffffffffffffffff8111156136d7576136d6614afd565b5b6020830191508360208202830111156136f3576136f2614b07565b5b9250929050565b60008135905061370981615345565b92915050565b60008135905061371e8161535c565b92915050565b60008135905061373381615373565b92915050565b60008151905061374881615373565b92915050565b600082601f83011261376357613762614b02565b5b813561377384826020860161360b565b91505092915050565b60008083601f84011261379257613791614b02565b5b8235905067ffffffffffffffff8111156137af576137ae614afd565b5b6020830191508360018202830111156137cb576137ca614b07565b5b9250929050565b600082601f8301126137e7576137e6614b02565b5b81356137f784826020860161364d565b91505092915050565b60008135905061380f8161538a565b92915050565b60006020828403121561382b5761382a614b16565b5b60006138398482850161368f565b91505092915050565b6000806040838503121561385957613858614b16565b5b60006138678582860161368f565b92505060206138788582860161368f565b9150509250929050565b60008060006060848603121561389b5761389a614b16565b5b60006138a98682870161368f565b93505060206138ba8682870161368f565b92505060406138cb86828701613800565b9150509250925092565b600080600080608085870312156138ef576138ee614b16565b5b60006138fd8782880161368f565b945050602061390e8782880161368f565b935050604061391f87828801613800565b925050606085013567ffffffffffffffff8111156139405761393f614b11565b5b61394c8782880161374e565b91505092959194509250565b6000806040838503121561396f5761396e614b16565b5b600061397d8582860161368f565b925050602061398e858286016136fa565b9150509250929050565b600080604083850312156139af576139ae614b16565b5b60006139bd8582860161368f565b92505060206139ce85828601613800565b9150509250929050565b6000806000604084860312156139f1576139f0614b16565b5b600084013567ffffffffffffffff811115613a0f57613a0e614b11565b5b613a1b868287016136a4565b93509350506020613a2e86828701613800565b9150509250925092565b600060208284031215613a4e57613a4d614b16565b5b6000613a5c8482850161370f565b91505092915050565b600060208284031215613a7b57613a7a614b16565b5b6000613a8984828501613724565b91505092915050565b600060208284031215613aa857613aa7614b16565b5b6000613ab684828501613739565b91505092915050565b60008060208385031215613ad657613ad5614b16565b5b600083013567ffffffffffffffff811115613af457613af3614b11565b5b613b008582860161377c565b92509250509250929050565b600060208284031215613b2257613b21614b16565b5b600082013567ffffffffffffffff811115613b4057613b3f614b11565b5b613b4c848285016137d2565b91505092915050565b600060208284031215613b6b57613b6a614b16565b5b6000613b7984828501613800565b91505092915050565b600080600060608486031215613b9b57613b9a614b16565b5b6000613ba986828701613800565b9350506020613bba86828701613800565b9250506040613bcb8682870161368f565b9150509250925092565b613bde81614851565b82525050565b613bf5613bf082614851565b6149bd565b82525050565b613c0481614863565b82525050565b613c138161486f565b82525050565b6000613c24826146ee565b613c2e8185614704565b9350613c3e8185602086016148de565b613c4781614b1b565b840191505092915050565b6000613c5d826146f9565b613c678185614720565b9350613c778185602086016148de565b613c8081614b1b565b840191505092915050565b6000613c96826146f9565b613ca08185614731565b9350613cb08185602086016148de565b80840191505092915050565b6000613cc9602283614720565b9150613cd482614b39565b604082019050919050565b6000613cec601a83614720565b9150613cf782614b88565b602082019050919050565b6000613d0f600a83614720565b9150613d1a82614bb1565b602082019050919050565b6000613d32602683614720565b9150613d3d82614bda565b604082019050919050565b6000613d55602a83614720565b9150613d6082614c29565b604082019050919050565b6000613d78601a83614720565b9150613d8382614c78565b602082019050919050565b6000613d9b602383614720565b9150613da682614ca1565b604082019050919050565b6000613dbe602583614720565b9150613dc982614cf0565b604082019050919050565b6000613de1601883614720565b9150613dec82614d3f565b602082019050919050565b6000613e04601283614720565b9150613e0f82614d68565b602082019050919050565b6000613e27601483614720565b9150613e3282614d91565b602082019050919050565b6000613e4a601e83614720565b9150613e5582614dba565b602082019050919050565b6000613e6d603983614720565b9150613e7882614de3565b604082019050919050565b6000613e90602b83614720565b9150613e9b82614e32565b604082019050919050565b6000613eb3601983614720565b9150613ebe82614e81565b602082019050919050565b6000613ed6602683614720565b9150613ee182614eaa565b604082019050919050565b6000613ef9600583614731565b9150613f0482614ef9565b600582019050919050565b6000613f1c602083614720565b9150613f2782614f22565b602082019050919050565b6000613f3f602f83614720565b9150613f4a82614f4b565b604082019050919050565b6000613f62601a83614720565b9150613f6d82614f9a565b602082019050919050565b6000613f85603283614720565b9150613f9082614fc3565b604082019050919050565b6000613fa8602283614720565b9150613fb382615012565b604082019050919050565b6000613fcb600083614715565b9150613fd682615061565b600082019050919050565b6000613fee601083614720565b9150613ff982615064565b602082019050919050565b6000614011603383614720565b915061401c8261508d565b604082019050919050565b6000614034602183614720565b915061403f826150dc565b604082019050919050565b6000614057602883614720565b91506140628261512b565b604082019050919050565b600061407a602583614720565b91506140858261517a565b604082019050919050565b600061409d602e83614720565b91506140a8826151c9565b604082019050919050565b60006140c0601f83614720565b91506140cb82615218565b602082019050919050565b60006140e3602f83614720565b91506140ee82615241565b604082019050919050565b6000614106602d83614720565b915061411182615290565b604082019050919050565b6000614129602383614720565b9150614134826152df565b604082019050919050565b614148816148c5565b82525050565b600061415a8284613be4565b60148201915081905092915050565b60006141758285613c8b565b91506141818284613c8b565b915061418c82613eec565b91508190509392505050565b60006141a382613fbe565b9150819050919050565b60006020820190506141c26000830184613bd5565b92915050565b60006080820190506141dd6000830187613bd5565b6141ea6020830186613bd5565b6141f7604083018561413f565b81810360608301526142098184613c19565b905095945050505050565b60006020820190506142296000830184613bfb565b92915050565b60006020820190506142446000830184613c0a565b92915050565b600060208201905081810360008301526142648184613c52565b905092915050565b6000602082019050818103600083015261428581613cbc565b9050919050565b600060208201905081810360008301526142a581613cdf565b9050919050565b600060208201905081810360008301526142c581613d02565b9050919050565b600060208201905081810360008301526142e581613d25565b9050919050565b6000602082019050818103600083015261430581613d48565b9050919050565b6000602082019050818103600083015261432581613d6b565b9050919050565b6000602082019050818103600083015261434581613d8e565b9050919050565b6000602082019050818103600083015261436581613db1565b9050919050565b6000602082019050818103600083015261438581613dd4565b9050919050565b600060208201905081810360008301526143a581613df7565b9050919050565b600060208201905081810360008301526143c581613e1a565b9050919050565b600060208201905081810360008301526143e581613e3d565b9050919050565b6000602082019050818103600083015261440581613e60565b9050919050565b6000602082019050818103600083015261442581613e83565b9050919050565b6000602082019050818103600083015261444581613ea6565b9050919050565b6000602082019050818103600083015261446581613ec9565b9050919050565b6000602082019050818103600083015261448581613f0f565b9050919050565b600060208201905081810360008301526144a581613f32565b9050919050565b600060208201905081810360008301526144c581613f55565b9050919050565b600060208201905081810360008301526144e581613f78565b9050919050565b6000602082019050818103600083015261450581613f9b565b9050919050565b6000602082019050818103600083015261452581613fe1565b9050919050565b6000602082019050818103600083015261454581614004565b9050919050565b6000602082019050818103600083015261456581614027565b9050919050565b600060208201905081810360008301526145858161404a565b9050919050565b600060208201905081810360008301526145a58161406d565b9050919050565b600060208201905081810360008301526145c581614090565b9050919050565b600060208201905081810360008301526145e5816140b3565b9050919050565b60006020820190508181036000830152614605816140d6565b9050919050565b60006020820190508181036000830152614625816140f9565b9050919050565b600060208201905081810360008301526146458161411c565b9050919050565b6000602082019050614661600083018461413f565b92915050565b6000614671614682565b905061467d8282614943565b919050565b6000604051905090565b600067ffffffffffffffff8211156146a7576146a6614ace565b5b6146b082614b1b565b9050602081019050919050565b600067ffffffffffffffff8211156146d8576146d7614ace565b5b6146e182614b1b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614747826148c5565b9150614752836148c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561478757614786614a12565b5b828201905092915050565b600061479d826148c5565b91506147a8836148c5565b9250826147b8576147b7614a41565b5b828204905092915050565b60006147ce826148c5565b91506147d9836148c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481257614811614a12565b5b828202905092915050565b6000614828826148c5565b9150614833836148c5565b92508282101561484657614845614a12565b5b828203905092915050565b600061485c826148a5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148fc5780820151818401526020810190506148e1565b8381111561490b576000848401525b50505050565b6000600282049050600182168061492957607f821691505b6020821081141561493d5761493c614a70565b5b50919050565b61494c82614b1b565b810181811067ffffffffffffffff8211171561496b5761496a614ace565b5b80604052505050565b600061497f826148c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149b2576149b1614a12565b5b600182019050919050565b60006149c8826149cf565b9050919050565b60006149da82614b2c565b9050919050565b60006149ec826148c5565b91506149f7836148c5565b925082614a0757614a06614a41565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732070726573616c65206d696e74206c696d6974000000000000600082015250565b7f43616e2774206d696e7400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820746f6b656e207075726368617365000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f53656e7420696e636f7272656374204554482076616c75650000000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320746f74616c20737570706c7900000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e742061206d756c7469706c65206f66206261746360008201527f6853697a65000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74207468726f75676820616e6f7468657220636f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b61533781614851565b811461534257600080fd5b50565b61534e81614863565b811461535957600080fd5b50565b6153658161486f565b811461537057600080fd5b50565b61537c81614879565b811461538757600080fd5b50565b615393816148c5565b811461539e57600080fd5b5056fea264697066735822122094468d04e5f882af9e05099cfea7828d1dede50c8de6716e744ed02c6c3241d364736f6c63430008070033

Deployed Bytecode Sourcemap

43580:4791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30456:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48007:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32342:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33904:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44030:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33425:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34780:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47869:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44067:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29377:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43678:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35013:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28890:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43995:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46883:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43956:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48141:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43841:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32151:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45731:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48264:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30892:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23590:103;;;;;;;;;;;;;:::i;:::-;;44795:928;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47567:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46265:226;;;;;;;;;;;;;:::i;:::-;;22939:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43726:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32511:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34190:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44716:71;;;;;;;;;;;;;:::i;:::-;;43918:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44600:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35261:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47127:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46499:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43784:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34549:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23848:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30456:372;30558:4;30610:25;30595:40;;;:11;:40;;;;:105;;;;30667:33;30652:48;;;:11;:48;;;;30595:105;:172;;;;30732:35;30717:50;;;:11;:50;;;;30595:172;:225;;;;30784:36;30808:11;30784:23;:36::i;:::-;30595:225;30575:245;;30456:372;;;:::o;48007:126::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48109:16:::1;48091:15;:34;;;;48007:126:::0;:::o;32342:100::-;32396:13;32429:5;32422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32342:100;:::o;33904:214::-;33972:7;34000:16;34008:7;34000;:16::i;:::-;33992:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34086:15;:24;34102:7;34086:24;;;;;;;;;;;;;;;;;;;;;34079:31;;33904:214;;;:::o;44030:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33425:413::-;33498:13;33514:24;33530:7;33514:15;:24::i;:::-;33498:40;;33563:5;33557:11;;:2;:11;;;;33549:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33658:5;33642:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33667:37;33684:5;33691:12;:10;:12::i;:::-;33667:16;:37::i;:::-;33642:62;33620:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;33802:28;33811:2;33815:7;33824:5;33802:8;:28::i;:::-;33487:351;33425:413;;:::o;28713:100::-;28766:7;28793:12;;28786:19;;28713:100;:::o;34780:162::-;34906:28;34916:4;34922:2;34926:7;34906:9;:28::i;:::-;34780:162;;;:::o;47869:130::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47974:17:::1;47955:16;:36;;;;47869:130:::0;:::o;44067:25::-;;;;:::o;29377:1007::-;29466:7;29502:16;29512:5;29502:9;:16::i;:::-;29494:5;:24;29486:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29568:22;29593:13;:11;:13::i;:::-;29568:38;;29617:19;29647:25;29836:9;29831:466;29851:14;29847:1;:18;29831:466;;;29891:31;29925:11;:14;29937:1;29925:14;;;;;;;;;;;29891:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29988:1;29962:28;;:9;:14;;;:28;;;29958:111;;30035:9;:14;;;30015:34;;29958:111;30112:5;30091:26;;:17;:26;;;30087:195;;;30161:5;30146:11;:20;30142:85;;;30202:1;30195:8;;;;;;;;;30142:85;30249:13;;;;;;;30087:195;29872:425;29867:3;;;;;;;29831:466;;;;30320:56;;;;;;;;;;:::i;:::-;;;;;;;;29377:1007;;;;;:::o;43678:41::-;43715:4;43678:41;:::o;35013:177::-;35143:39;35160:4;35166:2;35170:7;35143:39;;;;;;;;;;;;:16;:39::i;:::-;35013:177;;;:::o;28890:187::-;28957:7;28993:13;:11;:13::i;:::-;28985:5;:21;28977:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29064:5;29057:12;;28890:187;;;:::o;43995:28::-;;;;;;;;;;;;;:::o;46883:111::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46978:8:::1;;46959:16;:27;;;;;;;:::i;:::-;;46883:111:::0;;:::o;43956:30::-;;;;:::o;48141:115::-;48189:4;48232:16;;48213:15;:35;;48206:42;;48141:115;:::o;43841:47::-;43881:7;43841:47;:::o;32151:124::-;32215:7;32242:20;32254:7;32242:11;:20::i;:::-;:25;;;32235:32;;32151:124;;;:::o;45731:526::-;26058:1;26656:7;;:19;;26648:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26058:1;26789:7;:18;;;;23170:12:::1;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45842:9:::2;45828:23;;:10;:23;;;45820:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43770:1;46015:6;:27;;46007:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43715:4;46108:6;46092:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;46084:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46177:17;:15;:17::i;:::-;46169:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;46220:29;46230:10;46242:6;46220:9;:29::i;:::-;26014:1:::0;26968:7;:22;;;;45731:526;:::o;48264:104::-;48318:7;48345:15;48338:22;;48264:104;:::o;30892:221::-;30956:7;31001:1;30984:19;;:5;:19;;;;30976:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31077:12;:19;31090:5;31077:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31069:36;;31062:43;;30892:221;;;:::o;23590:103::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23655:30:::1;23682:1;23655:18;:30::i;:::-;23590:103::o:0;44795:928::-;44895:6;;44368:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44903:10;;44459:78;44478:11;44491:4;44524:10;44507:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;44497:39;;;;;;44459:18;:78::i;:::-;44451:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;26058:1:::1;26656:7;;:19;;26648:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26058:1;26789:7;:18;;;;44961:9:::2;44947:23;;:10;:23;;;44939:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45048:16;;45029:15;:35;;45021:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43770:1;45106:6;:27;;45098:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43825:3;43715:4;45209:27;;;;:::i;:::-;45199:6;45183:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:53;;45175:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;45311:9;45301:6;43881:7;45285:22;;;;:::i;:::-;:35;;45277:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;43770:1;45391:6;45368:8;:20;45377:10;45368:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:50;;45360:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;45538:1;45515:8;:20;45524:10;45515:20;;;;;;;;;;;;;;;;:24;45511:163;;;45598:6;45575:8;:20;45584:10;45575:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;45552:8;:20;45561:10;45552:20;;;;;;;;;;;;;;;:52;;;;45511:163;;;45656:6;45633:8;:20;45642:10;45633:20;;;;;;;;;;;;;;;:29;;;;45511:163;45686:29;45696:10;45708:6;45686:9;:29::i;:::-;26014:1:::1;26968:7;:22;;;;44795:928:::0;;;;;:::o;47567:106::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47654:11:::1;47641:10;:24;;;;47567:106:::0;:::o;46265:226::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46350:1:::1;46326:21;:25;46318:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46387:23;46413:21;46387:47;;46445:38;46455:10;46467:15;46445:9;:38::i;:::-;46307:184;46265:226::o:0;22939:87::-;22985:7;23012:6;;;;;;;;;;;23005:13;;22939:87;:::o;43726:45::-;43770:1;43726:45;:::o;32511:104::-;32567:13;32600:7;32593:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32511:104;:::o;34190:288::-;34297:12;:10;:12::i;:::-;34285:24;;:8;:24;;;;34277:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34398:8;34353:18;:32;34372:12;:10;:12::i;:::-;34353:32;;;;;;;;;;;;;;;:42;34386:8;34353:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34451:8;34422:48;;34437:12;:10;:12::i;:::-;34422:48;;;34461:8;34422:48;;;;;;:::i;:::-;;;;;;;;34190:288;;:::o;44716:71::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44775:4:::1;44764:8;;:15;;;;;;;;;;;;;;;;;;44716:71::o:0;43918:31::-;;;;:::o;44600:104::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44692:4:::1;44675:14;:21;;;;;;;;;;;;:::i;:::-;;44600:104:::0;:::o;35261:355::-;35420:28;35430:4;35436:2;35440:7;35420:9;:28::i;:::-;35481:48;35504:4;35510:2;35514:7;35523:5;35481:22;:48::i;:::-;35459:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35261:355;;;;:::o;47127:432::-;47200:13;47234:16;47242:7;47234;:16::i;:::-;47226:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47330:5;47318:17;;:8;;;;;;;;;;;:17;;;47315:70;;;47359:14;47352:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47315:70;47397:21;47421:10;:8;:10::i;:::-;47397:34;;47474:1;47455:7;47449:21;:26;;:102;;;;;;;;;;;;;;;;;47502:7;47511:24;47522:1;47512:7;:11;;;;:::i;:::-;47511:22;:24::i;:::-;47485:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47449:102;47442:109;;;47127:432;;;;:::o;46499:376::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43715:4:::1;46621:6;46605:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;46597:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46712:1;46699:9;46690:6;:18;;;;:::i;:::-;:23;46682:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46773:9;46768:100;46801:9;46792:6;:18;;;;:::i;:::-;46788:1;:22;46768:100;;;46832:24;46842:2;46846:9;46832;:24::i;:::-;46812:3;;;;;:::i;:::-;;;;46768:100;;;;46499:376:::0;;;:::o;43784:44::-;43825:3;43784:44;:::o;34549:164::-;34646:4;34670:18;:25;34689:5;34670:25;;;;;;;;;;;;;;;:35;34696:8;34670:35;;;;;;;;;;;;;;;;;;;;;;;;;34663:42;;34549:164;;;;:::o;23848:201::-;23170:12;:10;:12::i;:::-;23159:23;;:7;:5;:7::i;:::-;:23;;;23151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23957:1:::1;23937:22;;:8;:22;;;;23929:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24013:28;24032:8;24013:18;:28::i;:::-;23848:201:::0;:::o;21856:157::-;21941:4;21980:25;21965:40;;;:11;:40;;;;21958:47;;21856:157;;;:::o;18959:98::-;19012:7;19039:10;19032:17;;18959:98;:::o;35871:111::-;35928:4;35962:12;;35952:7;:22;35945:29;;35871:111;;;:::o;40791:196::-;40933:2;40906:15;:24;40922:7;40906:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40971:7;40967:2;40951:28;;40960:5;40951:28;;;;;;;;;;;;40791:196;;;:::o;38671:2002::-;38786:35;38824:20;38836:7;38824:11;:20::i;:::-;38786:58;;38857:22;38899:13;:18;;;38883:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;38958:12;:10;:12::i;:::-;38934:36;;:20;38946:7;38934:11;:20::i;:::-;:36;;;38883:87;:154;;;;38987:50;39004:13;:18;;;39024:12;:10;:12::i;:::-;38987:16;:50::i;:::-;38883:154;38857:181;;39059:17;39051:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39174:4;39152:26;;:13;:18;;;:26;;;39144:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39254:1;39240:16;;:2;:16;;;;39232:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39311:43;39333:4;39339:2;39343:7;39352:1;39311:21;:43::i;:::-;39419:49;39436:1;39440:7;39449:13;:18;;;39419:8;:49::i;:::-;39794:1;39764:12;:18;39777:4;39764:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39838:1;39810:12;:16;39823:2;39810:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39884:2;39856:11;:20;39868:7;39856:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39946:15;39901:11;:20;39913:7;39901:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40214:19;40246:1;40236:7;:11;40214:33;;40307:1;40266:43;;:11;:24;40278:11;40266:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40262:295;;;40334:20;40342:11;40334:7;:20::i;:::-;40330:212;;;40411:13;:18;;;40379:11;:24;40391:11;40379:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40494:13;:28;;;40452:11;:24;40464:11;40452:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40330:212;40262:295;39739:829;40604:7;40600:2;40585:27;;40594:4;40585:27;;;;;;;;;;;;40623:42;40644:4;40650:2;40654:7;40663:1;40623:20;:42::i;:::-;38775:1898;;38671:2002;;;:::o;31552:537::-;31613:21;;:::i;:::-;31655:16;31663:7;31655;:16::i;:::-;31647:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31761:12;31776:7;31761:22;;31756:245;31793:1;31785:4;:9;31756:245;;31823:31;31857:11;:17;31869:4;31857:17;;;;;;;;;;;31823:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31923:1;31897:28;;:9;:14;;;:28;;;31893:93;;31957:9;31950:16;;;;;;31893:93;31804:197;31796:6;;;;;;;;31756:245;;;;32024:57;;;;;;;;;;:::i;:::-;;;;;;;;31552:537;;;;:::o;35990:104::-;36059:27;36069:2;36073:8;36059:27;;;;;;;;;;;;:9;:27::i;:::-;35990:104;;:::o;24209:191::-;24283:16;24302:6;;;;;;;;;;;24283:25;;24328:8;24319:6;;:17;;;;;;;;;;;;;;;;;;24383:8;24352:40;;24373:8;24352:40;;;;;;;;;;;;24272:128;24209:191;:::o;797:190::-;922:4;975;946:25;959:5;966:4;946:12;:25::i;:::-;:33;939:40;;797:190;;;;;:::o;47681:180::-;47755:12;47773:8;:13;;47794:7;47773:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47754:52;;;47825:7;47817:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;47743:118;47681:180;;:::o;41552:804::-;41707:4;41728:15;:2;:13;;;:15::i;:::-;41724:625;;;41780:2;41764:36;;;41801:12;:10;:12::i;:::-;41815:4;41821:7;41830:5;41764:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41760:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42027:1;42010:6;:13;:18;42006:273;;;42053:61;;;;;;;;;;:::i;:::-;;;;;;;;42006:273;42229:6;42223:13;42214:6;42210:2;42206:15;42199:38;41760:534;41897:45;;;41887:55;;;:6;:55;;;;41880:62;;;;;41724:625;42333:4;42326:11;;41552:804;;;;;;;:::o;47002:117::-;47062:13;47095:16;47088:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47002:117;:::o;19399:723::-;19455:13;19685:1;19676:5;:10;19672:53;;;19703:10;;;;;;;;;;;;;;;;;;;;;19672:53;19735:12;19750:5;19735:20;;19766:14;19791:78;19806:1;19798:4;:9;19791:78;;19824:8;;;;;:::i;:::-;;;;19855:2;19847:10;;;;;:::i;:::-;;;19791:78;;;19879:19;19911:6;19901:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19879:39;;19929:154;19945:1;19936:5;:10;19929:154;;19973:1;19963:11;;;;;:::i;:::-;;;20040:2;20032:5;:10;;;;:::i;:::-;20019:2;:24;;;;:::i;:::-;20006:39;;19989:6;19996;19989:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20069:2;20060:11;;;;;:::i;:::-;;;19929:154;;;20107:6;20093:21;;;;;19399:723;;;;:::o;42844:159::-;;;;;:::o;43415:158::-;;;;;:::o;36457:163::-;36580:32;36586:2;36590:8;36600:5;36607:4;36580:5;:32::i;:::-;36457:163;;;:::o;1349:675::-;1432:7;1452:20;1475:4;1452:27;;1495:9;1490:497;1514:5;:12;1510:1;:16;1490:497;;;1548:20;1571:5;1577:1;1571:8;;;;;;;;:::i;:::-;;;;;;;;1548:31;;1614:12;1598;:28;1594:382;;1741:42;1756:12;1770;1741:14;:42::i;:::-;1726:57;;1594:382;;;1918:42;1933:12;1947;1918:14;:42::i;:::-;1903:57;;1594:382;1533:454;1528:3;;;;;:::i;:::-;;;;1490:497;;;;2004:12;1997:19;;;1349:675;;;;:::o;11149:326::-;11209:4;11466:1;11444:7;:19;;;:23;11437:30;;11149:326;;;:::o;36879:1538::-;37018:20;37041:12;;37018:35;;37086:1;37072:16;;:2;:16;;;;37064:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37157:1;37145:8;:13;;37137:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37216:61;37246:1;37250:2;37254:12;37268:8;37216:21;:61::i;:::-;37591:8;37555:12;:16;37568:2;37555:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37656:8;37615:12;:16;37628:2;37615:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37715:2;37682:11;:25;37694:12;37682:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37782:15;37732:11;:25;37744:12;37732:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37815:20;37838:12;37815:35;;37872:9;37867:415;37887:8;37883:1;:12;37867:415;;;37951:12;37947:2;37926:38;;37943:1;37926:38;;;;;;;;;;;;37987:4;37983:249;;;38050:59;38081:1;38085:2;38089:12;38103:5;38050:22;:59::i;:::-;38016:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;37983:249;38252:14;;;;;;;37897:3;;;;;;;37867:415;;;;38313:12;38298;:27;;;;37530:807;38349:60;38378:1;38382:2;38386:12;38400:8;38349:20;:60::i;:::-;37007:1410;36879:1538;;;;:::o;2032:224::-;2100:13;2163:1;2157:4;2150:15;2192:1;2186:4;2179:15;2233:4;2227;2217:21;2208:30;;2032:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:553::-;2580:8;2590:6;2640:3;2633:4;2625:6;2621:17;2617:27;2607:122;;2648:79;;:::i;:::-;2607:122;2761:6;2748:20;2738:30;;2791:18;2783:6;2780:30;2777:117;;;2813:79;;:::i;:::-;2777:117;2927:4;2919:6;2915:17;2903:29;;2981:3;2973:4;2965:6;2961:17;2951:8;2947:32;2944:41;2941:128;;;2988:79;;:::i;:::-;2941:128;2522:553;;;;;:::o;3095:340::-;3151:5;3200:3;3193:4;3185:6;3181:17;3177:27;3167:122;;3208:79;;:::i;:::-;3167:122;3325:6;3312:20;3350:79;3425:3;3417:6;3410:4;3402:6;3398:17;3350:79;:::i;:::-;3341:88;;3157:278;3095:340;;;;:::o;3441:139::-;3487:5;3525:6;3512:20;3503:29;;3541:33;3568:5;3541:33;:::i;:::-;3441:139;;;;:::o;3586:329::-;3645:6;3694:2;3682:9;3673:7;3669:23;3665:32;3662:119;;;3700:79;;:::i;:::-;3662:119;3820:1;3845:53;3890:7;3881:6;3870:9;3866:22;3845:53;:::i;:::-;3835:63;;3791:117;3586:329;;;;:::o;3921:474::-;3989:6;3997;4046:2;4034:9;4025:7;4021:23;4017:32;4014:119;;;4052:79;;:::i;:::-;4014:119;4172:1;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4143:117;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;3921:474;;;;;:::o;4401:619::-;4478:6;4486;4494;4543:2;4531:9;4522:7;4518:23;4514:32;4511:119;;;4549:79;;:::i;:::-;4511:119;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;4401:619;;;;;:::o;5026:943::-;5121:6;5129;5137;5145;5194:3;5182:9;5173:7;5169:23;5165:33;5162:120;;;5201:79;;:::i;:::-;5162:120;5321:1;5346:53;5391:7;5382:6;5371:9;5367:22;5346:53;:::i;:::-;5336:63;;5292:117;5448:2;5474:53;5519:7;5510:6;5499:9;5495:22;5474:53;:::i;:::-;5464:63;;5419:118;5576:2;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;:::i;:::-;5592:63;;5547:118;5732:2;5721:9;5717:18;5704:32;5763:18;5755:6;5752:30;5749:117;;;5785:79;;:::i;:::-;5749:117;5890:62;5944:7;5935:6;5924:9;5920:22;5890:62;:::i;:::-;5880:72;;5675:287;5026:943;;;;;;;:::o;5975:468::-;6040:6;6048;6097:2;6085:9;6076:7;6072:23;6068:32;6065:119;;;6103:79;;:::i;:::-;6065:119;6223:1;6248:53;6293:7;6284:6;6273:9;6269:22;6248:53;:::i;:::-;6238:63;;6194:117;6350:2;6376:50;6418:7;6409:6;6398:9;6394:22;6376:50;:::i;:::-;6366:60;;6321:115;5975:468;;;;;:::o;6449:474::-;6517:6;6525;6574:2;6562:9;6553:7;6549:23;6545:32;6542:119;;;6580:79;;:::i;:::-;6542:119;6700:1;6725:53;6770:7;6761:6;6750:9;6746:22;6725:53;:::i;:::-;6715:63;;6671:117;6827:2;6853:53;6898:7;6889:6;6878:9;6874:22;6853:53;:::i;:::-;6843:63;;6798:118;6449:474;;;;;:::o;6929:704::-;7024:6;7032;7040;7089:2;7077:9;7068:7;7064:23;7060:32;7057:119;;;7095:79;;:::i;:::-;7057:119;7243:1;7232:9;7228:17;7215:31;7273:18;7265:6;7262:30;7259:117;;;7295:79;;:::i;:::-;7259:117;7408:80;7480:7;7471:6;7460:9;7456:22;7408:80;:::i;:::-;7390:98;;;;7186:312;7537:2;7563:53;7608:7;7599:6;7588:9;7584:22;7563:53;:::i;:::-;7553:63;;7508:118;6929:704;;;;;:::o;7639:329::-;7698:6;7747:2;7735:9;7726:7;7722:23;7718:32;7715:119;;;7753:79;;:::i;:::-;7715:119;7873:1;7898:53;7943:7;7934:6;7923:9;7919:22;7898:53;:::i;:::-;7888:63;;7844:117;7639:329;;;;:::o;7974:327::-;8032:6;8081:2;8069:9;8060:7;8056:23;8052:32;8049:119;;;8087:79;;:::i;:::-;8049:119;8207:1;8232:52;8276:7;8267:6;8256:9;8252:22;8232:52;:::i;:::-;8222:62;;8178:116;7974:327;;;;:::o;8307:349::-;8376:6;8425:2;8413:9;8404:7;8400:23;8396:32;8393:119;;;8431:79;;:::i;:::-;8393:119;8551:1;8576:63;8631:7;8622:6;8611:9;8607:22;8576:63;:::i;:::-;8566:73;;8522:127;8307:349;;;;:::o;8662:529::-;8733:6;8741;8790:2;8778:9;8769:7;8765:23;8761:32;8758:119;;;8796:79;;:::i;:::-;8758:119;8944:1;8933:9;8929:17;8916:31;8974:18;8966:6;8963:30;8960:117;;;8996:79;;:::i;:::-;8960:117;9109:65;9166:7;9157:6;9146:9;9142:22;9109:65;:::i;:::-;9091:83;;;;8887:297;8662:529;;;;;:::o;9197:509::-;9266:6;9315:2;9303:9;9294:7;9290:23;9286:32;9283:119;;;9321:79;;:::i;:::-;9283:119;9469:1;9458:9;9454:17;9441:31;9499:18;9491:6;9488:30;9485:117;;;9521:79;;:::i;:::-;9485:117;9626:63;9681:7;9672:6;9661:9;9657:22;9626:63;:::i;:::-;9616:73;;9412:287;9197:509;;;;:::o;9712:329::-;9771:6;9820:2;9808:9;9799:7;9795:23;9791:32;9788:119;;;9826:79;;:::i;:::-;9788:119;9946:1;9971:53;10016:7;10007:6;9996:9;9992:22;9971:53;:::i;:::-;9961:63;;9917:117;9712:329;;;;:::o;10047:619::-;10124:6;10132;10140;10189:2;10177:9;10168:7;10164:23;10160:32;10157:119;;;10195:79;;:::i;:::-;10157:119;10315:1;10340:53;10385:7;10376:6;10365:9;10361:22;10340:53;:::i;:::-;10330:63;;10286:117;10442:2;10468:53;10513:7;10504:6;10493:9;10489:22;10468:53;:::i;:::-;10458:63;;10413:118;10570:2;10596:53;10641:7;10632:6;10621:9;10617:22;10596:53;:::i;:::-;10586:63;;10541:118;10047:619;;;;;:::o;10672:118::-;10759:24;10777:5;10759:24;:::i;:::-;10754:3;10747:37;10672:118;;:::o;10796:157::-;10901:45;10921:24;10939:5;10921:24;:::i;:::-;10901:45;:::i;:::-;10896:3;10889:58;10796:157;;:::o;10959:109::-;11040:21;11055:5;11040:21;:::i;:::-;11035:3;11028:34;10959:109;;:::o;11074:118::-;11161:24;11179:5;11161:24;:::i;:::-;11156:3;11149:37;11074:118;;:::o;11198:360::-;11284:3;11312:38;11344:5;11312:38;:::i;:::-;11366:70;11429:6;11424:3;11366:70;:::i;:::-;11359:77;;11445:52;11490:6;11485:3;11478:4;11471:5;11467:16;11445:52;:::i;:::-;11522:29;11544:6;11522:29;:::i;:::-;11517:3;11513:39;11506:46;;11288:270;11198:360;;;;:::o;11564:364::-;11652:3;11680:39;11713:5;11680:39;:::i;:::-;11735:71;11799:6;11794:3;11735:71;:::i;:::-;11728:78;;11815:52;11860:6;11855:3;11848:4;11841:5;11837:16;11815:52;:::i;:::-;11892:29;11914:6;11892:29;:::i;:::-;11887:3;11883:39;11876:46;;11656:272;11564:364;;;;:::o;11934:377::-;12040:3;12068:39;12101:5;12068:39;:::i;:::-;12123:89;12205:6;12200:3;12123:89;:::i;:::-;12116:96;;12221:52;12266:6;12261:3;12254:4;12247:5;12243:16;12221:52;:::i;:::-;12298:6;12293:3;12289:16;12282:23;;12044:267;11934:377;;;;:::o;12317:366::-;12459:3;12480:67;12544:2;12539:3;12480:67;:::i;:::-;12473:74;;12556:93;12645:3;12556:93;:::i;:::-;12674:2;12669:3;12665:12;12658:19;;12317:366;;;:::o;12689:::-;12831:3;12852:67;12916:2;12911:3;12852:67;:::i;:::-;12845:74;;12928:93;13017:3;12928:93;:::i;:::-;13046:2;13041:3;13037:12;13030:19;;12689:366;;;:::o;13061:::-;13203:3;13224:67;13288:2;13283:3;13224:67;:::i;:::-;13217:74;;13300:93;13389:3;13300:93;:::i;:::-;13418:2;13413:3;13409:12;13402:19;;13061:366;;;:::o;13433:::-;13575:3;13596:67;13660:2;13655:3;13596:67;:::i;:::-;13589:74;;13672:93;13761:3;13672:93;:::i;:::-;13790:2;13785:3;13781:12;13774:19;;13433:366;;;:::o;13805:::-;13947:3;13968:67;14032:2;14027:3;13968:67;:::i;:::-;13961:74;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13805:366;;;:::o;14177:::-;14319:3;14340:67;14404:2;14399:3;14340:67;:::i;:::-;14333:74;;14416:93;14505:3;14416:93;:::i;:::-;14534:2;14529:3;14525:12;14518:19;;14177:366;;;:::o;14549:::-;14691:3;14712:67;14776:2;14771:3;14712:67;:::i;:::-;14705:74;;14788:93;14877:3;14788:93;:::i;:::-;14906:2;14901:3;14897:12;14890:19;;14549:366;;;:::o;14921:::-;15063:3;15084:67;15148:2;15143:3;15084:67;:::i;:::-;15077:74;;15160:93;15249:3;15160:93;:::i;:::-;15278:2;15273:3;15269:12;15262:19;;14921:366;;;:::o;15293:::-;15435:3;15456:67;15520:2;15515:3;15456:67;:::i;:::-;15449:74;;15532:93;15621:3;15532:93;:::i;:::-;15650:2;15645:3;15641:12;15634:19;;15293:366;;;:::o;15665:::-;15807:3;15828:67;15892:2;15887:3;15828:67;:::i;:::-;15821:74;;15904:93;15993:3;15904:93;:::i;:::-;16022:2;16017:3;16013:12;16006:19;;15665:366;;;:::o;16037:::-;16179:3;16200:67;16264:2;16259:3;16200:67;:::i;:::-;16193:74;;16276:93;16365:3;16276:93;:::i;:::-;16394:2;16389:3;16385:12;16378:19;;16037:366;;;:::o;16409:::-;16551:3;16572:67;16636:2;16631:3;16572:67;:::i;:::-;16565:74;;16648:93;16737:3;16648:93;:::i;:::-;16766:2;16761:3;16757:12;16750:19;;16409:366;;;:::o;16781:::-;16923:3;16944:67;17008:2;17003:3;16944:67;:::i;:::-;16937:74;;17020:93;17109:3;17020:93;:::i;:::-;17138:2;17133:3;17129:12;17122:19;;16781:366;;;:::o;17153:::-;17295:3;17316:67;17380:2;17375:3;17316:67;:::i;:::-;17309:74;;17392:93;17481:3;17392:93;:::i;:::-;17510:2;17505:3;17501:12;17494:19;;17153:366;;;:::o;17525:::-;17667:3;17688:67;17752:2;17747:3;17688:67;:::i;:::-;17681:74;;17764:93;17853:3;17764:93;:::i;:::-;17882:2;17877:3;17873:12;17866:19;;17525:366;;;:::o;17897:::-;18039:3;18060:67;18124:2;18119:3;18060:67;:::i;:::-;18053:74;;18136:93;18225:3;18136:93;:::i;:::-;18254:2;18249:3;18245:12;18238:19;;17897:366;;;:::o;18269:400::-;18429:3;18450:84;18532:1;18527:3;18450:84;:::i;:::-;18443:91;;18543:93;18632:3;18543:93;:::i;:::-;18661:1;18656:3;18652:11;18645:18;;18269:400;;;:::o;18675:366::-;18817:3;18838:67;18902:2;18897:3;18838:67;:::i;:::-;18831:74;;18914:93;19003:3;18914:93;:::i;:::-;19032:2;19027:3;19023:12;19016:19;;18675:366;;;:::o;19047:::-;19189:3;19210:67;19274:2;19269:3;19210:67;:::i;:::-;19203:74;;19286:93;19375:3;19286:93;:::i;:::-;19404:2;19399:3;19395:12;19388:19;;19047:366;;;:::o;19419:::-;19561:3;19582:67;19646:2;19641:3;19582:67;:::i;:::-;19575:74;;19658:93;19747:3;19658:93;:::i;:::-;19776:2;19771:3;19767:12;19760:19;;19419:366;;;:::o;19791:::-;19933:3;19954:67;20018:2;20013:3;19954:67;:::i;:::-;19947:74;;20030:93;20119:3;20030:93;:::i;:::-;20148:2;20143:3;20139:12;20132:19;;19791:366;;;:::o;20163:::-;20305:3;20326:67;20390:2;20385:3;20326:67;:::i;:::-;20319:74;;20402:93;20491:3;20402:93;:::i;:::-;20520:2;20515:3;20511:12;20504:19;;20163:366;;;:::o;20535:398::-;20694:3;20715:83;20796:1;20791:3;20715:83;:::i;:::-;20708:90;;20807:93;20896:3;20807:93;:::i;:::-;20925:1;20920:3;20916:11;20909:18;;20535:398;;;:::o;20939:366::-;21081:3;21102:67;21166:2;21161:3;21102:67;:::i;:::-;21095:74;;21178:93;21267:3;21178:93;:::i;:::-;21296:2;21291:3;21287:12;21280:19;;20939:366;;;:::o;21311:::-;21453:3;21474:67;21538:2;21533:3;21474:67;:::i;:::-;21467:74;;21550:93;21639:3;21550:93;:::i;:::-;21668:2;21663:3;21659:12;21652:19;;21311:366;;;:::o;21683:::-;21825:3;21846:67;21910:2;21905:3;21846:67;:::i;:::-;21839:74;;21922:93;22011:3;21922:93;:::i;:::-;22040:2;22035:3;22031:12;22024:19;;21683:366;;;:::o;22055:::-;22197:3;22218:67;22282:2;22277:3;22218:67;:::i;:::-;22211:74;;22294:93;22383:3;22294:93;:::i;:::-;22412:2;22407:3;22403:12;22396:19;;22055:366;;;:::o;22427:::-;22569:3;22590:67;22654:2;22649:3;22590:67;:::i;:::-;22583:74;;22666:93;22755:3;22666:93;:::i;:::-;22784:2;22779:3;22775:12;22768:19;;22427:366;;;:::o;22799:::-;22941:3;22962:67;23026:2;23021:3;22962:67;:::i;:::-;22955:74;;23038:93;23127:3;23038:93;:::i;:::-;23156:2;23151:3;23147:12;23140:19;;22799:366;;;:::o;23171:::-;23313:3;23334:67;23398:2;23393:3;23334:67;:::i;:::-;23327:74;;23410:93;23499:3;23410:93;:::i;:::-;23528:2;23523:3;23519:12;23512:19;;23171:366;;;:::o;23543:::-;23685:3;23706:67;23770:2;23765:3;23706:67;:::i;:::-;23699:74;;23782:93;23871:3;23782:93;:::i;:::-;23900:2;23895:3;23891:12;23884:19;;23543:366;;;:::o;23915:::-;24057:3;24078:67;24142:2;24137:3;24078:67;:::i;:::-;24071:74;;24154:93;24243:3;24154:93;:::i;:::-;24272:2;24267:3;24263:12;24256:19;;23915:366;;;:::o;24287:::-;24429:3;24450:67;24514:2;24509:3;24450:67;:::i;:::-;24443:74;;24526:93;24615:3;24526:93;:::i;:::-;24644:2;24639:3;24635:12;24628:19;;24287:366;;;:::o;24659:118::-;24746:24;24764:5;24746:24;:::i;:::-;24741:3;24734:37;24659:118;;:::o;24783:256::-;24895:3;24910:75;24981:3;24972:6;24910:75;:::i;:::-;25010:2;25005:3;25001:12;24994:19;;25030:3;25023:10;;24783:256;;;;:::o;25045:701::-;25326:3;25348:95;25439:3;25430:6;25348:95;:::i;:::-;25341:102;;25460:95;25551:3;25542:6;25460:95;:::i;:::-;25453:102;;25572:148;25716:3;25572:148;:::i;:::-;25565:155;;25737:3;25730:10;;25045:701;;;;;:::o;25752:379::-;25936:3;25958:147;26101:3;25958:147;:::i;:::-;25951:154;;26122:3;26115:10;;25752:379;;;:::o;26137:222::-;26230:4;26268:2;26257:9;26253:18;26245:26;;26281:71;26349:1;26338:9;26334:17;26325:6;26281:71;:::i;:::-;26137:222;;;;:::o;26365:640::-;26560:4;26598:3;26587:9;26583:19;26575:27;;26612:71;26680:1;26669:9;26665:17;26656:6;26612:71;:::i;:::-;26693:72;26761:2;26750:9;26746:18;26737:6;26693:72;:::i;:::-;26775;26843:2;26832:9;26828:18;26819:6;26775:72;:::i;:::-;26894:9;26888:4;26884:20;26879:2;26868:9;26864:18;26857:48;26922:76;26993:4;26984:6;26922:76;:::i;:::-;26914:84;;26365:640;;;;;;;:::o;27011:210::-;27098:4;27136:2;27125:9;27121:18;27113:26;;27149:65;27211:1;27200:9;27196:17;27187:6;27149:65;:::i;:::-;27011:210;;;;:::o;27227:222::-;27320:4;27358:2;27347:9;27343:18;27335:26;;27371:71;27439:1;27428:9;27424:17;27415:6;27371:71;:::i;:::-;27227:222;;;;:::o;27455:313::-;27568:4;27606:2;27595:9;27591:18;27583:26;;27655:9;27649:4;27645:20;27641:1;27630:9;27626:17;27619:47;27683:78;27756:4;27747:6;27683:78;:::i;:::-;27675:86;;27455:313;;;;:::o;27774:419::-;27940:4;27978:2;27967:9;27963:18;27955:26;;28027:9;28021:4;28017:20;28013:1;28002:9;27998:17;27991:47;28055:131;28181:4;28055:131;:::i;:::-;28047:139;;27774:419;;;:::o;28199:::-;28365:4;28403:2;28392:9;28388:18;28380:26;;28452:9;28446:4;28442:20;28438:1;28427:9;28423:17;28416:47;28480:131;28606:4;28480:131;:::i;:::-;28472:139;;28199:419;;;:::o;28624:::-;28790:4;28828:2;28817:9;28813:18;28805:26;;28877:9;28871:4;28867:20;28863:1;28852:9;28848:17;28841:47;28905:131;29031:4;28905:131;:::i;:::-;28897:139;;28624:419;;;:::o;29049:::-;29215:4;29253:2;29242:9;29238:18;29230:26;;29302:9;29296:4;29292:20;29288:1;29277:9;29273:17;29266:47;29330:131;29456:4;29330:131;:::i;:::-;29322:139;;29049:419;;;:::o;29474:::-;29640:4;29678:2;29667:9;29663:18;29655:26;;29727:9;29721:4;29717:20;29713:1;29702:9;29698:17;29691:47;29755:131;29881:4;29755:131;:::i;:::-;29747:139;;29474:419;;;:::o;29899:::-;30065:4;30103:2;30092:9;30088:18;30080:26;;30152:9;30146:4;30142:20;30138:1;30127:9;30123:17;30116:47;30180:131;30306:4;30180:131;:::i;:::-;30172:139;;29899:419;;;:::o;30324:::-;30490:4;30528:2;30517:9;30513:18;30505:26;;30577:9;30571:4;30567:20;30563:1;30552:9;30548:17;30541:47;30605:131;30731:4;30605:131;:::i;:::-;30597:139;;30324:419;;;:::o;30749:::-;30915:4;30953:2;30942:9;30938:18;30930:26;;31002:9;30996:4;30992:20;30988:1;30977:9;30973:17;30966:47;31030:131;31156:4;31030:131;:::i;:::-;31022:139;;30749:419;;;:::o;31174:::-;31340:4;31378:2;31367:9;31363:18;31355:26;;31427:9;31421:4;31417:20;31413:1;31402:9;31398:17;31391:47;31455:131;31581:4;31455:131;:::i;:::-;31447:139;;31174:419;;;:::o;31599:::-;31765:4;31803:2;31792:9;31788:18;31780:26;;31852:9;31846:4;31842:20;31838:1;31827:9;31823:17;31816:47;31880:131;32006:4;31880:131;:::i;:::-;31872:139;;31599:419;;;:::o;32024:::-;32190:4;32228:2;32217:9;32213:18;32205:26;;32277:9;32271:4;32267:20;32263:1;32252:9;32248:17;32241:47;32305:131;32431:4;32305:131;:::i;:::-;32297:139;;32024:419;;;:::o;32449:::-;32615:4;32653:2;32642:9;32638:18;32630:26;;32702:9;32696:4;32692:20;32688:1;32677:9;32673:17;32666:47;32730:131;32856:4;32730:131;:::i;:::-;32722:139;;32449:419;;;:::o;32874:::-;33040:4;33078:2;33067:9;33063:18;33055:26;;33127:9;33121:4;33117:20;33113:1;33102:9;33098:17;33091:47;33155:131;33281:4;33155:131;:::i;:::-;33147:139;;32874:419;;;:::o;33299:::-;33465:4;33503:2;33492:9;33488:18;33480:26;;33552:9;33546:4;33542:20;33538:1;33527:9;33523:17;33516:47;33580:131;33706:4;33580:131;:::i;:::-;33572:139;;33299:419;;;:::o;33724:::-;33890:4;33928:2;33917:9;33913:18;33905:26;;33977:9;33971:4;33967:20;33963:1;33952:9;33948:17;33941:47;34005:131;34131:4;34005:131;:::i;:::-;33997:139;;33724:419;;;:::o;34149:::-;34315:4;34353:2;34342:9;34338:18;34330:26;;34402:9;34396:4;34392:20;34388:1;34377:9;34373:17;34366:47;34430:131;34556:4;34430:131;:::i;:::-;34422:139;;34149:419;;;:::o;34574:::-;34740:4;34778:2;34767:9;34763:18;34755:26;;34827:9;34821:4;34817:20;34813:1;34802:9;34798:17;34791:47;34855:131;34981:4;34855:131;:::i;:::-;34847:139;;34574:419;;;:::o;34999:::-;35165:4;35203:2;35192:9;35188:18;35180:26;;35252:9;35246:4;35242:20;35238:1;35227:9;35223:17;35216:47;35280:131;35406:4;35280:131;:::i;:::-;35272:139;;34999:419;;;:::o;35424:::-;35590:4;35628:2;35617:9;35613:18;35605:26;;35677:9;35671:4;35667:20;35663:1;35652:9;35648:17;35641:47;35705:131;35831:4;35705:131;:::i;:::-;35697:139;;35424:419;;;:::o;35849:::-;36015:4;36053:2;36042:9;36038:18;36030:26;;36102:9;36096:4;36092:20;36088:1;36077:9;36073:17;36066:47;36130:131;36256:4;36130:131;:::i;:::-;36122:139;;35849:419;;;:::o;36274:::-;36440:4;36478:2;36467:9;36463:18;36455:26;;36527:9;36521:4;36517:20;36513:1;36502:9;36498:17;36491:47;36555:131;36681:4;36555:131;:::i;:::-;36547:139;;36274:419;;;:::o;36699:::-;36865:4;36903:2;36892:9;36888:18;36880:26;;36952:9;36946:4;36942:20;36938:1;36927:9;36923:17;36916:47;36980:131;37106:4;36980:131;:::i;:::-;36972:139;;36699:419;;;:::o;37124:::-;37290:4;37328:2;37317:9;37313:18;37305:26;;37377:9;37371:4;37367:20;37363:1;37352:9;37348:17;37341:47;37405:131;37531:4;37405:131;:::i;:::-;37397:139;;37124:419;;;:::o;37549:::-;37715:4;37753:2;37742:9;37738:18;37730:26;;37802:9;37796:4;37792:20;37788:1;37777:9;37773:17;37766:47;37830:131;37956:4;37830:131;:::i;:::-;37822:139;;37549:419;;;:::o;37974:::-;38140:4;38178:2;38167:9;38163:18;38155:26;;38227:9;38221:4;38217:20;38213:1;38202:9;38198:17;38191:47;38255:131;38381:4;38255:131;:::i;:::-;38247:139;;37974:419;;;:::o;38399:::-;38565:4;38603:2;38592:9;38588:18;38580:26;;38652:9;38646:4;38642:20;38638:1;38627:9;38623:17;38616:47;38680:131;38806:4;38680:131;:::i;:::-;38672:139;;38399:419;;;:::o;38824:::-;38990:4;39028:2;39017:9;39013:18;39005:26;;39077:9;39071:4;39067:20;39063:1;39052:9;39048:17;39041:47;39105:131;39231:4;39105:131;:::i;:::-;39097:139;;38824:419;;;:::o;39249:::-;39415:4;39453:2;39442:9;39438:18;39430:26;;39502:9;39496:4;39492:20;39488:1;39477:9;39473:17;39466:47;39530:131;39656:4;39530:131;:::i;:::-;39522:139;;39249:419;;;:::o;39674:::-;39840:4;39878:2;39867:9;39863:18;39855:26;;39927:9;39921:4;39917:20;39913:1;39902:9;39898:17;39891:47;39955:131;40081:4;39955:131;:::i;:::-;39947:139;;39674:419;;;:::o;40099:::-;40265:4;40303:2;40292:9;40288:18;40280:26;;40352:9;40346:4;40342:20;40338:1;40327:9;40323:17;40316:47;40380:131;40506:4;40380:131;:::i;:::-;40372:139;;40099:419;;;:::o;40524:::-;40690:4;40728:2;40717:9;40713:18;40705:26;;40777:9;40771:4;40767:20;40763:1;40752:9;40748:17;40741:47;40805:131;40931:4;40805:131;:::i;:::-;40797:139;;40524:419;;;:::o;40949:222::-;41042:4;41080:2;41069:9;41065:18;41057:26;;41093:71;41161:1;41150:9;41146:17;41137:6;41093:71;:::i;:::-;40949:222;;;;:::o;41177:129::-;41211:6;41238:20;;:::i;:::-;41228:30;;41267:33;41295:4;41287:6;41267:33;:::i;:::-;41177:129;;;:::o;41312:75::-;41345:6;41378:2;41372:9;41362:19;;41312:75;:::o;41393:307::-;41454:4;41544:18;41536:6;41533:30;41530:56;;;41566:18;;:::i;:::-;41530:56;41604:29;41626:6;41604:29;:::i;:::-;41596:37;;41688:4;41682;41678:15;41670:23;;41393:307;;;:::o;41706:308::-;41768:4;41858:18;41850:6;41847:30;41844:56;;;41880:18;;:::i;:::-;41844:56;41918:29;41940:6;41918:29;:::i;:::-;41910:37;;42002:4;41996;41992:15;41984:23;;41706:308;;;:::o;42020:98::-;42071:6;42105:5;42099:12;42089:22;;42020:98;;;:::o;42124:99::-;42176:6;42210:5;42204:12;42194:22;;42124:99;;;:::o;42229:168::-;42312:11;42346:6;42341:3;42334:19;42386:4;42381:3;42377:14;42362:29;;42229:168;;;;:::o;42403:147::-;42504:11;42541:3;42526:18;;42403:147;;;;:::o;42556:169::-;42640:11;42674:6;42669:3;42662:19;42714:4;42709:3;42705:14;42690:29;;42556:169;;;;:::o;42731:148::-;42833:11;42870:3;42855:18;;42731:148;;;;:::o;42885:305::-;42925:3;42944:20;42962:1;42944:20;:::i;:::-;42939:25;;42978:20;42996:1;42978:20;:::i;:::-;42973:25;;43132:1;43064:66;43060:74;43057:1;43054:81;43051:107;;;43138:18;;:::i;:::-;43051:107;43182:1;43179;43175:9;43168:16;;42885:305;;;;:::o;43196:185::-;43236:1;43253:20;43271:1;43253:20;:::i;:::-;43248:25;;43287:20;43305:1;43287:20;:::i;:::-;43282:25;;43326:1;43316:35;;43331:18;;:::i;:::-;43316:35;43373:1;43370;43366:9;43361:14;;43196:185;;;;:::o;43387:348::-;43427:7;43450:20;43468:1;43450:20;:::i;:::-;43445:25;;43484:20;43502:1;43484:20;:::i;:::-;43479:25;;43672:1;43604:66;43600:74;43597:1;43594:81;43589:1;43582:9;43575:17;43571:105;43568:131;;;43679:18;;:::i;:::-;43568:131;43727:1;43724;43720:9;43709:20;;43387:348;;;;:::o;43741:191::-;43781:4;43801:20;43819:1;43801:20;:::i;:::-;43796:25;;43835:20;43853:1;43835:20;:::i;:::-;43830:25;;43874:1;43871;43868:8;43865:34;;;43879:18;;:::i;:::-;43865:34;43924:1;43921;43917:9;43909:17;;43741:191;;;;:::o;43938:96::-;43975:7;44004:24;44022:5;44004:24;:::i;:::-;43993:35;;43938:96;;;:::o;44040:90::-;44074:7;44117:5;44110:13;44103:21;44092:32;;44040:90;;;:::o;44136:77::-;44173:7;44202:5;44191:16;;44136:77;;;:::o;44219:149::-;44255:7;44295:66;44288:5;44284:78;44273:89;;44219:149;;;:::o;44374:126::-;44411:7;44451:42;44444:5;44440:54;44429:65;;44374:126;;;:::o;44506:77::-;44543:7;44572:5;44561:16;;44506:77;;;:::o;44589:154::-;44673:6;44668:3;44663;44650:30;44735:1;44726:6;44721:3;44717:16;44710:27;44589:154;;;:::o;44749:307::-;44817:1;44827:113;44841:6;44838:1;44835:13;44827:113;;;44926:1;44921:3;44917:11;44911:18;44907:1;44902:3;44898:11;44891:39;44863:2;44860:1;44856:10;44851:15;;44827:113;;;44958:6;44955:1;44952:13;44949:101;;;45038:1;45029:6;45024:3;45020:16;45013:27;44949:101;44798:258;44749:307;;;:::o;45062:320::-;45106:6;45143:1;45137:4;45133:12;45123:22;;45190:1;45184:4;45180:12;45211:18;45201:81;;45267:4;45259:6;45255:17;45245:27;;45201:81;45329:2;45321:6;45318:14;45298:18;45295:38;45292:84;;;45348:18;;:::i;:::-;45292:84;45113:269;45062:320;;;:::o;45388:281::-;45471:27;45493:4;45471:27;:::i;:::-;45463:6;45459:40;45601:6;45589:10;45586:22;45565:18;45553:10;45550:34;45547:62;45544:88;;;45612:18;;:::i;:::-;45544:88;45652:10;45648:2;45641:22;45431:238;45388:281;;:::o;45675:233::-;45714:3;45737:24;45755:5;45737:24;:::i;:::-;45728:33;;45783:66;45776:5;45773:77;45770:103;;;45853:18;;:::i;:::-;45770:103;45900:1;45893:5;45889:13;45882:20;;45675:233;;;:::o;45914:100::-;45953:7;45982:26;46002:5;45982:26;:::i;:::-;45971:37;;45914:100;;;:::o;46020:94::-;46059:7;46088:20;46102:5;46088:20;:::i;:::-;46077:31;;46020:94;;;:::o;46120:176::-;46152:1;46169:20;46187:1;46169:20;:::i;:::-;46164:25;;46203:20;46221:1;46203:20;:::i;:::-;46198:25;;46242:1;46232:35;;46247:18;;:::i;:::-;46232:35;46288:1;46285;46281:9;46276:14;;46120:176;;;;:::o;46302:180::-;46350:77;46347:1;46340:88;46447:4;46444:1;46437:15;46471:4;46468:1;46461:15;46488:180;46536:77;46533:1;46526:88;46633:4;46630:1;46623:15;46657:4;46654:1;46647:15;46674:180;46722:77;46719:1;46712:88;46819:4;46816:1;46809:15;46843:4;46840:1;46833:15;46860:180;46908:77;46905:1;46898:88;47005:4;47002:1;46995:15;47029:4;47026:1;47019:15;47046:180;47094:77;47091:1;47084:88;47191:4;47188:1;47181:15;47215:4;47212:1;47205:15;47232:117;47341:1;47338;47331:12;47355:117;47464:1;47461;47454:12;47478:117;47587:1;47584;47577:12;47601:117;47710:1;47707;47700:12;47724:117;47833:1;47830;47823:12;47847:117;47956:1;47953;47946:12;47970:102;48011:6;48062:2;48058:7;48053:2;48046:5;48042:14;48038:28;48028:38;;47970:102;;;:::o;48078:94::-;48111:8;48159:5;48155:2;48151:14;48130:35;;48078:94;;;:::o;48178:221::-;48318:34;48314:1;48306:6;48302:14;48295:58;48387:4;48382:2;48374:6;48370:15;48363:29;48178:221;:::o;48405:176::-;48545:28;48541:1;48533:6;48529:14;48522:52;48405:176;:::o;48587:160::-;48727:12;48723:1;48715:6;48711:14;48704:36;48587:160;:::o;48753:225::-;48893:34;48889:1;48881:6;48877:14;48870:58;48962:8;48957:2;48949:6;48945:15;48938:33;48753:225;:::o;48984:229::-;49124:34;49120:1;49112:6;49108:14;49101:58;49193:12;49188:2;49180:6;49176:15;49169:37;48984:229;:::o;49219:176::-;49359:28;49355:1;49347:6;49343:14;49336:52;49219:176;:::o;49401:222::-;49541:34;49537:1;49529:6;49525:14;49518:58;49610:5;49605:2;49597:6;49593:15;49586:30;49401:222;:::o;49629:224::-;49769:34;49765:1;49757:6;49753:14;49746:58;49838:7;49833:2;49825:6;49821:15;49814:32;49629:224;:::o;49859:174::-;49999:26;49995:1;49987:6;49983:14;49976:50;49859:174;:::o;50039:168::-;50179:20;50175:1;50167:6;50163:14;50156:44;50039:168;:::o;50213:170::-;50353:22;50349:1;50341:6;50337:14;50330:46;50213:170;:::o;50389:180::-;50529:32;50525:1;50517:6;50513:14;50506:56;50389:180;:::o;50575:244::-;50715:34;50711:1;50703:6;50699:14;50692:58;50784:27;50779:2;50771:6;50767:15;50760:52;50575:244;:::o;50825:230::-;50965:34;50961:1;50953:6;50949:14;50942:58;51034:13;51029:2;51021:6;51017:15;51010:38;50825:230;:::o;51061:175::-;51201:27;51197:1;51189:6;51185:14;51178:51;51061:175;:::o;51242:225::-;51382:34;51378:1;51370:6;51366:14;51359:58;51451:8;51446:2;51438:6;51434:15;51427:33;51242:225;:::o;51473:155::-;51613:7;51609:1;51601:6;51597:14;51590:31;51473:155;:::o;51634:182::-;51774:34;51770:1;51762:6;51758:14;51751:58;51634:182;:::o;51822:234::-;51962:34;51958:1;51950:6;51946:14;51939:58;52031:17;52026:2;52018:6;52014:15;52007:42;51822:234;:::o;52062:176::-;52202:28;52198:1;52190:6;52186:14;52179:52;52062:176;:::o;52244:237::-;52384:34;52380:1;52372:6;52368:14;52361:58;52453:20;52448:2;52440:6;52436:15;52429:45;52244:237;:::o;52487:221::-;52627:34;52623:1;52615:6;52611:14;52604:58;52696:4;52691:2;52683:6;52679:15;52672:29;52487:221;:::o;52714:114::-;;:::o;52834:166::-;52974:18;52970:1;52962:6;52958:14;52951:42;52834:166;:::o;53006:238::-;53146:34;53142:1;53134:6;53130:14;53123:58;53215:21;53210:2;53202:6;53198:15;53191:46;53006:238;:::o;53250:220::-;53390:34;53386:1;53378:6;53374:14;53367:58;53459:3;53454:2;53446:6;53442:15;53435:28;53250:220;:::o;53476:227::-;53616:34;53612:1;53604:6;53600:14;53593:58;53685:10;53680:2;53672:6;53668:15;53661:35;53476:227;:::o;53709:224::-;53849:34;53845:1;53837:6;53833:14;53826:58;53918:7;53913:2;53905:6;53901:15;53894:32;53709:224;:::o;53939:233::-;54079:34;54075:1;54067:6;54063:14;54056:58;54148:16;54143:2;54135:6;54131:15;54124:41;53939:233;:::o;54178:181::-;54318:33;54314:1;54306:6;54302:14;54295:57;54178:181;:::o;54365:234::-;54505:34;54501:1;54493:6;54489:14;54482:58;54574:17;54569:2;54561:6;54557:15;54550:42;54365:234;:::o;54605:232::-;54745:34;54741:1;54733:6;54729:14;54722:58;54814:15;54809:2;54801:6;54797:15;54790:40;54605:232;:::o;54843:222::-;54983:34;54979:1;54971:6;54967:14;54960:58;55052:5;55047:2;55039:6;55035:15;55028:30;54843:222;:::o;55071:122::-;55144:24;55162:5;55144:24;:::i;:::-;55137:5;55134:35;55124:63;;55183:1;55180;55173:12;55124:63;55071:122;:::o;55199:116::-;55269:21;55284:5;55269:21;:::i;:::-;55262:5;55259:32;55249:60;;55305:1;55302;55295:12;55249:60;55199:116;:::o;55321:122::-;55394:24;55412:5;55394:24;:::i;:::-;55387:5;55384:35;55374:63;;55433:1;55430;55423:12;55374:63;55321:122;:::o;55449:120::-;55521:23;55538:5;55521:23;:::i;:::-;55514:5;55511:34;55501:62;;55559:1;55556;55549:12;55501:62;55449:120;:::o;55575:122::-;55648:24;55666:5;55648:24;:::i;:::-;55641:5;55638:35;55628:63;;55687:1;55684;55677:12;55628:63;55575:122;:::o

Swarm Source

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