ETH Price: $3,286.41 (+1.20%)
Gas: 1 Gwei

Token

Genesis NFT (GNSS)
 

Overview

Max Total Supply

151 GNSS

Holders

74

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GNSS
0x1d86de65276b7e79018e5a7d3c22513cf27c52b8
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:
GenesisNode

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// SPDX-License-Identifier: MIT

// Designed by @crypt0xa

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


interface IRewardPool {
    function addNodeInfo(uint _nftId, uint _nodeType, address _owner) external returns (bool);
    function updateNodeOwner(uint _nftId, address _owner) external returns (bool);
}

interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


pragma solidity ^0.8.7;


contract ControlledAccess is Ownable {
    
    
   /* 
    * @dev Requires msg.sender to have valid access message.
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    */
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) 
    {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), "Not valid Message");
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(
        address _add,
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s

        ) 
        public view returns (bool)

    {
        bytes32 msgHash = keccak256(abi.encodePacked(address(this), _add));

        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, msgHash));
                
        address _recovered = ecrecover(prefixedHash, _v, _r, _s);
        if (owner() == _recovered)
            {
                return true;
            }
            return false;
    }
}



pragma solidity >=0.7.0 <0.9.0;

contract GenesisNode is ERC721Enumerable, Ownable, ControlledAccess{
    using Strings for uint256;
    string baseURI;
    string public baseExtension = ".json";
    uint256 public maxSupply = 10000000;
    uint256 public timeDeployed;
    uint256 public allowMintingAfter = 0;
    address public Genesis;
    bool public isPaused = false;
    address public rewardPool;
    uint[5] public nodeCount = [0,0,0,0,0];
    mapping(uint256 => uint) public nodeType;
    uint[5] public maxSupplyPerNode = [2000,2000,2000,2000,2000];
    // tax in 1e4 (10000 = 100%)
    uint256 public tax;
    uint256[5] public mintPrices=[0,0,0,0,0];
    mapping(uint => uint256) public mintTime;
    uint256 private evolutionTime = 60 * 60 * 24 * 5;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        uint256 _revealTime,
        address _GenesisAddress
    ) ERC721(_name, _symbol) {
        if (_revealTime > block.timestamp) {
            allowMintingAfter = _revealTime;
        }
        Genesis = _GenesisAddress;
        timeDeployed = block.timestamp;
        setBaseURI(_initBaseURI);
    }

    modifier onlyRewardPool() {
        require(rewardPool == msg.sender, "Ownable: caller is not the rewardPool");
        _;
    }


    receive() external payable {

  	}

    function getMintPrices() public view returns (uint256[5] memory) {
        return mintPrices;
    }

    function updateMaxSupplyPerNode(uint256[5] memory _newMaxSupplyPerNode) public onlyOwner {
        maxSupplyPerNode = _newMaxSupplyPerNode;
    }

    function updateMintPrices(uint256[5] memory _prices) public onlyOwner{
        mintPrices = _prices;
    }

    function setRewardPool(address _rewardPool) public onlyOwner{
        rewardPool = _rewardPool;
    }

    function updateTax(uint256 _tax) public onlyOwner{
        tax = _tax;
    }

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

    function updateGenesisAddress( address _GenesisAddress) public onlyOwner{
        Genesis = _GenesisAddress;
    }

    // public
    function _mint(uint _type, address to) internal{
        require(
            block.timestamp >= allowMintingAfter,
            "Minting now allowed yet"
        );
        require(_type>0 && _type<=5, "Invalid node type");
        require(
            nodeCount[_type-1] <= maxSupplyPerNode[_type-1],
            "Max supply reached"
        );
        require(!isPaused);
        uint256 supply = totalSupply();
        require(supply + 1 <= maxSupply);

        nodeCount[_type-1] += 1;
        nodeType[supply+1] = _type;
        mintTime[supply+1] = block.timestamp;
        
        _safeMint(to, supply + 1);
    }

    function mintFromRewards(uint _type, address to) public onlyRewardPool{
        _mint(_type, to);
    }

    function mintForAirdrop(uint _type, address to) public onlyOwner{
        _mint(_type, to);
    }


    function mint(uint _type) public {
        uint256 price = mintPrices[_type-1];
        uint256 _tax = (price*tax)/10000;

        if (msg.sender != owner()) {
            require(IERC20(Genesis).transferFrom(msg.sender, address(this), price), "Not enough funds");
            IERC20(Genesis).transfer(rewardPool, price-_tax);
        }
        _mint(_type, msg.sender);
    }

       
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function _calculateStage(uint _nftId) internal view returns (uint256) {
        uint256 nftMintTime = mintTime[_nftId];
        uint256 currentTime = block.timestamp;
        uint256 timeDifference = currentTime - nftMintTime;
        uint256 stage = (timeDifference / (evolutionTime))+1;
        
        if (stage > 6) {
            return 7;
        }
        else {
            return stage;
        }
    }


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

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        nodeType[tokenId].toString(),
                        "/",
                        _calculateStage(tokenId).toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function getSecondsUntilMinting() public view returns (uint256) {
        if (block.timestamp < allowMintingAfter) {
            return (allowMintingAfter) - block.timestamp;
        } else {
            return 0;
        }
    }


    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setIsPaused(bool _state) public onlyOwner {
        isPaused = _state;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (from == address(0)) {
            IRewardPool(rewardPool).addNodeInfo(tokenId, nodeType[tokenId], to);        
        } else if (from != to) {
            IRewardPool(rewardPool).updateNodeOwner(tokenId, to);
        }
    }

    function emergenceyWithdrawTokens() public onlyOwner {
        IERC20(Genesis).transfer(owner(), IERC20(Genesis).balanceOf(address(this)));
    }


    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
    }

// Designed by @crypt0xa
// DISCLAIMER: I'm just the author of this code, I'm not and will not be accountable for anything anyone does with this code. Crypto is a wild space
// and people always fork stuff. Always DYOR.
// Goated Dev :)

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_revealTime","type":"uint256"},{"internalType":"address","name":"_GenesisAddress","type":"address"}],"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":"Genesis","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowMintingAfter","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergenceyWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrices","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondsUntilMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyPerNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintForAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPool","type":"address"}],"name":"setRewardPool","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":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDeployed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_GenesisAddress","type":"address"}],"name":"updateGenesisAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_newMaxSupplyPerNode","type":"uint256[5]"}],"name":"updateMaxSupplyPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_prices","type":"uint256[5]"}],"name":"updateMintPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000415565b5062989680600d556000600f556000601060146101000a81548160ff0219169083151502179055506040518060a00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152506012906005620000c6929190620004a6565b506040518060a001604052806107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681525060189060056200011e929190620004f0565b506040518060a00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815250601e9060056200016c929190620004a6565b50620697806024553480156200018157600080fd5b50604051620063f2380380620063f28339818101604052810190620001a7919062000797565b84848160009080519060200190620001c192919062000415565b508060019080519060200190620001da92919062000415565b505050620001fd620001f16200027260201b60201c565b6200027a60201b60201c565b428211156200020e5781600f819055505b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600e8190555062000267836200034060201b60201c565b505050505062000964565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003506200027260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000376620003eb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c690620008dd565b60405180910390fd5b80600b9080519060200190620003e792919062000415565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000423906200092e565b90600052602060002090601f01602090048101928262000447576000855562000493565b82601f106200046257805160ff191683800117855562000493565b8280016001018555821562000493579182015b828111156200049257825182559160200191906001019062000475565b5b509050620004a291906200053b565b5090565b8260058101928215620004dd579160200282015b82811115620004dc578251829060ff16905591602001919060010190620004ba565b5b509050620004ec91906200053b565b5090565b826005810192821562000528579160200282015b8281111562000527578251829061ffff1690559160200191906001019062000504565b5b5090506200053791906200053b565b5090565b5b80821115620005565760008160009055506001016200053c565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005c38262000578565b810181811067ffffffffffffffff82111715620005e557620005e462000589565b5b80604052505050565b6000620005fa6200055a565b9050620006088282620005b8565b919050565b600067ffffffffffffffff8211156200062b576200062a62000589565b5b620006368262000578565b9050602081019050919050565b60005b838110156200066357808201518184015260208101905062000646565b8381111562000673576000848401525b50505050565b6000620006906200068a846200060d565b620005ee565b905082815260208101848484011115620006af57620006ae62000573565b5b620006bc84828562000643565b509392505050565b600082601f830112620006dc57620006db6200056e565b5b8151620006ee84826020860162000679565b91505092915050565b6000819050919050565b6200070c81620006f7565b81146200071857600080fd5b50565b6000815190506200072c8162000701565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200075f8262000732565b9050919050565b620007718162000752565b81146200077d57600080fd5b50565b600081519050620007918162000766565b92915050565b600080600080600060a08688031215620007b657620007b562000564565b5b600086015167ffffffffffffffff811115620007d757620007d662000569565b5b620007e588828901620006c4565b955050602086015167ffffffffffffffff81111562000809576200080862000569565b5b6200081788828901620006c4565b945050604086015167ffffffffffffffff8111156200083b576200083a62000569565b5b6200084988828901620006c4565b93505060606200085c888289016200071b565b92505060806200086f8882890162000780565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620008c56020836200087c565b9150620008d2826200088d565b602082019050919050565b60006020820190508181036000830152620008f881620008b6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200094757607f821691505b602082108114156200095e576200095d620008ff565b5b50919050565b615a7e80620009746000396000f3fe6080604052600436106102b25760003560e01c806378238c3711610175578063c4427d77116100dc578063da3ef23f11610095578063f1c7f40e1161006f578063f1c7f40e14610af6578063f2fde38b14610b33578063fa1f7b0c14610b5c578063fa7e685b14610b85576102b9565b8063da3ef23f14610a65578063db00fb2014610a8e578063e985e9c514610ab9576102b9565b8063c4427d7714610943578063c66828621461096c578063c87b56dd14610997578063cca0feb6146109d4578063cdc4878b146109fd578063d5abeb0114610a3a576102b9565b8063a0712d681161012e578063a0712d6814610849578063a22cb46514610872578063a75052cb1461089b578063aab14006146108c6578063b187bd26146108ef578063b88d4fde1461091a576102b9565b806378238c371461074b578063872bdcdb146107745780638da5cb5b1461079f57806395d89b41146107ca578063977b5eb1146107f557806399c8d5561461081e576102b9565b80633ccfd60b116102195780636187b33e116101d25780636187b33e146106275780636352211e1461066457806366666aa9146106a15780636bf6eaff146106cc57806370a08231146106f7578063715018a614610734576102b9565b80633ccfd60b1461052857806342842e0e14610532578063438b63001461055b5780634f6ccce71461059857806355f804b3146105d55780635dc45e8b146105fe576102b9565b806319188c351161026b57806319188c35146103f45780631c794b841461041f57806323b872dd1461045c578063240976bf146104855780632f745c59146104ae57806332624114146104eb576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b3146103635780630a165fdc1461038c57806318160ddd146103c9576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613ca5565b610b9c565b6040516102f29190613ced565b60405180910390f35b34801561030757600080fd5b50610310610c16565b60405161031d9190613da1565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613df9565b610ca8565b60405161035a9190613e67565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613eae565b610d2d565b005b34801561039857600080fd5b506103b360048036038101906103ae9190613df9565b610e45565b6040516103c09190613efd565b60405180910390f35b3480156103d557600080fd5b506103de610e60565b6040516103eb9190613efd565b60405180910390f35b34801561040057600080fd5b50610409610e6d565b6040516104169190613efd565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613df9565b610e73565b6040516104539190613efd565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613f18565b610e8b565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613f97565b610eeb565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613eae565b610f84565b6040516104e29190613efd565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190614033565b611029565b60405161051f9190613ced565b60405180910390f35b61053061116a565b005b34801561053e57600080fd5b5061055960048036038101906105549190613f18565b61125f565b005b34801561056757600080fd5b50610582600480360381019061057d919061409a565b61127f565b60405161058f9190614185565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190613df9565b61132d565b6040516105cc9190613efd565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906142dc565b61139e565b005b34801561060a57600080fd5b5061062560048036038101906106209190614325565b611434565b005b34801561063357600080fd5b5061064e60048036038101906106499190613df9565b6114be565b60405161065b9190613efd565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613df9565b6114d9565b6040516106989190613e67565b60405180910390f35b3480156106ad57600080fd5b506106b661158b565b6040516106c39190613e67565b60405180910390f35b3480156106d857600080fd5b506106e16115b1565b6040516106ee9190613e67565b60405180910390f35b34801561070357600080fd5b5061071e6004803603810190610719919061409a565b6115d7565b60405161072b9190613efd565b60405180910390f35b34801561074057600080fd5b5061074961168f565b005b34801561075757600080fd5b50610772600480360381019061076d919061409a565b611717565b005b34801561078057600080fd5b506107896117d7565b6040516107969190613efd565b60405180910390f35b3480156107ab57600080fd5b506107b46117dd565b6040516107c19190613e67565b60405180910390f35b3480156107d657600080fd5b506107df611807565b6040516107ec9190613da1565b60405180910390f35b34801561080157600080fd5b5061081c6004803603810190610817919061409a565b611899565b005b34801561082a57600080fd5b50610833611959565b6040516108409190613efd565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190613df9565b61195f565b005b34801561087e57600080fd5b5061089960048036038101906108949190614365565b611bbb565b005b3480156108a757600080fd5b506108b0611d3c565b6040516108bd9190613efd565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e8919061445b565b611d65565b005b3480156108fb57600080fd5b50610904611df6565b6040516109119190613ced565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190614529565b611e09565b005b34801561094f57600080fd5b5061096a60048036038101906109659190614325565b611e6b565b005b34801561097857600080fd5b50610981611f09565b60405161098e9190613da1565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190613df9565b611f97565b6040516109cb9190613da1565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f69190613df9565b612066565b005b348015610a0957600080fd5b50610a246004803603810190610a1f9190613df9565b6120ec565b604051610a319190613efd565b60405180910390f35b348015610a4657600080fd5b50610a4f612107565b604051610a5c9190613efd565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a8791906142dc565b61210d565b005b348015610a9a57600080fd5b50610aa36121a3565b604051610ab09190614630565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb919061464b565b6121ee565b604051610aed9190613ced565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613df9565b612282565b604051610b2a9190613efd565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b55919061409a565b61229a565b005b348015610b6857600080fd5b50610b836004803603810190610b7e919061445b565b612392565b005b348015610b9157600080fd5b50610b9a612423565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0f5750610c0e82612602565b5b9050919050565b606060008054610c25906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c51906146ba565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cb3826126e4565b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce99061475e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d38826114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906147f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc8612750565b73ffffffffffffffffffffffffffffffffffffffff161480610df75750610df681610df1612750565b6121ee565b5b610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d90614882565b60405180910390fd5b610e408383612758565b505050565b60188160058110610e5557600080fd5b016000915090505481565b6000600880549050905090565b600e5481565b60176020528060005260406000206000915090505481565b610e9c610e96612750565b82612811565b610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614914565b60405180910390fd5b610ee68383836128ef565b505050565b610ef3612750565b73ffffffffffffffffffffffffffffffffffffffff16610f116117dd565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614980565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555050565b6000610f8f836115d7565b8210610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790614a12565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080308660405160200161103f929190614a7a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081836040516020016110a6929190614b0e565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516110e39493929190614b54565b6020604051602081039080840390855afa158015611105573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff166111306117dd565b73ffffffffffffffffffffffffffffffffffffffff161415611159576001945050505050611162565b60009450505050505b949350505050565b611172612750565b73ffffffffffffffffffffffffffffffffffffffff166111906117dd565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614980565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161120c90614bbf565b60006040518083038185875af1925050503d8060008114611249576040519150601f19603f3d011682016040523d82523d6000602084013e61124e565b606091505b505090508061125c57600080fd5b50565b61127a83838360405180602001604052806000815250611e09565b505050565b6060600061128c836115d7565b905060008167ffffffffffffffff8111156112aa576112a96141b1565b5b6040519080825280602002602001820160405280156112d85781602001602082028036833780820191505090505b50905060005b82811015611322576112f08582610f84565b82828151811061130357611302614bd4565b5b602002602001018181525050808061131a90614c32565b9150506112de565b508092505050919050565b6000611337610e60565b8210611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614ced565b60405180910390fd5b6008828154811061138c5761138b614bd4565b5b90600052602060002001549050919050565b6113a6612750565b73ffffffffffffffffffffffffffffffffffffffff166113c46117dd565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190614980565b60405180910390fd5b80600b9080519060200190611430929190613b34565b5050565b61143c612750565b73ffffffffffffffffffffffffffffffffffffffff1661145a6117dd565b73ffffffffffffffffffffffffffffffffffffffff16146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790614980565b60405180910390fd5b6114ba8282612b4b565b5050565b601e81600581106114ce57600080fd5b016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614d7f565b60405180910390fd5b80915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614e11565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611697612750565b73ffffffffffffffffffffffffffffffffffffffff166116b56117dd565b73ffffffffffffffffffffffffffffffffffffffff161461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614980565b60405180910390fd5b6117156000612d42565b565b61171f612750565b73ffffffffffffffffffffffffffffffffffffffff1661173d6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90614980565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611816906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611842906146ba565b801561188f5780601f106118645761010080835404028352916020019161188f565b820191906000526020600020905b81548152906001019060200180831161187257829003601f168201915b5050505050905090565b6118a1612750565b73ffffffffffffffffffffffffffffffffffffffff166118bf6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614980565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601d5481565b6000601e6001836119709190614e31565b6005811061198157611980614bd4565b5b015490506000612710601d54836119989190614e65565b6119a29190614eee565b90506119ac6117dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bac57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611a3d93929190614f1f565b602060405180830381600087803b158015611a5757600080fd5b505af1158015611a6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8f9190614f6b565b611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614fe4565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385611b3b9190614e31565b6040518363ffffffff1660e01b8152600401611b58929190615004565b602060405180830381600087803b158015611b7257600080fd5b505af1158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190614f6b565b505b611bb68333612b4b565b505050565b611bc3612750565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890615079565b60405180910390fd5b8060056000611c3e612750565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ceb612750565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d309190613ced565b60405180910390a35050565b6000600f54421015611d5d5742600f54611d569190614e31565b9050611d62565b600090505b90565b611d6d612750565b73ffffffffffffffffffffffffffffffffffffffff16611d8b6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614980565b60405180910390fd5b806018906005611df2929190613bba565b5050565b601060149054906101000a900460ff1681565b611e1a611e14612750565b83612811565b611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614914565b60405180910390fd5b611e6584848484612e08565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061510b565b60405180910390fd5b611f058282612b4b565b5050565b600c8054611f16906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611f42906146ba565b8015611f8f5780601f10611f6457610100808354040283529160200191611f8f565b820191906000526020600020905b815481529060010190602001808311611f7257829003601f168201915b505050505081565b6060611fa2826126e4565b611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd89061519d565b60405180910390fd5b6000611feb612e64565b9050600081511161200b576040518060200160405280600081525061205e565b806120286017600086815260200190815260200160002054612ef6565b61203961203486613057565b612ef6565b600c60405160200161204e94939291906152d9565b6040516020818303038152906040525b915050919050565b61206e612750565b73ffffffffffffffffffffffffffffffffffffffff1661208c6117dd565b73ffffffffffffffffffffffffffffffffffffffff16146120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990614980565b60405180910390fd5b80601d8190555050565b601281600581106120fc57600080fd5b016000915090505481565b600d5481565b612115612750565b73ffffffffffffffffffffffffffffffffffffffff166121336117dd565b73ffffffffffffffffffffffffffffffffffffffff1614612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614980565b60405180910390fd5b80600c908051906020019061219f929190613b34565b5050565b6121ab613bfa565b601e6005806020026040519081016040528092919082600580156121e4576020028201915b8154815260200190600101908083116121d0575b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60236020528060005260406000206000915090505481565b6122a2612750565b73ffffffffffffffffffffffffffffffffffffffff166122c06117dd565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614980565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90615394565b60405180910390fd5b61238f81612d42565b50565b61239a612750565b73ffffffffffffffffffffffffffffffffffffffff166123b86117dd565b73ffffffffffffffffffffffffffffffffffffffff161461240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614980565b60405180910390fd5b80601e90600561241f929190613bba565b5050565b61242b612750565b73ffffffffffffffffffffffffffffffffffffffff166124496117dd565b73ffffffffffffffffffffffffffffffffffffffff161461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614980565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124e56117dd565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125409190613e67565b60206040518083038186803b15801561255857600080fd5b505afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906153c9565b6040518363ffffffff1660e01b81526004016125ad929190615004565b602060405180830381600087803b1580156125c757600080fd5b505af11580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190614f6b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126cd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126dd57506126dc826130c6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127cb836114d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061281c826126e4565b61285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290615468565b60405180910390fd5b6000612866836114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128d557508373ffffffffffffffffffffffffffffffffffffffff166128bd84610ca8565b73ffffffffffffffffffffffffffffffffffffffff16145b806128e657506128e581856121ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661290f826114d9565b73ffffffffffffffffffffffffffffffffffffffff1614612965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295c906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc9061558c565b60405180910390fd5b6129e0838383613130565b6129eb600082612758565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3b9190614e31565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9291906155ac565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600f54421015612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b879061564e565b60405180910390fd5b600082118015612ba1575060058211155b612be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd7906156ba565b60405180910390fd5b6018600183612bef9190614e31565b60058110612c0057612bff614bd4565b5b01546012600184612c119190614e31565b60058110612c2257612c21614bd4565b5b01541115612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90615726565b60405180910390fd5b601060149054906101000a900460ff1615612c7f57600080fd5b6000612c89610e60565b9050600d54600182612c9b91906155ac565b1115612ca657600080fd5b60016012600185612cb79190614e31565b60058110612cc857612cc7614bd4565b5b016000828254612cd891906155ac565b925050819055508260176000600184612cf191906155ac565b8152602001908152602001600020819055504260236000600184612d1591906155ac565b815260200190815260200160002081905550612d3d82600183612d3891906155ac565b613324565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e138484846128ef565b612e1f84848484613342565b612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e55906157b8565b60405180910390fd5b50505050565b6060600b8054612e73906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9f906146ba565b8015612eec5780601f10612ec157610100808354040283529160200191612eec565b820191906000526020600020905b815481529060010190602001808311612ecf57829003601f168201915b5050505050905090565b60606000821415612f3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613052565b600082905060005b60008214612f70578080612f5990614c32565b915050600a82612f699190614eee565b9150612f46565b60008167ffffffffffffffff811115612f8c57612f8b6141b1565b5b6040519080825280601f01601f191660200182016040528015612fbe5781602001600182028036833780820191505090505b5090505b6000851461304b57600182612fd79190614e31565b9150600a85612fe691906157d8565b6030612ff291906155ac565b60f81b81838151811061300857613007614bd4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130449190614eee565b9450612fc2565b8093505050505b919050565b600080602360008481526020019081526020016000205490506000429050600082826130839190614e31565b905060006001602454836130979190614eee565b6130a191906155ac565b905060068111156130b95760079450505050506130c1565b809450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61313b8383836134d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561323a57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b9b4667826017600085815260200190815260200160002054856040518463ffffffff1660e01b81526004016131e293929190615809565b602060405180830381600087803b1580156131fc57600080fd5b505af1158015613210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132349190614f6b565b5061331f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461331e57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639774950682846040518363ffffffff1660e01b81526004016132ca929190615840565b602060405180830381600087803b1580156132e457600080fd5b505af11580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190614f6b565b505b5b505050565b61333e8282604051806020016040528060008152506135ed565b5050565b60006133638473ffffffffffffffffffffffffffffffffffffffff16613648565b156134cc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261338c612750565b8786866040518563ffffffff1660e01b81526004016133ae94939291906158b3565b602060405180830381600087803b1580156133c857600080fd5b505af19250505080156133f957506040513d601f19601f820116820180604052508101906133f69190615914565b60015b61347c573d8060008114613429576040519150601f19603f3d011682016040523d82523d6000602084013e61342e565b606091505b50600081511415613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906157b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134d1565b600190505b949350505050565b6134e483838361365b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135275761352281613660565b613566565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135655761356483826136a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a9576135a481613816565b6135e8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135e7576135e682826138e7565b5b5b505050565b6135f78383613966565b6136046000848484613342565b613643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363a906157b8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136b6846115d7565b6136c09190614e31565b90506000600760008481526020019081526020016000205490508181146137a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061382a9190614e31565b905060006009600084815260200190815260200160002054905060006008838154811061385a57613859614bd4565b5b90600052602060002001549050806008838154811061387c5761387b614bd4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138cb576138ca615941565b5b6001900381819060005260206000200160009055905550505050565b60006138f2836115d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139cd906159bc565b60405180910390fd5b6139df816126e4565b15613a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1690615a28565b60405180910390fd5b613a2b60008383613130565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a7b91906155ac565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613b40906146ba565b90600052602060002090601f016020900481019282613b625760008555613ba9565b82601f10613b7b57805160ff1916838001178555613ba9565b82800160010185558215613ba9579182015b82811115613ba8578251825591602001919060010190613b8d565b5b509050613bb69190613c1c565b5090565b8260058101928215613be9579160200282015b82811115613be8578251825591602001919060010190613bcd565b5b509050613bf69190613c1c565b5090565b6040518060a00160405280600590602082028036833780820191505090505090565b5b80821115613c35576000816000905550600101613c1d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c8281613c4d565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b600060208284031215613cbb57613cba613c43565b5b6000613cc984828501613c90565b91505092915050565b60008115159050919050565b613ce781613cd2565b82525050565b6000602082019050613d026000830184613cde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d42578082015181840152602081019050613d27565b83811115613d51576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d7382613d08565b613d7d8185613d13565b9350613d8d818560208601613d24565b613d9681613d57565b840191505092915050565b60006020820190508181036000830152613dbb8184613d68565b905092915050565b6000819050919050565b613dd681613dc3565b8114613de157600080fd5b50565b600081359050613df381613dcd565b92915050565b600060208284031215613e0f57613e0e613c43565b5b6000613e1d84828501613de4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5182613e26565b9050919050565b613e6181613e46565b82525050565b6000602082019050613e7c6000830184613e58565b92915050565b613e8b81613e46565b8114613e9657600080fd5b50565b600081359050613ea881613e82565b92915050565b60008060408385031215613ec557613ec4613c43565b5b6000613ed385828601613e99565b9250506020613ee485828601613de4565b9150509250929050565b613ef781613dc3565b82525050565b6000602082019050613f126000830184613eee565b92915050565b600080600060608486031215613f3157613f30613c43565b5b6000613f3f86828701613e99565b9350506020613f5086828701613e99565b9250506040613f6186828701613de4565b9150509250925092565b613f7481613cd2565b8114613f7f57600080fd5b50565b600081359050613f9181613f6b565b92915050565b600060208284031215613fad57613fac613c43565b5b6000613fbb84828501613f82565b91505092915050565b600060ff82169050919050565b613fda81613fc4565b8114613fe557600080fd5b50565b600081359050613ff781613fd1565b92915050565b6000819050919050565b61401081613ffd565b811461401b57600080fd5b50565b60008135905061402d81614007565b92915050565b6000806000806080858703121561404d5761404c613c43565b5b600061405b87828801613e99565b945050602061406c87828801613fe8565b935050604061407d8782880161401e565b925050606061408e8782880161401e565b91505092959194509250565b6000602082840312156140b0576140af613c43565b5b60006140be84828501613e99565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6140fc81613dc3565b82525050565b600061410e83836140f3565b60208301905092915050565b6000602082019050919050565b6000614132826140c7565b61413c81856140d2565b9350614147836140e3565b8060005b8381101561417857815161415f8882614102565b975061416a8361411a565b92505060018101905061414b565b5085935050505092915050565b6000602082019050818103600083015261419f8184614127565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141e982613d57565b810181811067ffffffffffffffff82111715614208576142076141b1565b5b80604052505050565b600061421b613c39565b905061422782826141e0565b919050565b600067ffffffffffffffff821115614247576142466141b1565b5b61425082613d57565b9050602081019050919050565b82818337600083830152505050565b600061427f61427a8461422c565b614211565b90508281526020810184848401111561429b5761429a6141ac565b5b6142a684828561425d565b509392505050565b600082601f8301126142c3576142c26141a7565b5b81356142d384826020860161426c565b91505092915050565b6000602082840312156142f2576142f1613c43565b5b600082013567ffffffffffffffff8111156143105761430f613c48565b5b61431c848285016142ae565b91505092915050565b6000806040838503121561433c5761433b613c43565b5b600061434a85828601613de4565b925050602061435b85828601613e99565b9150509250929050565b6000806040838503121561437c5761437b613c43565b5b600061438a85828601613e99565b925050602061439b85828601613f82565b9150509250929050565b600067ffffffffffffffff8211156143c0576143bf6141b1565b5b602082029050919050565b600080fd5b60006143e36143de846143a5565b614211565b905080602084028301858111156143fd576143fc6143cb565b5b835b8181101561442657806144128882613de4565b8452602084019350506020810190506143ff565b5050509392505050565b600082601f830112614445576144446141a7565b5b60056144528482856143d0565b91505092915050565b600060a0828403121561447157614470613c43565b5b600061447f84828501614430565b91505092915050565b600067ffffffffffffffff8211156144a3576144a26141b1565b5b6144ac82613d57565b9050602081019050919050565b60006144cc6144c784614488565b614211565b9050828152602081018484840111156144e8576144e76141ac565b5b6144f384828561425d565b509392505050565b600082601f8301126145105761450f6141a7565b5b81356145208482602086016144b9565b91505092915050565b6000806000806080858703121561454357614542613c43565b5b600061455187828801613e99565b945050602061456287828801613e99565b935050604061457387828801613de4565b925050606085013567ffffffffffffffff81111561459457614593613c48565b5b6145a0878288016144fb565b91505092959194509250565b600060059050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6145e2816145ac565b6145ec81846145b7565b92506145f7826145c2565b8060005b8381101561462857815161460f8782614102565b965061461a836145cc565b9250506001810190506145fb565b505050505050565b600060a08201905061464560008301846145d9565b92915050565b6000806040838503121561466257614661613c43565b5b600061467085828601613e99565b925050602061468185828601613e99565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146d257607f821691505b602082108114156146e6576146e561468b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614748602c83613d13565b9150614753826146ec565b604082019050919050565b600060208201905081810360008301526147778161473b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147da602183613d13565b91506147e58261477e565b604082019050919050565b60006020820190508181036000830152614809816147cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061486c603883613d13565b915061487782614810565b604082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148fe603183613d13565b9150614909826148a2565b604082019050919050565b6000602082019050818103600083015261492d816148f1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061496a602083613d13565b915061497582614934565b602082019050919050565b600060208201905081810360008301526149998161495d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006149fc602b83613d13565b9150614a07826149a0565b604082019050919050565b60006020820190508181036000830152614a2b816149ef565b9050919050565b60008160601b9050919050565b6000614a4a82614a32565b9050919050565b6000614a5c82614a3f565b9050919050565b614a74614a6f82613e46565b614a51565b82525050565b6000614a868285614a63565b601482019150614a968284614a63565b6014820191508190509392505050565b600081519050919050565b600081905092915050565b6000614ac782614aa6565b614ad18185614ab1565b9350614ae1818560208601613d24565b80840191505092915050565b6000819050919050565b614b08614b0382613ffd565b614aed565b82525050565b6000614b1a8285614abc565b9150614b268284614af7565b6020820191508190509392505050565b614b3f81613ffd565b82525050565b614b4e81613fc4565b82525050565b6000608082019050614b696000830187614b36565b614b766020830186614b45565b614b836040830185614b36565b614b906060830184614b36565b95945050505050565b50565b6000614ba9600083614ab1565b9150614bb482614b99565b600082019050919050565b6000614bca82614b9c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c3d82613dc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7057614c6f614c03565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614cd7602c83613d13565b9150614ce282614c7b565b604082019050919050565b60006020820190508181036000830152614d0681614cca565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614d69602983613d13565b9150614d7482614d0d565b604082019050919050565b60006020820190508181036000830152614d9881614d5c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614dfb602a83613d13565b9150614e0682614d9f565b604082019050919050565b60006020820190508181036000830152614e2a81614dee565b9050919050565b6000614e3c82613dc3565b9150614e4783613dc3565b925082821015614e5a57614e59614c03565b5b828203905092915050565b6000614e7082613dc3565b9150614e7b83613dc3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eb457614eb3614c03565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ef982613dc3565b9150614f0483613dc3565b925082614f1457614f13614ebf565b5b828204905092915050565b6000606082019050614f346000830186613e58565b614f416020830185613e58565b614f4e6040830184613eee565b949350505050565b600081519050614f6581613f6b565b92915050565b600060208284031215614f8157614f80613c43565b5b6000614f8f84828501614f56565b91505092915050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000614fce601083613d13565b9150614fd982614f98565b602082019050919050565b60006020820190508181036000830152614ffd81614fc1565b9050919050565b60006040820190506150196000830185613e58565b6150266020830184613eee565b9392505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615063601983613d13565b915061506e8261502d565b602082019050919050565b6000602082019050818103600083015261509281615056565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f742074686520726577617260008201527f64506f6f6c000000000000000000000000000000000000000000000000000000602082015250565b60006150f5602583613d13565b915061510082615099565b604082019050919050565b60006020820190508181036000830152615124816150e8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615187602f83613d13565b91506151928261512b565b604082019050919050565b600060208201905081810360008301526151b68161517a565b9050919050565b600081905092915050565b60006151d382613d08565b6151dd81856151bd565b93506151ed818560208601613d24565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061522f6001836151bd565b915061523a826151f9565b600182019050919050565b60008190508160005260206000209050919050565b60008154615267816146ba565b61527181866151bd565b9450600182166000811461528c576001811461529d576152d0565b60ff198316865281860193506152d0565b6152a685615245565b60005b838110156152c8578154818901526001820191506020810190506152a9565b838801955050505b50505092915050565b60006152e582876151c8565b91506152f182866151c8565b91506152fc82615222565b915061530882856151c8565b9150615314828461525a565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061537e602683613d13565b915061538982615322565b604082019050919050565b600060208201905081810360008301526153ad81615371565b9050919050565b6000815190506153c381613dcd565b92915050565b6000602082840312156153df576153de613c43565b5b60006153ed848285016153b4565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615452602c83613d13565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006154e4602983613d13565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615576602483613d13565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b60006155b782613dc3565b91506155c283613dc3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155f7576155f6614c03565b5b828201905092915050565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b6000615638601783613d13565b915061564382615602565b602082019050919050565b600060208201905081810360008301526156678161562b565b9050919050565b7f496e76616c6964206e6f64652074797065000000000000000000000000000000600082015250565b60006156a4601183613d13565b91506156af8261566e565b602082019050919050565b600060208201905081810360008301526156d381615697565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000615710601283613d13565b915061571b826156da565b602082019050919050565b6000602082019050818103600083015261573f81615703565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157a2603283613d13565b91506157ad82615746565b604082019050919050565b600060208201905081810360008301526157d181615795565b9050919050565b60006157e382613dc3565b91506157ee83613dc3565b9250826157fe576157fd614ebf565b5b828206905092915050565b600060608201905061581e6000830186613eee565b61582b6020830185613eee565b6158386040830184613e58565b949350505050565b60006040820190506158556000830185613eee565b6158626020830184613e58565b9392505050565b600082825260208201905092915050565b600061588582614aa6565b61588f8185615869565b935061589f818560208601613d24565b6158a881613d57565b840191505092915050565b60006080820190506158c86000830187613e58565b6158d56020830186613e58565b6158e26040830185613eee565b81810360608301526158f4818461587a565b905095945050505050565b60008151905061590e81613c79565b92915050565b60006020828403121561592a57615929613c43565b5b6000615938848285016158ff565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159a6602083613d13565b91506159b182615970565b602082019050919050565b600060208201905081810360008301526159d581615999565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a12601c83613d13565b9150615a1d826159dc565b602082019050919050565b60006020820190508181036000830152615a4181615a05565b905091905056fea2646970667358221220406ba0cd0f421f3a14475d677bb1a975809e0eee17f9126b3cbacc5c5493b46164736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9b584ec492cf6f641c9d37ea23bf5229139b419000000000000000000000000000000000000000000000000000000000000000b47656e65736973204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004474e5353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d33786144694a70325444325172625a4e6d54643533454632314a697631564266505331634d663450374e2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806378238c3711610175578063c4427d77116100dc578063da3ef23f11610095578063f1c7f40e1161006f578063f1c7f40e14610af6578063f2fde38b14610b33578063fa1f7b0c14610b5c578063fa7e685b14610b85576102b9565b8063da3ef23f14610a65578063db00fb2014610a8e578063e985e9c514610ab9576102b9565b8063c4427d7714610943578063c66828621461096c578063c87b56dd14610997578063cca0feb6146109d4578063cdc4878b146109fd578063d5abeb0114610a3a576102b9565b8063a0712d681161012e578063a0712d6814610849578063a22cb46514610872578063a75052cb1461089b578063aab14006146108c6578063b187bd26146108ef578063b88d4fde1461091a576102b9565b806378238c371461074b578063872bdcdb146107745780638da5cb5b1461079f57806395d89b41146107ca578063977b5eb1146107f557806399c8d5561461081e576102b9565b80633ccfd60b116102195780636187b33e116101d25780636187b33e146106275780636352211e1461066457806366666aa9146106a15780636bf6eaff146106cc57806370a08231146106f7578063715018a614610734576102b9565b80633ccfd60b1461052857806342842e0e14610532578063438b63001461055b5780634f6ccce71461059857806355f804b3146105d55780635dc45e8b146105fe576102b9565b806319188c351161026b57806319188c35146103f45780631c794b841461041f57806323b872dd1461045c578063240976bf146104855780632f745c59146104ae57806332624114146104eb576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b3146103635780630a165fdc1461038c57806318160ddd146103c9576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613ca5565b610b9c565b6040516102f29190613ced565b60405180910390f35b34801561030757600080fd5b50610310610c16565b60405161031d9190613da1565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613df9565b610ca8565b60405161035a9190613e67565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613eae565b610d2d565b005b34801561039857600080fd5b506103b360048036038101906103ae9190613df9565b610e45565b6040516103c09190613efd565b60405180910390f35b3480156103d557600080fd5b506103de610e60565b6040516103eb9190613efd565b60405180910390f35b34801561040057600080fd5b50610409610e6d565b6040516104169190613efd565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613df9565b610e73565b6040516104539190613efd565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613f18565b610e8b565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613f97565b610eeb565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613eae565b610f84565b6040516104e29190613efd565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190614033565b611029565b60405161051f9190613ced565b60405180910390f35b61053061116a565b005b34801561053e57600080fd5b5061055960048036038101906105549190613f18565b61125f565b005b34801561056757600080fd5b50610582600480360381019061057d919061409a565b61127f565b60405161058f9190614185565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190613df9565b61132d565b6040516105cc9190613efd565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906142dc565b61139e565b005b34801561060a57600080fd5b5061062560048036038101906106209190614325565b611434565b005b34801561063357600080fd5b5061064e60048036038101906106499190613df9565b6114be565b60405161065b9190613efd565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613df9565b6114d9565b6040516106989190613e67565b60405180910390f35b3480156106ad57600080fd5b506106b661158b565b6040516106c39190613e67565b60405180910390f35b3480156106d857600080fd5b506106e16115b1565b6040516106ee9190613e67565b60405180910390f35b34801561070357600080fd5b5061071e6004803603810190610719919061409a565b6115d7565b60405161072b9190613efd565b60405180910390f35b34801561074057600080fd5b5061074961168f565b005b34801561075757600080fd5b50610772600480360381019061076d919061409a565b611717565b005b34801561078057600080fd5b506107896117d7565b6040516107969190613efd565b60405180910390f35b3480156107ab57600080fd5b506107b46117dd565b6040516107c19190613e67565b60405180910390f35b3480156107d657600080fd5b506107df611807565b6040516107ec9190613da1565b60405180910390f35b34801561080157600080fd5b5061081c6004803603810190610817919061409a565b611899565b005b34801561082a57600080fd5b50610833611959565b6040516108409190613efd565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190613df9565b61195f565b005b34801561087e57600080fd5b5061089960048036038101906108949190614365565b611bbb565b005b3480156108a757600080fd5b506108b0611d3c565b6040516108bd9190613efd565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e8919061445b565b611d65565b005b3480156108fb57600080fd5b50610904611df6565b6040516109119190613ced565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190614529565b611e09565b005b34801561094f57600080fd5b5061096a60048036038101906109659190614325565b611e6b565b005b34801561097857600080fd5b50610981611f09565b60405161098e9190613da1565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190613df9565b611f97565b6040516109cb9190613da1565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f69190613df9565b612066565b005b348015610a0957600080fd5b50610a246004803603810190610a1f9190613df9565b6120ec565b604051610a319190613efd565b60405180910390f35b348015610a4657600080fd5b50610a4f612107565b604051610a5c9190613efd565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a8791906142dc565b61210d565b005b348015610a9a57600080fd5b50610aa36121a3565b604051610ab09190614630565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb919061464b565b6121ee565b604051610aed9190613ced565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613df9565b612282565b604051610b2a9190613efd565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b55919061409a565b61229a565b005b348015610b6857600080fd5b50610b836004803603810190610b7e919061445b565b612392565b005b348015610b9157600080fd5b50610b9a612423565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0f5750610c0e82612602565b5b9050919050565b606060008054610c25906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c51906146ba565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cb3826126e4565b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce99061475e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d38826114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906147f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc8612750565b73ffffffffffffffffffffffffffffffffffffffff161480610df75750610df681610df1612750565b6121ee565b5b610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d90614882565b60405180910390fd5b610e408383612758565b505050565b60188160058110610e5557600080fd5b016000915090505481565b6000600880549050905090565b600e5481565b60176020528060005260406000206000915090505481565b610e9c610e96612750565b82612811565b610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614914565b60405180910390fd5b610ee68383836128ef565b505050565b610ef3612750565b73ffffffffffffffffffffffffffffffffffffffff16610f116117dd565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614980565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555050565b6000610f8f836115d7565b8210610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790614a12565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080308660405160200161103f929190614a7a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081836040516020016110a6929190614b0e565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516110e39493929190614b54565b6020604051602081039080840390855afa158015611105573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff166111306117dd565b73ffffffffffffffffffffffffffffffffffffffff161415611159576001945050505050611162565b60009450505050505b949350505050565b611172612750565b73ffffffffffffffffffffffffffffffffffffffff166111906117dd565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614980565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161120c90614bbf565b60006040518083038185875af1925050503d8060008114611249576040519150601f19603f3d011682016040523d82523d6000602084013e61124e565b606091505b505090508061125c57600080fd5b50565b61127a83838360405180602001604052806000815250611e09565b505050565b6060600061128c836115d7565b905060008167ffffffffffffffff8111156112aa576112a96141b1565b5b6040519080825280602002602001820160405280156112d85781602001602082028036833780820191505090505b50905060005b82811015611322576112f08582610f84565b82828151811061130357611302614bd4565b5b602002602001018181525050808061131a90614c32565b9150506112de565b508092505050919050565b6000611337610e60565b8210611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614ced565b60405180910390fd5b6008828154811061138c5761138b614bd4565b5b90600052602060002001549050919050565b6113a6612750565b73ffffffffffffffffffffffffffffffffffffffff166113c46117dd565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190614980565b60405180910390fd5b80600b9080519060200190611430929190613b34565b5050565b61143c612750565b73ffffffffffffffffffffffffffffffffffffffff1661145a6117dd565b73ffffffffffffffffffffffffffffffffffffffff16146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790614980565b60405180910390fd5b6114ba8282612b4b565b5050565b601e81600581106114ce57600080fd5b016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614d7f565b60405180910390fd5b80915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614e11565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611697612750565b73ffffffffffffffffffffffffffffffffffffffff166116b56117dd565b73ffffffffffffffffffffffffffffffffffffffff161461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614980565b60405180910390fd5b6117156000612d42565b565b61171f612750565b73ffffffffffffffffffffffffffffffffffffffff1661173d6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90614980565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611816906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611842906146ba565b801561188f5780601f106118645761010080835404028352916020019161188f565b820191906000526020600020905b81548152906001019060200180831161187257829003601f168201915b5050505050905090565b6118a1612750565b73ffffffffffffffffffffffffffffffffffffffff166118bf6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614980565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601d5481565b6000601e6001836119709190614e31565b6005811061198157611980614bd4565b5b015490506000612710601d54836119989190614e65565b6119a29190614eee565b90506119ac6117dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bac57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611a3d93929190614f1f565b602060405180830381600087803b158015611a5757600080fd5b505af1158015611a6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8f9190614f6b565b611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614fe4565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385611b3b9190614e31565b6040518363ffffffff1660e01b8152600401611b58929190615004565b602060405180830381600087803b158015611b7257600080fd5b505af1158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190614f6b565b505b611bb68333612b4b565b505050565b611bc3612750565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890615079565b60405180910390fd5b8060056000611c3e612750565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ceb612750565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d309190613ced565b60405180910390a35050565b6000600f54421015611d5d5742600f54611d569190614e31565b9050611d62565b600090505b90565b611d6d612750565b73ffffffffffffffffffffffffffffffffffffffff16611d8b6117dd565b73ffffffffffffffffffffffffffffffffffffffff1614611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614980565b60405180910390fd5b806018906005611df2929190613bba565b5050565b601060149054906101000a900460ff1681565b611e1a611e14612750565b83612811565b611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614914565b60405180910390fd5b611e6584848484612e08565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061510b565b60405180910390fd5b611f058282612b4b565b5050565b600c8054611f16906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611f42906146ba565b8015611f8f5780601f10611f6457610100808354040283529160200191611f8f565b820191906000526020600020905b815481529060010190602001808311611f7257829003601f168201915b505050505081565b6060611fa2826126e4565b611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd89061519d565b60405180910390fd5b6000611feb612e64565b9050600081511161200b576040518060200160405280600081525061205e565b806120286017600086815260200190815260200160002054612ef6565b61203961203486613057565b612ef6565b600c60405160200161204e94939291906152d9565b6040516020818303038152906040525b915050919050565b61206e612750565b73ffffffffffffffffffffffffffffffffffffffff1661208c6117dd565b73ffffffffffffffffffffffffffffffffffffffff16146120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990614980565b60405180910390fd5b80601d8190555050565b601281600581106120fc57600080fd5b016000915090505481565b600d5481565b612115612750565b73ffffffffffffffffffffffffffffffffffffffff166121336117dd565b73ffffffffffffffffffffffffffffffffffffffff1614612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614980565b60405180910390fd5b80600c908051906020019061219f929190613b34565b5050565b6121ab613bfa565b601e6005806020026040519081016040528092919082600580156121e4576020028201915b8154815260200190600101908083116121d0575b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60236020528060005260406000206000915090505481565b6122a2612750565b73ffffffffffffffffffffffffffffffffffffffff166122c06117dd565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614980565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90615394565b60405180910390fd5b61238f81612d42565b50565b61239a612750565b73ffffffffffffffffffffffffffffffffffffffff166123b86117dd565b73ffffffffffffffffffffffffffffffffffffffff161461240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614980565b60405180910390fd5b80601e90600561241f929190613bba565b5050565b61242b612750565b73ffffffffffffffffffffffffffffffffffffffff166124496117dd565b73ffffffffffffffffffffffffffffffffffffffff161461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614980565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124e56117dd565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125409190613e67565b60206040518083038186803b15801561255857600080fd5b505afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906153c9565b6040518363ffffffff1660e01b81526004016125ad929190615004565b602060405180830381600087803b1580156125c757600080fd5b505af11580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190614f6b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126cd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126dd57506126dc826130c6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127cb836114d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061281c826126e4565b61285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290615468565b60405180910390fd5b6000612866836114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128d557508373ffffffffffffffffffffffffffffffffffffffff166128bd84610ca8565b73ffffffffffffffffffffffffffffffffffffffff16145b806128e657506128e581856121ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661290f826114d9565b73ffffffffffffffffffffffffffffffffffffffff1614612965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295c906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc9061558c565b60405180910390fd5b6129e0838383613130565b6129eb600082612758565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3b9190614e31565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9291906155ac565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600f54421015612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b879061564e565b60405180910390fd5b600082118015612ba1575060058211155b612be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd7906156ba565b60405180910390fd5b6018600183612bef9190614e31565b60058110612c0057612bff614bd4565b5b01546012600184612c119190614e31565b60058110612c2257612c21614bd4565b5b01541115612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90615726565b60405180910390fd5b601060149054906101000a900460ff1615612c7f57600080fd5b6000612c89610e60565b9050600d54600182612c9b91906155ac565b1115612ca657600080fd5b60016012600185612cb79190614e31565b60058110612cc857612cc7614bd4565b5b016000828254612cd891906155ac565b925050819055508260176000600184612cf191906155ac565b8152602001908152602001600020819055504260236000600184612d1591906155ac565b815260200190815260200160002081905550612d3d82600183612d3891906155ac565b613324565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e138484846128ef565b612e1f84848484613342565b612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e55906157b8565b60405180910390fd5b50505050565b6060600b8054612e73906146ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9f906146ba565b8015612eec5780601f10612ec157610100808354040283529160200191612eec565b820191906000526020600020905b815481529060010190602001808311612ecf57829003601f168201915b5050505050905090565b60606000821415612f3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613052565b600082905060005b60008214612f70578080612f5990614c32565b915050600a82612f699190614eee565b9150612f46565b60008167ffffffffffffffff811115612f8c57612f8b6141b1565b5b6040519080825280601f01601f191660200182016040528015612fbe5781602001600182028036833780820191505090505b5090505b6000851461304b57600182612fd79190614e31565b9150600a85612fe691906157d8565b6030612ff291906155ac565b60f81b81838151811061300857613007614bd4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130449190614eee565b9450612fc2565b8093505050505b919050565b600080602360008481526020019081526020016000205490506000429050600082826130839190614e31565b905060006001602454836130979190614eee565b6130a191906155ac565b905060068111156130b95760079450505050506130c1565b809450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61313b8383836134d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561323a57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b9b4667826017600085815260200190815260200160002054856040518463ffffffff1660e01b81526004016131e293929190615809565b602060405180830381600087803b1580156131fc57600080fd5b505af1158015613210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132349190614f6b565b5061331f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461331e57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639774950682846040518363ffffffff1660e01b81526004016132ca929190615840565b602060405180830381600087803b1580156132e457600080fd5b505af11580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190614f6b565b505b5b505050565b61333e8282604051806020016040528060008152506135ed565b5050565b60006133638473ffffffffffffffffffffffffffffffffffffffff16613648565b156134cc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261338c612750565b8786866040518563ffffffff1660e01b81526004016133ae94939291906158b3565b602060405180830381600087803b1580156133c857600080fd5b505af19250505080156133f957506040513d601f19601f820116820180604052508101906133f69190615914565b60015b61347c573d8060008114613429576040519150601f19603f3d011682016040523d82523d6000602084013e61342e565b606091505b50600081511415613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906157b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134d1565b600190505b949350505050565b6134e483838361365b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135275761352281613660565b613566565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135655761356483826136a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a9576135a481613816565b6135e8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135e7576135e682826138e7565b5b5b505050565b6135f78383613966565b6136046000848484613342565b613643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363a906157b8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136b6846115d7565b6136c09190614e31565b90506000600760008481526020019081526020016000205490508181146137a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061382a9190614e31565b905060006009600084815260200190815260200160002054905060006008838154811061385a57613859614bd4565b5b90600052602060002001549050806008838154811061387c5761387b614bd4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138cb576138ca615941565b5b6001900381819060005260206000200160009055905550505050565b60006138f2836115d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139cd906159bc565b60405180910390fd5b6139df816126e4565b15613a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1690615a28565b60405180910390fd5b613a2b60008383613130565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a7b91906155ac565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613b40906146ba565b90600052602060002090601f016020900481019282613b625760008555613ba9565b82601f10613b7b57805160ff1916838001178555613ba9565b82800160010185558215613ba9579182015b82811115613ba8578251825591602001919060010190613b8d565b5b509050613bb69190613c1c565b5090565b8260058101928215613be9579160200282015b82811115613be8578251825591602001919060010190613bcd565b5b509050613bf69190613c1c565b5090565b6040518060a00160405280600590602082028036833780820191505090505090565b5b80821115613c35576000816000905550600101613c1d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c8281613c4d565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b600060208284031215613cbb57613cba613c43565b5b6000613cc984828501613c90565b91505092915050565b60008115159050919050565b613ce781613cd2565b82525050565b6000602082019050613d026000830184613cde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d42578082015181840152602081019050613d27565b83811115613d51576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d7382613d08565b613d7d8185613d13565b9350613d8d818560208601613d24565b613d9681613d57565b840191505092915050565b60006020820190508181036000830152613dbb8184613d68565b905092915050565b6000819050919050565b613dd681613dc3565b8114613de157600080fd5b50565b600081359050613df381613dcd565b92915050565b600060208284031215613e0f57613e0e613c43565b5b6000613e1d84828501613de4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5182613e26565b9050919050565b613e6181613e46565b82525050565b6000602082019050613e7c6000830184613e58565b92915050565b613e8b81613e46565b8114613e9657600080fd5b50565b600081359050613ea881613e82565b92915050565b60008060408385031215613ec557613ec4613c43565b5b6000613ed385828601613e99565b9250506020613ee485828601613de4565b9150509250929050565b613ef781613dc3565b82525050565b6000602082019050613f126000830184613eee565b92915050565b600080600060608486031215613f3157613f30613c43565b5b6000613f3f86828701613e99565b9350506020613f5086828701613e99565b9250506040613f6186828701613de4565b9150509250925092565b613f7481613cd2565b8114613f7f57600080fd5b50565b600081359050613f9181613f6b565b92915050565b600060208284031215613fad57613fac613c43565b5b6000613fbb84828501613f82565b91505092915050565b600060ff82169050919050565b613fda81613fc4565b8114613fe557600080fd5b50565b600081359050613ff781613fd1565b92915050565b6000819050919050565b61401081613ffd565b811461401b57600080fd5b50565b60008135905061402d81614007565b92915050565b6000806000806080858703121561404d5761404c613c43565b5b600061405b87828801613e99565b945050602061406c87828801613fe8565b935050604061407d8782880161401e565b925050606061408e8782880161401e565b91505092959194509250565b6000602082840312156140b0576140af613c43565b5b60006140be84828501613e99565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6140fc81613dc3565b82525050565b600061410e83836140f3565b60208301905092915050565b6000602082019050919050565b6000614132826140c7565b61413c81856140d2565b9350614147836140e3565b8060005b8381101561417857815161415f8882614102565b975061416a8361411a565b92505060018101905061414b565b5085935050505092915050565b6000602082019050818103600083015261419f8184614127565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141e982613d57565b810181811067ffffffffffffffff82111715614208576142076141b1565b5b80604052505050565b600061421b613c39565b905061422782826141e0565b919050565b600067ffffffffffffffff821115614247576142466141b1565b5b61425082613d57565b9050602081019050919050565b82818337600083830152505050565b600061427f61427a8461422c565b614211565b90508281526020810184848401111561429b5761429a6141ac565b5b6142a684828561425d565b509392505050565b600082601f8301126142c3576142c26141a7565b5b81356142d384826020860161426c565b91505092915050565b6000602082840312156142f2576142f1613c43565b5b600082013567ffffffffffffffff8111156143105761430f613c48565b5b61431c848285016142ae565b91505092915050565b6000806040838503121561433c5761433b613c43565b5b600061434a85828601613de4565b925050602061435b85828601613e99565b9150509250929050565b6000806040838503121561437c5761437b613c43565b5b600061438a85828601613e99565b925050602061439b85828601613f82565b9150509250929050565b600067ffffffffffffffff8211156143c0576143bf6141b1565b5b602082029050919050565b600080fd5b60006143e36143de846143a5565b614211565b905080602084028301858111156143fd576143fc6143cb565b5b835b8181101561442657806144128882613de4565b8452602084019350506020810190506143ff565b5050509392505050565b600082601f830112614445576144446141a7565b5b60056144528482856143d0565b91505092915050565b600060a0828403121561447157614470613c43565b5b600061447f84828501614430565b91505092915050565b600067ffffffffffffffff8211156144a3576144a26141b1565b5b6144ac82613d57565b9050602081019050919050565b60006144cc6144c784614488565b614211565b9050828152602081018484840111156144e8576144e76141ac565b5b6144f384828561425d565b509392505050565b600082601f8301126145105761450f6141a7565b5b81356145208482602086016144b9565b91505092915050565b6000806000806080858703121561454357614542613c43565b5b600061455187828801613e99565b945050602061456287828801613e99565b935050604061457387828801613de4565b925050606085013567ffffffffffffffff81111561459457614593613c48565b5b6145a0878288016144fb565b91505092959194509250565b600060059050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6145e2816145ac565b6145ec81846145b7565b92506145f7826145c2565b8060005b8381101561462857815161460f8782614102565b965061461a836145cc565b9250506001810190506145fb565b505050505050565b600060a08201905061464560008301846145d9565b92915050565b6000806040838503121561466257614661613c43565b5b600061467085828601613e99565b925050602061468185828601613e99565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146d257607f821691505b602082108114156146e6576146e561468b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614748602c83613d13565b9150614753826146ec565b604082019050919050565b600060208201905081810360008301526147778161473b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147da602183613d13565b91506147e58261477e565b604082019050919050565b60006020820190508181036000830152614809816147cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061486c603883613d13565b915061487782614810565b604082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148fe603183613d13565b9150614909826148a2565b604082019050919050565b6000602082019050818103600083015261492d816148f1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061496a602083613d13565b915061497582614934565b602082019050919050565b600060208201905081810360008301526149998161495d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006149fc602b83613d13565b9150614a07826149a0565b604082019050919050565b60006020820190508181036000830152614a2b816149ef565b9050919050565b60008160601b9050919050565b6000614a4a82614a32565b9050919050565b6000614a5c82614a3f565b9050919050565b614a74614a6f82613e46565b614a51565b82525050565b6000614a868285614a63565b601482019150614a968284614a63565b6014820191508190509392505050565b600081519050919050565b600081905092915050565b6000614ac782614aa6565b614ad18185614ab1565b9350614ae1818560208601613d24565b80840191505092915050565b6000819050919050565b614b08614b0382613ffd565b614aed565b82525050565b6000614b1a8285614abc565b9150614b268284614af7565b6020820191508190509392505050565b614b3f81613ffd565b82525050565b614b4e81613fc4565b82525050565b6000608082019050614b696000830187614b36565b614b766020830186614b45565b614b836040830185614b36565b614b906060830184614b36565b95945050505050565b50565b6000614ba9600083614ab1565b9150614bb482614b99565b600082019050919050565b6000614bca82614b9c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c3d82613dc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7057614c6f614c03565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614cd7602c83613d13565b9150614ce282614c7b565b604082019050919050565b60006020820190508181036000830152614d0681614cca565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614d69602983613d13565b9150614d7482614d0d565b604082019050919050565b60006020820190508181036000830152614d9881614d5c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614dfb602a83613d13565b9150614e0682614d9f565b604082019050919050565b60006020820190508181036000830152614e2a81614dee565b9050919050565b6000614e3c82613dc3565b9150614e4783613dc3565b925082821015614e5a57614e59614c03565b5b828203905092915050565b6000614e7082613dc3565b9150614e7b83613dc3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eb457614eb3614c03565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ef982613dc3565b9150614f0483613dc3565b925082614f1457614f13614ebf565b5b828204905092915050565b6000606082019050614f346000830186613e58565b614f416020830185613e58565b614f4e6040830184613eee565b949350505050565b600081519050614f6581613f6b565b92915050565b600060208284031215614f8157614f80613c43565b5b6000614f8f84828501614f56565b91505092915050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000614fce601083613d13565b9150614fd982614f98565b602082019050919050565b60006020820190508181036000830152614ffd81614fc1565b9050919050565b60006040820190506150196000830185613e58565b6150266020830184613eee565b9392505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615063601983613d13565b915061506e8261502d565b602082019050919050565b6000602082019050818103600083015261509281615056565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f742074686520726577617260008201527f64506f6f6c000000000000000000000000000000000000000000000000000000602082015250565b60006150f5602583613d13565b915061510082615099565b604082019050919050565b60006020820190508181036000830152615124816150e8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615187602f83613d13565b91506151928261512b565b604082019050919050565b600060208201905081810360008301526151b68161517a565b9050919050565b600081905092915050565b60006151d382613d08565b6151dd81856151bd565b93506151ed818560208601613d24565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061522f6001836151bd565b915061523a826151f9565b600182019050919050565b60008190508160005260206000209050919050565b60008154615267816146ba565b61527181866151bd565b9450600182166000811461528c576001811461529d576152d0565b60ff198316865281860193506152d0565b6152a685615245565b60005b838110156152c8578154818901526001820191506020810190506152a9565b838801955050505b50505092915050565b60006152e582876151c8565b91506152f182866151c8565b91506152fc82615222565b915061530882856151c8565b9150615314828461525a565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061537e602683613d13565b915061538982615322565b604082019050919050565b600060208201905081810360008301526153ad81615371565b9050919050565b6000815190506153c381613dcd565b92915050565b6000602082840312156153df576153de613c43565b5b60006153ed848285016153b4565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615452602c83613d13565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006154e4602983613d13565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615576602483613d13565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b60006155b782613dc3565b91506155c283613dc3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155f7576155f6614c03565b5b828201905092915050565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b6000615638601783613d13565b915061564382615602565b602082019050919050565b600060208201905081810360008301526156678161562b565b9050919050565b7f496e76616c6964206e6f64652074797065000000000000000000000000000000600082015250565b60006156a4601183613d13565b91506156af8261566e565b602082019050919050565b600060208201905081810360008301526156d381615697565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000615710601283613d13565b915061571b826156da565b602082019050919050565b6000602082019050818103600083015261573f81615703565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157a2603283613d13565b91506157ad82615746565b604082019050919050565b600060208201905081810360008301526157d181615795565b9050919050565b60006157e382613dc3565b91506157ee83613dc3565b9250826157fe576157fd614ebf565b5b828206905092915050565b600060608201905061581e6000830186613eee565b61582b6020830185613eee565b6158386040830184613e58565b949350505050565b60006040820190506158556000830185613eee565b6158626020830184613e58565b9392505050565b600082825260208201905092915050565b600061588582614aa6565b61588f8185615869565b935061589f818560208601613d24565b6158a881613d57565b840191505092915050565b60006080820190506158c86000830187613e58565b6158d56020830186613e58565b6158e26040830185613eee565b81810360608301526158f4818461587a565b905095945050505050565b60008151905061590e81613c79565b92915050565b60006020828403121561592a57615929613c43565b5b6000615938848285016158ff565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159a6602083613d13565b91506159b182615970565b602082019050919050565b600060208201905081810360008301526159d581615999565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a12601c83613d13565b9150615a1d826159dc565b602082019050919050565b60006020820190508181036000830152615a4181615a05565b905091905056fea2646970667358221220406ba0cd0f421f3a14475d677bb1a975809e0eee17f9126b3cbacc5c5493b46164736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9b584ec492cf6f641c9d37ea23bf5229139b419000000000000000000000000000000000000000000000000000000000000000b47656e65736973204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004474e5353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d33786144694a70325444325172625a4e6d54643533454632314a697631564266505331634d663450374e2f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Genesis NFT
Arg [1] : _symbol (string): GNSS
Arg [2] : _initBaseURI (string): ipfs://QmTM3xaDiJp2TD2QrbZNmTd53EF21Jiv1VBfPS1cMf4P7N/
Arg [3] : _revealTime (uint256): 0
Arg [4] : _GenesisAddress (address): 0xa9B584Ec492cF6f641C9d37EA23Bf5229139b419

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000a9b584ec492cf6f641c9d37ea23bf5229139b419
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 47656e65736973204e4654000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 474e535300000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d544d33786144694a70325444325172625a4e6d54643533
Arg [11] : 454632314a697631564266505331634d663450374e2f00000000000000000000


Deployed Bytecode Sourcemap

49381:6730:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36362:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25219:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24742:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49859:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37165:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49594:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49812:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26278:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54977:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36746:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48722:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55671:192;;;:::i;:::-;;26725:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52878:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37355:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54706:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52367:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49985:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23133:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49735:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49671:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22776:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44440:94;;;;;;;;;;;;;:::i;:::-;;51137:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49628:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43789:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23695:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51467:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49960:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52476:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25599:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54461:235;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50866:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49700:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26981:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52254:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49508:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53709:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51248:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49767:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49552:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54818:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50757:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25997:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50032:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44689:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51021:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55514:147;;;;;;;;;;;;;:::i;:::-;;36362:300;36509:4;36566:35;36551:50;;;:11;:50;;;;:103;;;;36618:36;36642:11;36618:23;:36::i;:::-;36551:103;36531:123;;36362:300;;;:::o;23526:100::-;23580:13;23613:5;23606:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23526:100;:::o;25219:308::-;25340:7;25387:16;25395:7;25387;:16::i;:::-;25365:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25495:15;:24;25511:7;25495:24;;;;;;;;;;;;;;;;;;;;;25488:31;;25219:308;;;:::o;24742:411::-;24823:13;24839:23;24854:7;24839:14;:23::i;:::-;24823:39;;24887:5;24881:11;;:2;:11;;;;24873:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24981:5;24965:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24990:37;25007:5;25014:12;:10;:12::i;:::-;24990:16;:37::i;:::-;24965:62;24943:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25124:21;25133:2;25137:7;25124:8;:21::i;:::-;24812:341;24742:411;;:::o;49859:60::-;;;;;;;;;;;;;;;;;;;;:::o;37165:113::-;37226:7;37253:10;:17;;;;37246:24;;37165:113;:::o;49594:27::-;;;;:::o;49812:40::-;;;;;;;;;;;;;;;;;:::o;26278:376::-;26487:41;26506:12;:10;:12::i;:::-;26520:7;26487:18;:41::i;:::-;26465:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26618:28;26628:4;26634:2;26638:7;26618:9;:28::i;:::-;26278:376;;;:::o;54977:87::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55050:6:::1;55039:8;;:17;;;;;;;;;;;;;;;;;;54977:87:::0;:::o;36746:343::-;36888:7;36943:23;36960:5;36943:16;:23::i;:::-;36935:5;:31;36913:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37055:12;:19;37068:5;37055:19;;;;;;;;;;;;;;;:26;37075:5;37055:26;;;;;;;;;;;;37048:33;;36746:343;;;;:::o;48722:613::-;48882:4;48906:15;48959:4;48966;48934:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48924:48;;;;;;48906:66;;48985:19;:56;;;;;;;;;;;;;;;;;;;49052:20;49102:6;49110:7;49085:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49075:44;;;;;;49052:67;;49148:18;49169:35;49179:12;49193:2;49197;49201;49169:35;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49148:56;;49230:10;49219:21;;:7;:5;:7::i;:::-;:21;;;49215:86;;;49281:4;49274:11;;;;;;;;49215:86;49322:5;49315:12;;;;;;48722:613;;;;;;;:::o;55671:192::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55728:12:::1;55754:10;55746:24;;55792:21;55746:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55727:101;;;55847:7;55839:16;;;::::0;::::1;;55716:147;55671:192::o:0;26725:185::-;26863:39;26880:4;26886:2;26890:7;26863:39;;;;;;;;;;;;:16;:39::i;:::-;26725:185;;;:::o;52878:390::-;52965:16;52999:23;53025:17;53035:6;53025:9;:17::i;:::-;52999:43;;53053:25;53095:15;53081:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53053:58;;53127:9;53122:113;53142:15;53138:1;:19;53122:113;;;53193:30;53213:6;53221:1;53193:19;:30::i;:::-;53179:8;53188:1;53179:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;53159:3;;;;;:::i;:::-;;;;53122:113;;;;53252:8;53245:15;;;;52878:390;;;:::o;37355:320::-;37475:7;37530:30;:28;:30::i;:::-;37522:5;:38;37500:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;37650:10;37661:5;37650:17;;;;;;;;:::i;:::-;;;;;;;;;;37643:24;;37355:320;;;:::o;54706:104::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54791:11:::1;54781:7;:21;;;;;;;;;;;;:::i;:::-;;54706:104:::0;:::o;52367:99::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52442:16:::1;52448:5;52455:2;52442:5;:16::i;:::-;52367:99:::0;;:::o;49985:40::-;;;;;;;;;;;;;;;;;;;;:::o;23133:326::-;23250:7;23275:13;23291:7;:16;23299:7;23291:16;;;;;;;;;;;;;;;;;;;;;23275:32;;23357:1;23340:19;;:5;:19;;;;23318:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23446:5;23439:12;;;23133:326;;;:::o;49735:25::-;;;;;;;;;;;;;:::o;49671:22::-;;;;;;;;;;;;;:::o;22776:295::-;22893:7;22957:1;22940:19;;:5;:19;;;;22918:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23047:9;:16;23057:5;23047:16;;;;;;;;;;;;;;;;23040:23;;22776:295;;;:::o;44440:94::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44505:21:::1;44523:1;44505:9;:21::i;:::-;44440:94::o:0;51137:103::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51221:11:::1;51208:10;;:24;;;;;;;;;;;;;;;;;;51137:103:::0;:::o;49628:36::-;;;;:::o;43789:87::-;43835:7;43862:6;;;;;;;;;;;43855:13;;43789:87;:::o;23695:104::-;23751:13;23784:7;23777:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23695:104;:::o;51467:116::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51560:15:::1;51550:7;;:25;;;;;;;;;;;;;;;;;;51467:116:::0;:::o;49960:18::-;;;;:::o;52476:385::-;52520:13;52536:10;52553:1;52547:5;:7;;;;:::i;:::-;52536:19;;;;;;;:::i;:::-;;;;52520:35;;52566:12;52593:5;52588:3;;52582:5;:9;;;;:::i;:::-;52581:17;;;;:::i;:::-;52566:32;;52629:7;:5;:7::i;:::-;52615:21;;:10;:21;;;52611:208;;52668:7;;;;;;;;;;;52661:28;;;52690:10;52710:4;52717:5;52661:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52653:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;52766:7;;;;;;;;;;;52759:24;;;52784:10;;;;;;;;;;;52802:4;52796:5;:10;;;;:::i;:::-;52759:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52611:208;52829:24;52835:5;52842:10;52829:5;:24::i;:::-;52509:352;;52476:385;:::o;25599:327::-;25746:12;:10;:12::i;:::-;25734:24;;:8;:24;;;;25726:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25846:8;25801:18;:32;25820:12;:10;:12::i;:::-;25801:32;;;;;;;;;;;;;;;:42;25834:8;25801:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25899:8;25870:48;;25885:12;:10;:12::i;:::-;25870:48;;;25909:8;25870:48;;;;;;:::i;:::-;;;;;;;;25599:327;;:::o;54461:235::-;54516:7;54558:17;;54540:15;:35;54536:153;;;54621:15;54600:17;;54599:37;;;;:::i;:::-;54592:44;;;;54536:153;54676:1;54669:8;;54461:235;;:::o;50866:147::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50985:20:::1;50966:16;:39;;;;;;;:::i;:::-;;50866:147:::0;:::o;49700:28::-;;;;;;;;;;;;;:::o;26981:365::-;27170:41;27189:12;:10;:12::i;:::-;27203:7;27170:18;:41::i;:::-;27148:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27299:39;27313:4;27319:2;27323:7;27332:5;27299:13;:39::i;:::-;26981:365;;;;:::o;52254:105::-;50631:10;50617:24;;:10;;;;;;;;;;;:24;;;50609:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52335:16:::1;52341:5;52348:2;52335:5;:16::i;:::-;52254:105:::0;;:::o;49508:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53709:744::-;53827:13;53880:16;53888:7;53880;:16::i;:::-;53858:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53984:28;54015:10;:8;:10::i;:::-;53984:41;;54087:1;54062:14;54056:28;:32;:389;;;;;;;;;;;;;;;;;54180:14;54221:28;:8;:17;54230:7;54221:17;;;;;;;;;;;;:26;:28::i;:::-;54306:35;:24;54322:7;54306:15;:24::i;:::-;:33;:35::i;:::-;54368:13;54137:267;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54056:389;54036:409;;;53709:744;;;:::o;51248:78::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51314:4:::1;51308:3;:10;;;;51248:78:::0;:::o;49767:38::-;;;;;;;;;;;;;;;;;;;;:::o;49552:35::-;;;;:::o;54818:151::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54944:17:::1;54928:13;:33;;;;;;;;;;;;:::i;:::-;;54818:151:::0;:::o;50757:101::-;50803:17;;:::i;:::-;50840:10;50833:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50757:101;:::o;25997:214::-;26139:4;26168:18;:25;26187:5;26168:25;;;;;;;;;;;;;;;:35;26194:8;26168:35;;;;;;;;;;;;;;;;;;;;;;;;;26161:42;;25997:214;;;;:::o;50032:40::-;;;;;;;;;;;;;;;;;:::o;44689:229::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44812:1:::1;44792:22;;:8;:22;;;;44770:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;44891:19;44901:8;44891:9;:19::i;:::-;44689:229:::0;:::o;51021:108::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51114:7:::1;51101:10;:20;;;;;;;:::i;:::-;;51021:108:::0;:::o;55514:147::-;44020:12;:10;:12::i;:::-;44009:23;;:7;:5;:7::i;:::-;:23;;;44001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55585:7:::1;;;;;;;;;;;55578:24;;;55603:7;:5;:7::i;:::-;55619;;;;;;;;;;;55612:25;;;55646:4;55612:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55578:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55514:147::o:0;22357:355::-;22504:4;22561:25;22546:40;;;:11;:40;;;;:105;;;;22618:33;22603:48;;;:11;:48;;;;22546:105;:158;;;;22668:36;22692:11;22668:23;:36::i;:::-;22546:158;22526:178;;22357:355;;;:::o;28893:127::-;28958:4;29010:1;28982:30;;:7;:16;28990:7;28982:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28975:37;;28893:127;;;:::o;20831:98::-;20884:7;20911:10;20904:17;;20831:98;:::o;33016:174::-;33118:2;33091:15;:24;33107:7;33091:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33174:7;33170:2;33136:46;;33145:23;33160:7;33145:14;:23::i;:::-;33136:46;;;;;;;;;;;;33016:174;;:::o;29187:452::-;29316:4;29360:16;29368:7;29360;:16::i;:::-;29338:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29459:13;29475:23;29490:7;29475:14;:23::i;:::-;29459:39;;29528:5;29517:16;;:7;:16;;;:64;;;;29574:7;29550:31;;:20;29562:7;29550:11;:20::i;:::-;:31;;;29517:64;:113;;;;29598:32;29615:5;29622:7;29598:16;:32::i;:::-;29517:113;29509:122;;;29187:452;;;;:::o;32283:615::-;32456:4;32429:31;;:23;32444:7;32429:14;:23::i;:::-;:31;;;32407:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32562:1;32548:16;;:2;:16;;;;32540:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32618:39;32639:4;32645:2;32649:7;32618:20;:39::i;:::-;32722:29;32739:1;32743:7;32722:8;:29::i;:::-;32783:1;32764:9;:15;32774:4;32764:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32812:1;32795:9;:13;32805:2;32795:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32843:2;32824:7;:16;32832:7;32824:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32882:7;32878:2;32863:27;;32872:4;32863:27;;;;;;;;;;;;32283:615;;;:::o;51606:640::-;51705:17;;51686:15;:36;;51664:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;51798:1;51792:5;:7;:19;;;;;51810:1;51803:5;:8;;51792:19;51784:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51888:16;51911:1;51905:5;:7;;;;:::i;:::-;51888:25;;;;;;;:::i;:::-;;;;51866:9;51882:1;51876:5;:7;;;;:::i;:::-;51866:18;;;;;;;:::i;:::-;;;;:47;;51844:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;51979:8;;;;;;;;;;;51978:9;51970:18;;;;;;51999:14;52016:13;:11;:13::i;:::-;51999:30;;52062:9;;52057:1;52048:6;:10;;;;:::i;:::-;:23;;52040:32;;;;;;52107:1;52085:9;52101:1;52095:5;:7;;;;:::i;:::-;52085:18;;;;;;;:::i;:::-;;;;:23;;;;;;;:::i;:::-;;;;;;;;52140:5;52119:8;:18;52135:1;52128:6;:8;;;;:::i;:::-;52119:18;;;;;;;;;;;:26;;;;52177:15;52156:8;:18;52172:1;52165:6;:8;;;;:::i;:::-;52156:18;;;;;;;;;;;:36;;;;52213:25;52223:2;52236:1;52227:6;:10;;;;:::i;:::-;52213:9;:25::i;:::-;51653:593;51606:640;;:::o;44926:173::-;44982:16;45001:6;;;;;;;;;;;44982:25;;45027:8;45018:6;;:17;;;;;;;;;;;;;;;;;;45082:8;45051:40;;45072:8;45051:40;;;;;;;;;;;;44971:128;44926:173;:::o;28228:352::-;28385:28;28395:4;28401:2;28405:7;28385:9;:28::i;:::-;28446:48;28469:4;28475:2;28479:7;28488:5;28446:22;:48::i;:::-;28424:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;28228:352;;;;:::o;51351:108::-;51411:13;51444:7;51437:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51351:108;:::o;8176:723::-;8232:13;8462:1;8453:5;:10;8449:53;;;8480:10;;;;;;;;;;;;;;;;;;;;;8449:53;8512:12;8527:5;8512:20;;8543:14;8568:78;8583:1;8575:4;:9;8568:78;;8601:8;;;;;:::i;:::-;;;;8632:2;8624:10;;;;;:::i;:::-;;;8568:78;;;8656:19;8688:6;8678:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8656:39;;8706:154;8722:1;8713:5;:10;8706:154;;8750:1;8740:11;;;;;:::i;:::-;;;8817:2;8809:5;:10;;;;:::i;:::-;8796:2;:24;;;;:::i;:::-;8783:39;;8766:6;8773;8766:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8846:2;8837:11;;;;;:::i;:::-;;;8706:154;;;8884:6;8870:21;;;;;8176:723;;;;:::o;53276:423::-;53337:7;53357:19;53379:8;:16;53388:6;53379:16;;;;;;;;;;;;53357:38;;53406:19;53428:15;53406:37;;53454:22;53493:11;53479;:25;;;;:::i;:::-;53454:50;;53515:13;53566:1;53550:13;;53532:14;:32;;;;:::i;:::-;53531:36;;;;:::i;:::-;53515:52;;53600:1;53592:5;:9;53588:104;;;53625:1;53618:8;;;;;;;;53588:104;53675:5;53668:12;;;;;;53276:423;;;;:::o;7655:207::-;7785:4;7829:25;7814:40;;;:11;:40;;;;7807:47;;7655:207;;;:::o;55072:434::-;55216:45;55243:4;55249:2;55253:7;55216:26;:45::i;:::-;55292:1;55276:18;;:4;:18;;;55272:227;;;55323:10;;;;;;;;;;;55311:35;;;55347:7;55356:8;:17;55365:7;55356:17;;;;;;;;;;;;55375:2;55311:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55272:227;;;55416:2;55408:10;;:4;:10;;;55404:95;;55447:10;;;;;;;;;;;55435:39;;;55475:7;55484:2;55435:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55404:95;55272:227;55072:434;;;:::o;29981:110::-;30057:26;30067:2;30071:7;30057:26;;;;;;;;;;;;:9;:26::i;:::-;29981:110;;:::o;33755:980::-;33910:4;33931:15;:2;:13;;;:15::i;:::-;33927:801;;;34000:2;33984:36;;;34043:12;:10;:12::i;:::-;34078:4;34105:7;34135:5;33984:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33963:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34359:1;34342:6;:13;:18;34338:320;;;34385:108;;;;;;;;;;:::i;:::-;;;;;;;;34338:320;34608:6;34602:13;34593:6;34589:2;34585:15;34578:38;33963:710;34233:41;;;34223:51;;;:6;:51;;;;34216:58;;;;;33927:801;34712:4;34705:11;;33755:980;;;;;;;:::o;38288:589::-;38432:45;38459:4;38465:2;38469:7;38432:26;:45::i;:::-;38510:1;38494:18;;:4;:18;;;38490:187;;;38529:40;38561:7;38529:31;:40::i;:::-;38490:187;;;38599:2;38591:10;;:4;:10;;;38587:90;;38618:47;38651:4;38657:7;38618:32;:47::i;:::-;38587:90;38490:187;38705:1;38691:16;;:2;:16;;;38687:183;;;38724:45;38761:7;38724:36;:45::i;:::-;38687:183;;;38797:4;38791:10;;:2;:10;;;38787:83;;38818:40;38846:2;38850:7;38818:27;:40::i;:::-;38787:83;38687:183;38288:589;;;:::o;30318:321::-;30448:18;30454:2;30458:7;30448:5;:18::i;:::-;30499:54;30530:1;30534:2;30538:7;30547:5;30499:22;:54::i;:::-;30477:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30318:321;;;:::o;10729:387::-;10789:4;10997:12;11064:7;11052:20;11044:28;;11107:1;11100:4;:8;11093:15;;;10729:387;;;:::o;35307:126::-;;;;:::o;39600:164::-;39704:10;:17;;;;39677:15;:24;39693:7;39677:24;;;;;;;;;;;:44;;;;39732:10;39748:7;39732:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39600:164;:::o;40391:1002::-;40671:22;40721:1;40696:22;40713:4;40696:16;:22::i;:::-;:26;;;;:::i;:::-;40671:51;;40733:18;40754:17;:26;40772:7;40754:26;;;;;;;;;;;;40733:47;;40901:14;40887:10;:28;40883:328;;40932:19;40954:12;:18;40967:4;40954:18;;;;;;;;;;;;;;;:34;40973:14;40954:34;;;;;;;;;;;;40932:56;;41038:11;41005:12;:18;41018:4;41005:18;;;;;;;;;;;;;;;:30;41024:10;41005:30;;;;;;;;;;;:44;;;;41155:10;41122:17;:30;41140:11;41122:30;;;;;;;;;;;:43;;;;40917:294;40883:328;41307:17;:26;41325:7;41307:26;;;;;;;;;;;41300:33;;;41351:12;:18;41364:4;41351:18;;;;;;;;;;;;;;;:34;41370:14;41351:34;;;;;;;;;;;41344:41;;;40486:907;;40391:1002;;:::o;41688:1079::-;41941:22;41986:1;41966:10;:17;;;;:21;;;;:::i;:::-;41941:46;;41998:18;42019:15;:24;42035:7;42019:24;;;;;;;;;;;;41998:45;;42370:19;42392:10;42403:14;42392:26;;;;;;;;:::i;:::-;;;;;;;;;;42370:48;;42456:11;42431:10;42442;42431:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42567:10;42536:15;:28;42552:11;42536:28;;;;;;;;;;;:41;;;;42708:15;:24;42724:7;42708:24;;;;;;;;;;;42701:31;;;42743:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41759:1008;;;41688:1079;:::o;39178:221::-;39263:14;39280:20;39297:2;39280:16;:20::i;:::-;39263:37;;39338:7;39311:12;:16;39324:2;39311:16;;;;;;;;;;;;;;;:24;39328:6;39311:24;;;;;;;;;;;:34;;;;39385:6;39356:17;:26;39374:7;39356:26;;;;;;;;;;;:35;;;;39252:147;39178:221;;:::o;30975:382::-;31069:1;31055:16;;:2;:16;;;;31047:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31128:16;31136:7;31128;:16::i;:::-;31127:17;31119:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31190:45;31219:1;31223:2;31227:7;31190:20;:45::i;:::-;31265:1;31248:9;:13;31258:2;31248:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31296:2;31277:7;:16;31285:7;31277:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31341:7;31337:2;31316:33;;31333:1;31316:33;;;;;;;;;;;;30975:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:86::-;6540:7;6580:4;6573:5;6569:16;6558:27;;6505:86;;;:::o;6597:118::-;6668:22;6684:5;6668:22;:::i;:::-;6661:5;6658:33;6648:61;;6705:1;6702;6695:12;6648:61;6597:118;:::o;6721:135::-;6765:5;6803:6;6790:20;6781:29;;6819:31;6844:5;6819:31;:::i;:::-;6721:135;;;;:::o;6862:77::-;6899:7;6928:5;6917:16;;6862:77;;;:::o;6945:122::-;7018:24;7036:5;7018:24;:::i;:::-;7011:5;7008:35;6998:63;;7057:1;7054;7047:12;6998:63;6945:122;:::o;7073:139::-;7119:5;7157:6;7144:20;7135:29;;7173:33;7200:5;7173:33;:::i;:::-;7073:139;;;;:::o;7218:761::-;7302:6;7310;7318;7326;7375:3;7363:9;7354:7;7350:23;7346:33;7343:120;;;7382:79;;:::i;:::-;7343:120;7502:1;7527:53;7572:7;7563:6;7552:9;7548:22;7527:53;:::i;:::-;7517:63;;7473:117;7629:2;7655:51;7698:7;7689:6;7678:9;7674:22;7655:51;:::i;:::-;7645:61;;7600:116;7755:2;7781:53;7826:7;7817:6;7806:9;7802:22;7781:53;:::i;:::-;7771:63;;7726:118;7883:2;7909:53;7954:7;7945:6;7934:9;7930:22;7909:53;:::i;:::-;7899:63;;7854:118;7218:761;;;;;;;:::o;7985:329::-;8044:6;8093:2;8081:9;8072:7;8068:23;8064:32;8061:119;;;8099:79;;:::i;:::-;8061:119;8219:1;8244:53;8289:7;8280:6;8269:9;8265:22;8244:53;:::i;:::-;8234:63;;8190:117;7985:329;;;;:::o;8320:114::-;8387:6;8421:5;8415:12;8405:22;;8320:114;;;:::o;8440:184::-;8539:11;8573:6;8568:3;8561:19;8613:4;8608:3;8604:14;8589:29;;8440:184;;;;:::o;8630:132::-;8697:4;8720:3;8712:11;;8750:4;8745:3;8741:14;8733:22;;8630:132;;;:::o;8768:108::-;8845:24;8863:5;8845:24;:::i;:::-;8840:3;8833:37;8768:108;;:::o;8882:179::-;8951:10;8972:46;9014:3;9006:6;8972:46;:::i;:::-;9050:4;9045:3;9041:14;9027:28;;8882:179;;;;:::o;9067:113::-;9137:4;9169;9164:3;9160:14;9152:22;;9067:113;;;:::o;9216:732::-;9335:3;9364:54;9412:5;9364:54;:::i;:::-;9434:86;9513:6;9508:3;9434:86;:::i;:::-;9427:93;;9544:56;9594:5;9544:56;:::i;:::-;9623:7;9654:1;9639:284;9664:6;9661:1;9658:13;9639:284;;;9740:6;9734:13;9767:63;9826:3;9811:13;9767:63;:::i;:::-;9760:70;;9853:60;9906:6;9853:60;:::i;:::-;9843:70;;9699:224;9686:1;9683;9679:9;9674:14;;9639:284;;;9643:14;9939:3;9932:10;;9340:608;;;9216:732;;;;:::o;9954:373::-;10097:4;10135:2;10124:9;10120:18;10112:26;;10184:9;10178:4;10174:20;10170:1;10159:9;10155:17;10148:47;10212:108;10315:4;10306:6;10212:108;:::i;:::-;10204:116;;9954:373;;;;:::o;10333:117::-;10442:1;10439;10432:12;10456:117;10565:1;10562;10555:12;10579:180;10627:77;10624:1;10617:88;10724:4;10721:1;10714:15;10748:4;10745:1;10738:15;10765:281;10848:27;10870:4;10848:27;:::i;:::-;10840:6;10836:40;10978:6;10966:10;10963:22;10942:18;10930:10;10927:34;10924:62;10921:88;;;10989:18;;:::i;:::-;10921:88;11029:10;11025:2;11018:22;10808:238;10765:281;;:::o;11052:129::-;11086:6;11113:20;;:::i;:::-;11103:30;;11142:33;11170:4;11162:6;11142:33;:::i;:::-;11052:129;;;:::o;11187:308::-;11249:4;11339:18;11331:6;11328:30;11325:56;;;11361:18;;:::i;:::-;11325:56;11399:29;11421:6;11399:29;:::i;:::-;11391:37;;11483:4;11477;11473:15;11465:23;;11187:308;;;:::o;11501:154::-;11585:6;11580:3;11575;11562:30;11647:1;11638:6;11633:3;11629:16;11622:27;11501:154;;;:::o;11661:412::-;11739:5;11764:66;11780:49;11822:6;11780:49;:::i;:::-;11764:66;:::i;:::-;11755:75;;11853:6;11846:5;11839:21;11891:4;11884:5;11880:16;11929:3;11920:6;11915:3;11911:16;11908:25;11905:112;;;11936:79;;:::i;:::-;11905:112;12026:41;12060:6;12055:3;12050;12026:41;:::i;:::-;11745:328;11661:412;;;;;:::o;12093:340::-;12149:5;12198:3;12191:4;12183:6;12179:17;12175:27;12165:122;;12206:79;;:::i;:::-;12165:122;12323:6;12310:20;12348:79;12423:3;12415:6;12408:4;12400:6;12396:17;12348:79;:::i;:::-;12339:88;;12155:278;12093:340;;;;:::o;12439:509::-;12508:6;12557:2;12545:9;12536:7;12532:23;12528:32;12525:119;;;12563:79;;:::i;:::-;12525:119;12711:1;12700:9;12696:17;12683:31;12741:18;12733:6;12730:30;12727:117;;;12763:79;;:::i;:::-;12727:117;12868:63;12923:7;12914:6;12903:9;12899:22;12868:63;:::i;:::-;12858:73;;12654:287;12439:509;;;;:::o;12954:474::-;13022:6;13030;13079:2;13067:9;13058:7;13054:23;13050:32;13047:119;;;13085:79;;:::i;:::-;13047:119;13205:1;13230:53;13275:7;13266:6;13255:9;13251:22;13230:53;:::i;:::-;13220:63;;13176:117;13332:2;13358:53;13403:7;13394:6;13383:9;13379:22;13358:53;:::i;:::-;13348:63;;13303:118;12954:474;;;;;:::o;13434:468::-;13499:6;13507;13556:2;13544:9;13535:7;13531:23;13527:32;13524:119;;;13562:79;;:::i;:::-;13524:119;13682:1;13707:53;13752:7;13743:6;13732:9;13728:22;13707:53;:::i;:::-;13697:63;;13653:117;13809:2;13835:50;13877:7;13868:6;13857:9;13853:22;13835:50;:::i;:::-;13825:60;;13780:115;13434:468;;;;;:::o;13908:249::-;13983:4;14073:18;14065:6;14062:30;14059:56;;;14095:18;;:::i;:::-;14059:56;14145:4;14137:6;14133:17;14125:25;;13908:249;;;:::o;14163:117::-;14272:1;14269;14262:12;14304:643;14398:5;14423:79;14439:62;14494:6;14439:62;:::i;:::-;14423:79;:::i;:::-;14414:88;;14522:5;14575:4;14567:6;14563:17;14555:6;14551:30;14604:3;14596:6;14593:15;14590:122;;;14623:79;;:::i;:::-;14590:122;14738:6;14721:220;14755:6;14750:3;14747:15;14721:220;;;14830:3;14859:37;14892:3;14880:10;14859:37;:::i;:::-;14854:3;14847:50;14926:4;14921:3;14917:14;14910:21;;14797:144;14781:4;14776:3;14772:14;14765:21;;14721:220;;;14725:21;14404:543;;14304:643;;;;;:::o;14971:339::-;15040:5;15089:3;15082:4;15074:6;15070:17;15066:27;15056:122;;15097:79;;:::i;:::-;15056:122;15201:4;15223:81;15300:3;15292:6;15284;15223:81;:::i;:::-;15214:90;;15046:264;14971:339;;;;:::o;15316:376::-;15398:6;15447:3;15435:9;15426:7;15422:23;15418:33;15415:120;;;15454:79;;:::i;:::-;15415:120;15574:1;15599:76;15667:7;15658:6;15647:9;15643:22;15599:76;:::i;:::-;15589:86;;15545:140;15316:376;;;;:::o;15698:307::-;15759:4;15849:18;15841:6;15838:30;15835:56;;;15871:18;;:::i;:::-;15835:56;15909:29;15931:6;15909:29;:::i;:::-;15901:37;;15993:4;15987;15983:15;15975:23;;15698:307;;;:::o;16011:410::-;16088:5;16113:65;16129:48;16170:6;16129:48;:::i;:::-;16113:65;:::i;:::-;16104:74;;16201:6;16194:5;16187:21;16239:4;16232:5;16228:16;16277:3;16268:6;16263:3;16259:16;16256:25;16253:112;;;16284:79;;:::i;:::-;16253:112;16374:41;16408:6;16403:3;16398;16374:41;:::i;:::-;16094:327;16011:410;;;;;:::o;16440:338::-;16495:5;16544:3;16537:4;16529:6;16525:17;16521:27;16511:122;;16552:79;;:::i;:::-;16511:122;16669:6;16656:20;16694:78;16768:3;16760:6;16753:4;16745:6;16741:17;16694:78;:::i;:::-;16685:87;;16501:277;16440:338;;;;:::o;16784:943::-;16879:6;16887;16895;16903;16952:3;16940:9;16931:7;16927:23;16923:33;16920:120;;;16959:79;;:::i;:::-;16920:120;17079:1;17104:53;17149:7;17140:6;17129:9;17125:22;17104:53;:::i;:::-;17094:63;;17050:117;17206:2;17232:53;17277:7;17268:6;17257:9;17253:22;17232:53;:::i;:::-;17222:63;;17177:118;17334:2;17360:53;17405:7;17396:6;17385:9;17381:22;17360:53;:::i;:::-;17350:63;;17305:118;17490:2;17479:9;17475:18;17462:32;17521:18;17513:6;17510:30;17507:117;;;17543:79;;:::i;:::-;17507:117;17648:62;17702:7;17693:6;17682:9;17678:22;17648:62;:::i;:::-;17638:72;;17433:287;16784:943;;;;;;;:::o;17733:104::-;17798:6;17826:4;17816:14;;17733:104;;;:::o;17843:143::-;17940:11;17977:3;17962:18;;17843:143;;;;:::o;17992:98::-;18057:4;18080:3;18072:11;;17992:98;;;:::o;18096:111::-;18164:4;18196;18191:3;18187:14;18179:22;;18096:111;;;:::o;18245:694::-;18381:52;18427:5;18381:52;:::i;:::-;18449:84;18526:6;18521:3;18449:84;:::i;:::-;18442:91;;18557:54;18605:5;18557:54;:::i;:::-;18634:7;18665:1;18650:282;18675:6;18672:1;18669:13;18650:282;;;18751:6;18745:13;18778:63;18837:3;18822:13;18778:63;:::i;:::-;18771:70;;18864:58;18915:6;18864:58;:::i;:::-;18854:68;;18710:222;18697:1;18694;18690:9;18685:14;;18650:282;;;18654:14;18357:582;;;18245:694;;:::o;18945:315::-;19084:4;19122:3;19111:9;19107:19;19099:27;;19136:117;19250:1;19239:9;19235:17;19226:6;19136:117;:::i;:::-;18945:315;;;;:::o;19266:474::-;19334:6;19342;19391:2;19379:9;19370:7;19366:23;19362:32;19359:119;;;19397:79;;:::i;:::-;19359:119;19517:1;19542:53;19587:7;19578:6;19567:9;19563:22;19542:53;:::i;:::-;19532:63;;19488:117;19644:2;19670:53;19715:7;19706:6;19695:9;19691:22;19670:53;:::i;:::-;19660:63;;19615:118;19266:474;;;;;:::o;19746:180::-;19794:77;19791:1;19784:88;19891:4;19888:1;19881:15;19915:4;19912:1;19905:15;19932:320;19976:6;20013:1;20007:4;20003:12;19993:22;;20060:1;20054:4;20050:12;20081:18;20071:81;;20137:4;20129:6;20125:17;20115:27;;20071:81;20199:2;20191:6;20188:14;20168:18;20165:38;20162:84;;;20218:18;;:::i;:::-;20162:84;19983:269;19932:320;;;:::o;20258:231::-;20398:34;20394:1;20386:6;20382:14;20375:58;20467:14;20462:2;20454:6;20450:15;20443:39;20258:231;:::o;20495:366::-;20637:3;20658:67;20722:2;20717:3;20658:67;:::i;:::-;20651:74;;20734:93;20823:3;20734:93;:::i;:::-;20852:2;20847:3;20843:12;20836:19;;20495:366;;;:::o;20867:419::-;21033:4;21071:2;21060:9;21056:18;21048:26;;21120:9;21114:4;21110:20;21106:1;21095:9;21091:17;21084:47;21148:131;21274:4;21148:131;:::i;:::-;21140:139;;20867:419;;;:::o;21292:220::-;21432:34;21428:1;21420:6;21416:14;21409:58;21501:3;21496:2;21488:6;21484:15;21477:28;21292:220;:::o;21518:366::-;21660:3;21681:67;21745:2;21740:3;21681:67;:::i;:::-;21674:74;;21757:93;21846:3;21757:93;:::i;:::-;21875:2;21870:3;21866:12;21859:19;;21518:366;;;:::o;21890:419::-;22056:4;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;21890:419;;;:::o;22315:243::-;22455:34;22451:1;22443:6;22439:14;22432:58;22524:26;22519:2;22511:6;22507:15;22500:51;22315:243;:::o;22564:366::-;22706:3;22727:67;22791:2;22786:3;22727:67;:::i;:::-;22720:74;;22803:93;22892:3;22803:93;:::i;:::-;22921:2;22916:3;22912:12;22905:19;;22564:366;;;:::o;22936:419::-;23102:4;23140:2;23129:9;23125:18;23117:26;;23189:9;23183:4;23179:20;23175:1;23164:9;23160:17;23153:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;22936:419;;;:::o;23361:236::-;23501:34;23497:1;23489:6;23485:14;23478:58;23570:19;23565:2;23557:6;23553:15;23546:44;23361:236;:::o;23603:366::-;23745:3;23766:67;23830:2;23825:3;23766:67;:::i;:::-;23759:74;;23842:93;23931:3;23842:93;:::i;:::-;23960:2;23955:3;23951:12;23944:19;;23603:366;;;:::o;23975:419::-;24141:4;24179:2;24168:9;24164:18;24156:26;;24228:9;24222:4;24218:20;24214:1;24203:9;24199:17;24192:47;24256:131;24382:4;24256:131;:::i;:::-;24248:139;;23975:419;;;:::o;24400:182::-;24540:34;24536:1;24528:6;24524:14;24517:58;24400:182;:::o;24588:366::-;24730:3;24751:67;24815:2;24810:3;24751:67;:::i;:::-;24744:74;;24827:93;24916:3;24827:93;:::i;:::-;24945:2;24940:3;24936:12;24929:19;;24588:366;;;:::o;24960:419::-;25126:4;25164:2;25153:9;25149:18;25141:26;;25213:9;25207:4;25203:20;25199:1;25188:9;25184:17;25177:47;25241:131;25367:4;25241:131;:::i;:::-;25233:139;;24960:419;;;:::o;25385:230::-;25525:34;25521:1;25513:6;25509:14;25502:58;25594:13;25589:2;25581:6;25577:15;25570:38;25385:230;:::o;25621:366::-;25763:3;25784:67;25848:2;25843:3;25784:67;:::i;:::-;25777:74;;25860:93;25949:3;25860:93;:::i;:::-;25978:2;25973:3;25969:12;25962:19;;25621:366;;;:::o;25993:419::-;26159:4;26197:2;26186:9;26182:18;26174:26;;26246:9;26240:4;26236:20;26232:1;26221:9;26217:17;26210:47;26274:131;26400:4;26274:131;:::i;:::-;26266:139;;25993:419;;;:::o;26418:94::-;26451:8;26499:5;26495:2;26491:14;26470:35;;26418:94;;;:::o;26518:::-;26557:7;26586:20;26600:5;26586:20;:::i;:::-;26575:31;;26518:94;;;:::o;26618:100::-;26657:7;26686:26;26706:5;26686:26;:::i;:::-;26675:37;;26618:100;;;:::o;26724:157::-;26829:45;26849:24;26867:5;26849:24;:::i;:::-;26829:45;:::i;:::-;26824:3;26817:58;26724:157;;:::o;26887:397::-;27027:3;27042:75;27113:3;27104:6;27042:75;:::i;:::-;27142:2;27137:3;27133:12;27126:19;;27155:75;27226:3;27217:6;27155:75;:::i;:::-;27255:2;27250:3;27246:12;27239:19;;27275:3;27268:10;;26887:397;;;;;:::o;27290:98::-;27341:6;27375:5;27369:12;27359:22;;27290:98;;;:::o;27394:147::-;27495:11;27532:3;27517:18;;27394:147;;;;:::o;27547:373::-;27651:3;27679:38;27711:5;27679:38;:::i;:::-;27733:88;27814:6;27809:3;27733:88;:::i;:::-;27726:95;;27830:52;27875:6;27870:3;27863:4;27856:5;27852:16;27830:52;:::i;:::-;27907:6;27902:3;27898:16;27891:23;;27655:265;27547:373;;;;:::o;27926:79::-;27965:7;27994:5;27983:16;;27926:79;;;:::o;28011:157::-;28116:45;28136:24;28154:5;28136:24;:::i;:::-;28116:45;:::i;:::-;28111:3;28104:58;28011:157;;:::o;28174:412::-;28332:3;28354:93;28443:3;28434:6;28354:93;:::i;:::-;28347:100;;28457:75;28528:3;28519:6;28457:75;:::i;:::-;28557:2;28552:3;28548:12;28541:19;;28577:3;28570:10;;28174:412;;;;;:::o;28592:118::-;28679:24;28697:5;28679:24;:::i;:::-;28674:3;28667:37;28592:118;;:::o;28716:112::-;28799:22;28815:5;28799:22;:::i;:::-;28794:3;28787:35;28716:112;;:::o;28834:545::-;29007:4;29045:3;29034:9;29030:19;29022:27;;29059:71;29127:1;29116:9;29112:17;29103:6;29059:71;:::i;:::-;29140:68;29204:2;29193:9;29189:18;29180:6;29140:68;:::i;:::-;29218:72;29286:2;29275:9;29271:18;29262:6;29218:72;:::i;:::-;29300;29368:2;29357:9;29353:18;29344:6;29300:72;:::i;:::-;28834:545;;;;;;;:::o;29385:114::-;;:::o;29505:398::-;29664:3;29685:83;29766:1;29761:3;29685:83;:::i;:::-;29678:90;;29777:93;29866:3;29777:93;:::i;:::-;29895:1;29890:3;29886:11;29879:18;;29505:398;;;:::o;29909:379::-;30093:3;30115:147;30258:3;30115:147;:::i;:::-;30108:154;;30279:3;30272:10;;29909:379;;;:::o;30294:180::-;30342:77;30339:1;30332:88;30439:4;30436:1;30429:15;30463:4;30460:1;30453:15;30480:180;30528:77;30525:1;30518:88;30625:4;30622:1;30615:15;30649:4;30646:1;30639:15;30666:233;30705:3;30728:24;30746:5;30728:24;:::i;:::-;30719:33;;30774:66;30767:5;30764:77;30761:103;;;30844:18;;:::i;:::-;30761:103;30891:1;30884:5;30880:13;30873:20;;30666:233;;;:::o;30905:231::-;31045:34;31041:1;31033:6;31029:14;31022:58;31114:14;31109:2;31101:6;31097:15;31090:39;30905:231;:::o;31142:366::-;31284:3;31305:67;31369:2;31364:3;31305:67;:::i;:::-;31298:74;;31381:93;31470:3;31381:93;:::i;:::-;31499:2;31494:3;31490:12;31483:19;;31142:366;;;:::o;31514:419::-;31680:4;31718:2;31707:9;31703:18;31695:26;;31767:9;31761:4;31757:20;31753:1;31742:9;31738:17;31731:47;31795:131;31921:4;31795:131;:::i;:::-;31787:139;;31514:419;;;:::o;31939:228::-;32079:34;32075:1;32067:6;32063:14;32056:58;32148:11;32143:2;32135:6;32131:15;32124:36;31939:228;:::o;32173:366::-;32315:3;32336:67;32400:2;32395:3;32336:67;:::i;:::-;32329:74;;32412:93;32501:3;32412:93;:::i;:::-;32530:2;32525:3;32521:12;32514:19;;32173:366;;;:::o;32545:419::-;32711:4;32749:2;32738:9;32734:18;32726:26;;32798:9;32792:4;32788:20;32784:1;32773:9;32769:17;32762:47;32826:131;32952:4;32826:131;:::i;:::-;32818:139;;32545:419;;;:::o;32970:229::-;33110:34;33106:1;33098:6;33094:14;33087:58;33179:12;33174:2;33166:6;33162:15;33155:37;32970:229;:::o;33205:366::-;33347:3;33368:67;33432:2;33427:3;33368:67;:::i;:::-;33361:74;;33444:93;33533:3;33444:93;:::i;:::-;33562:2;33557:3;33553:12;33546:19;;33205:366;;;:::o;33577:419::-;33743:4;33781:2;33770:9;33766:18;33758:26;;33830:9;33824:4;33820:20;33816:1;33805:9;33801:17;33794:47;33858:131;33984:4;33858:131;:::i;:::-;33850:139;;33577:419;;;:::o;34002:191::-;34042:4;34062:20;34080:1;34062:20;:::i;:::-;34057:25;;34096:20;34114:1;34096:20;:::i;:::-;34091:25;;34135:1;34132;34129:8;34126:34;;;34140:18;;:::i;:::-;34126:34;34185:1;34182;34178:9;34170:17;;34002:191;;;;:::o;34199:348::-;34239:7;34262:20;34280:1;34262:20;:::i;:::-;34257:25;;34296:20;34314:1;34296:20;:::i;:::-;34291:25;;34484:1;34416:66;34412:74;34409:1;34406:81;34401:1;34394:9;34387:17;34383:105;34380:131;;;34491:18;;:::i;:::-;34380:131;34539:1;34536;34532:9;34521:20;;34199:348;;;;:::o;34553:180::-;34601:77;34598:1;34591:88;34698:4;34695:1;34688:15;34722:4;34719:1;34712:15;34739:185;34779:1;34796:20;34814:1;34796:20;:::i;:::-;34791:25;;34830:20;34848:1;34830:20;:::i;:::-;34825:25;;34869:1;34859:35;;34874:18;;:::i;:::-;34859:35;34916:1;34913;34909:9;34904:14;;34739:185;;;;:::o;34930:442::-;35079:4;35117:2;35106:9;35102:18;35094:26;;35130:71;35198:1;35187:9;35183:17;35174:6;35130:71;:::i;:::-;35211:72;35279:2;35268:9;35264:18;35255:6;35211:72;:::i;:::-;35293;35361:2;35350:9;35346:18;35337:6;35293:72;:::i;:::-;34930:442;;;;;;:::o;35378:137::-;35432:5;35463:6;35457:13;35448:22;;35479:30;35503:5;35479:30;:::i;:::-;35378:137;;;;:::o;35521:345::-;35588:6;35637:2;35625:9;35616:7;35612:23;35608:32;35605:119;;;35643:79;;:::i;:::-;35605:119;35763:1;35788:61;35841:7;35832:6;35821:9;35817:22;35788:61;:::i;:::-;35778:71;;35734:125;35521:345;;;;:::o;35872:166::-;36012:18;36008:1;36000:6;35996:14;35989:42;35872:166;:::o;36044:366::-;36186:3;36207:67;36271:2;36266:3;36207:67;:::i;:::-;36200:74;;36283:93;36372:3;36283:93;:::i;:::-;36401:2;36396:3;36392:12;36385:19;;36044:366;;;:::o;36416:419::-;36582:4;36620:2;36609:9;36605:18;36597:26;;36669:9;36663:4;36659:20;36655:1;36644:9;36640:17;36633:47;36697:131;36823:4;36697:131;:::i;:::-;36689:139;;36416:419;;;:::o;36841:332::-;36962:4;37000:2;36989:9;36985:18;36977:26;;37013:71;37081:1;37070:9;37066:17;37057:6;37013:71;:::i;:::-;37094:72;37162:2;37151:9;37147:18;37138:6;37094:72;:::i;:::-;36841:332;;;;;:::o;37179:175::-;37319:27;37315:1;37307:6;37303:14;37296:51;37179:175;:::o;37360:366::-;37502:3;37523:67;37587:2;37582:3;37523:67;:::i;:::-;37516:74;;37599:93;37688:3;37599:93;:::i;:::-;37717:2;37712:3;37708:12;37701:19;;37360:366;;;:::o;37732:419::-;37898:4;37936:2;37925:9;37921:18;37913:26;;37985:9;37979:4;37975:20;37971:1;37960:9;37956:17;37949:47;38013:131;38139:4;38013:131;:::i;:::-;38005:139;;37732:419;;;:::o;38157:224::-;38297:34;38293:1;38285:6;38281:14;38274:58;38366:7;38361:2;38353:6;38349:15;38342:32;38157:224;:::o;38387:366::-;38529:3;38550:67;38614:2;38609:3;38550:67;:::i;:::-;38543:74;;38626:93;38715:3;38626:93;:::i;:::-;38744:2;38739:3;38735:12;38728:19;;38387:366;;;:::o;38759:419::-;38925:4;38963:2;38952:9;38948:18;38940:26;;39012:9;39006:4;39002:20;38998:1;38987:9;38983:17;38976:47;39040:131;39166:4;39040:131;:::i;:::-;39032:139;;38759:419;;;:::o;39184:234::-;39324:34;39320:1;39312:6;39308:14;39301:58;39393:17;39388:2;39380:6;39376:15;39369:42;39184:234;:::o;39424:366::-;39566:3;39587:67;39651:2;39646:3;39587:67;:::i;:::-;39580:74;;39663:93;39752:3;39663:93;:::i;:::-;39781:2;39776:3;39772:12;39765:19;;39424:366;;;:::o;39796:419::-;39962:4;40000:2;39989:9;39985:18;39977:26;;40049:9;40043:4;40039:20;40035:1;40024:9;40020:17;40013:47;40077:131;40203:4;40077:131;:::i;:::-;40069:139;;39796:419;;;:::o;40221:148::-;40323:11;40360:3;40345:18;;40221:148;;;;:::o;40375:377::-;40481:3;40509:39;40542:5;40509:39;:::i;:::-;40564:89;40646:6;40641:3;40564:89;:::i;:::-;40557:96;;40662:52;40707:6;40702:3;40695:4;40688:5;40684:16;40662:52;:::i;:::-;40739:6;40734:3;40730:16;40723:23;;40485:267;40375:377;;;;:::o;40758:151::-;40898:3;40894:1;40886:6;40882:14;40875:27;40758:151;:::o;40915:400::-;41075:3;41096:84;41178:1;41173:3;41096:84;:::i;:::-;41089:91;;41189:93;41278:3;41189:93;:::i;:::-;41307:1;41302:3;41298:11;41291:18;;40915:400;;;:::o;41321:141::-;41370:4;41393:3;41385:11;;41416:3;41413:1;41406:14;41450:4;41447:1;41437:18;41429:26;;41321:141;;;:::o;41492:845::-;41595:3;41632:5;41626:12;41661:36;41687:9;41661:36;:::i;:::-;41713:89;41795:6;41790:3;41713:89;:::i;:::-;41706:96;;41833:1;41822:9;41818:17;41849:1;41844:137;;;;41995:1;41990:341;;;;41811:520;;41844:137;41928:4;41924:9;41913;41909:25;41904:3;41897:38;41964:6;41959:3;41955:16;41948:23;;41844:137;;41990:341;42057:38;42089:5;42057:38;:::i;:::-;42117:1;42131:154;42145:6;42142:1;42139:13;42131:154;;;42219:7;42213:14;42209:1;42204:3;42200:11;42193:35;42269:1;42260:7;42256:15;42245:26;;42167:4;42164:1;42160:12;42155:17;;42131:154;;;42314:6;42309:3;42305:16;42298:23;;41997:334;;41811:520;;41599:738;;41492:845;;;;:::o;42343:1015::-;42717:3;42739:95;42830:3;42821:6;42739:95;:::i;:::-;42732:102;;42851:95;42942:3;42933:6;42851:95;:::i;:::-;42844:102;;42963:148;43107:3;42963:148;:::i;:::-;42956:155;;43128:95;43219:3;43210:6;43128:95;:::i;:::-;43121:102;;43240:92;43328:3;43319:6;43240:92;:::i;:::-;43233:99;;43349:3;43342:10;;42343:1015;;;;;;;:::o;43364:225::-;43504:34;43500:1;43492:6;43488:14;43481:58;43573:8;43568:2;43560:6;43556:15;43549:33;43364:225;:::o;43595:366::-;43737:3;43758:67;43822:2;43817:3;43758:67;:::i;:::-;43751:74;;43834:93;43923:3;43834:93;:::i;:::-;43952:2;43947:3;43943:12;43936:19;;43595:366;;;:::o;43967:419::-;44133:4;44171:2;44160:9;44156:18;44148:26;;44220:9;44214:4;44210:20;44206:1;44195:9;44191:17;44184:47;44248:131;44374:4;44248:131;:::i;:::-;44240:139;;43967:419;;;:::o;44392:143::-;44449:5;44480:6;44474:13;44465:22;;44496:33;44523:5;44496:33;:::i;:::-;44392:143;;;;:::o;44541:351::-;44611:6;44660:2;44648:9;44639:7;44635:23;44631:32;44628:119;;;44666:79;;:::i;:::-;44628:119;44786:1;44811:64;44867:7;44858:6;44847:9;44843:22;44811:64;:::i;:::-;44801:74;;44757:128;44541:351;;;;:::o;44898:231::-;45038:34;45034:1;45026:6;45022:14;45015:58;45107:14;45102:2;45094:6;45090:15;45083:39;44898:231;:::o;45135:366::-;45277:3;45298:67;45362:2;45357:3;45298:67;:::i;:::-;45291:74;;45374:93;45463:3;45374:93;:::i;:::-;45492:2;45487:3;45483:12;45476:19;;45135:366;;;:::o;45507:419::-;45673:4;45711:2;45700:9;45696:18;45688:26;;45760:9;45754:4;45750:20;45746:1;45735:9;45731:17;45724:47;45788:131;45914:4;45788:131;:::i;:::-;45780:139;;45507:419;;;:::o;45932:228::-;46072:34;46068:1;46060:6;46056:14;46049:58;46141:11;46136:2;46128:6;46124:15;46117:36;45932:228;:::o;46166:366::-;46308:3;46329:67;46393:2;46388:3;46329:67;:::i;:::-;46322:74;;46405:93;46494:3;46405:93;:::i;:::-;46523:2;46518:3;46514:12;46507:19;;46166:366;;;:::o;46538:419::-;46704:4;46742:2;46731:9;46727:18;46719:26;;46791:9;46785:4;46781:20;46777:1;46766:9;46762:17;46755:47;46819:131;46945:4;46819:131;:::i;:::-;46811:139;;46538:419;;;:::o;46963:223::-;47103:34;47099:1;47091:6;47087:14;47080:58;47172:6;47167:2;47159:6;47155:15;47148:31;46963:223;:::o;47192:366::-;47334:3;47355:67;47419:2;47414:3;47355:67;:::i;:::-;47348:74;;47431:93;47520:3;47431:93;:::i;:::-;47549:2;47544:3;47540:12;47533:19;;47192:366;;;:::o;47564:419::-;47730:4;47768:2;47757:9;47753:18;47745:26;;47817:9;47811:4;47807:20;47803:1;47792:9;47788:17;47781:47;47845:131;47971:4;47845:131;:::i;:::-;47837:139;;47564:419;;;:::o;47989:305::-;48029:3;48048:20;48066:1;48048:20;:::i;:::-;48043:25;;48082:20;48100:1;48082:20;:::i;:::-;48077:25;;48236:1;48168:66;48164:74;48161:1;48158:81;48155:107;;;48242:18;;:::i;:::-;48155:107;48286:1;48283;48279:9;48272:16;;47989:305;;;;:::o;48300:173::-;48440:25;48436:1;48428:6;48424:14;48417:49;48300:173;:::o;48479:366::-;48621:3;48642:67;48706:2;48701:3;48642:67;:::i;:::-;48635:74;;48718:93;48807:3;48718:93;:::i;:::-;48836:2;48831:3;48827:12;48820:19;;48479:366;;;:::o;48851:419::-;49017:4;49055:2;49044:9;49040:18;49032:26;;49104:9;49098:4;49094:20;49090:1;49079:9;49075:17;49068:47;49132:131;49258:4;49132:131;:::i;:::-;49124:139;;48851:419;;;:::o;49276:167::-;49416:19;49412:1;49404:6;49400:14;49393:43;49276:167;:::o;49449:366::-;49591:3;49612:67;49676:2;49671:3;49612:67;:::i;:::-;49605:74;;49688:93;49777:3;49688:93;:::i;:::-;49806:2;49801:3;49797:12;49790:19;;49449:366;;;:::o;49821:419::-;49987:4;50025:2;50014:9;50010:18;50002:26;;50074:9;50068:4;50064:20;50060:1;50049:9;50045:17;50038:47;50102:131;50228:4;50102:131;:::i;:::-;50094:139;;49821:419;;;:::o;50246:168::-;50386:20;50382:1;50374:6;50370:14;50363:44;50246:168;:::o;50420:366::-;50562:3;50583:67;50647:2;50642:3;50583:67;:::i;:::-;50576:74;;50659:93;50748:3;50659:93;:::i;:::-;50777:2;50772:3;50768:12;50761:19;;50420:366;;;:::o;50792:419::-;50958:4;50996:2;50985:9;50981:18;50973:26;;51045:9;51039:4;51035:20;51031:1;51020:9;51016:17;51009:47;51073:131;51199:4;51073:131;:::i;:::-;51065:139;;50792:419;;;:::o;51217:237::-;51357:34;51353:1;51345:6;51341:14;51334:58;51426:20;51421:2;51413:6;51409:15;51402:45;51217:237;:::o;51460:366::-;51602:3;51623:67;51687:2;51682:3;51623:67;:::i;:::-;51616:74;;51699:93;51788:3;51699:93;:::i;:::-;51817:2;51812:3;51808:12;51801:19;;51460:366;;;:::o;51832:419::-;51998:4;52036:2;52025:9;52021:18;52013:26;;52085:9;52079:4;52075:20;52071:1;52060:9;52056:17;52049:47;52113:131;52239:4;52113:131;:::i;:::-;52105:139;;51832:419;;;:::o;52257:176::-;52289:1;52306:20;52324:1;52306:20;:::i;:::-;52301:25;;52340:20;52358:1;52340:20;:::i;:::-;52335:25;;52379:1;52369:35;;52384:18;;:::i;:::-;52369:35;52425:1;52422;52418:9;52413:14;;52257:176;;;;:::o;52439:442::-;52588:4;52626:2;52615:9;52611:18;52603:26;;52639:71;52707:1;52696:9;52692:17;52683:6;52639:71;:::i;:::-;52720:72;52788:2;52777:9;52773:18;52764:6;52720:72;:::i;:::-;52802;52870:2;52859:9;52855:18;52846:6;52802:72;:::i;:::-;52439:442;;;;;;:::o;52887:332::-;53008:4;53046:2;53035:9;53031:18;53023:26;;53059:71;53127:1;53116:9;53112:17;53103:6;53059:71;:::i;:::-;53140:72;53208:2;53197:9;53193:18;53184:6;53140:72;:::i;:::-;52887:332;;;;;:::o;53225:168::-;53308:11;53342:6;53337:3;53330:19;53382:4;53377:3;53373:14;53358:29;;53225:168;;;;:::o;53399:360::-;53485:3;53513:38;53545:5;53513:38;:::i;:::-;53567:70;53630:6;53625:3;53567:70;:::i;:::-;53560:77;;53646:52;53691:6;53686:3;53679:4;53672:5;53668:16;53646:52;:::i;:::-;53723:29;53745:6;53723:29;:::i;:::-;53718:3;53714:39;53707:46;;53489:270;53399:360;;;;:::o;53765:640::-;53960:4;53998:3;53987:9;53983:19;53975:27;;54012:71;54080:1;54069:9;54065:17;54056:6;54012:71;:::i;:::-;54093:72;54161:2;54150:9;54146:18;54137:6;54093:72;:::i;:::-;54175;54243:2;54232:9;54228:18;54219:6;54175:72;:::i;:::-;54294:9;54288:4;54284:20;54279:2;54268:9;54264:18;54257:48;54322:76;54393:4;54384:6;54322:76;:::i;:::-;54314:84;;53765:640;;;;;;;:::o;54411:141::-;54467:5;54498:6;54492:13;54483:22;;54514:32;54540:5;54514:32;:::i;:::-;54411:141;;;;:::o;54558:349::-;54627:6;54676:2;54664:9;54655:7;54651:23;54647:32;54644:119;;;54682:79;;:::i;:::-;54644:119;54802:1;54827:63;54882:7;54873:6;54862:9;54858:22;54827:63;:::i;:::-;54817:73;;54773:127;54558:349;;;;:::o;54913:180::-;54961:77;54958:1;54951:88;55058:4;55055:1;55048:15;55082:4;55079:1;55072:15;55099:182;55239:34;55235:1;55227:6;55223:14;55216:58;55099:182;:::o;55287:366::-;55429:3;55450:67;55514:2;55509:3;55450:67;:::i;:::-;55443:74;;55526:93;55615:3;55526:93;:::i;:::-;55644:2;55639:3;55635:12;55628:19;;55287:366;;;:::o;55659:419::-;55825:4;55863:2;55852:9;55848:18;55840:26;;55912:9;55906:4;55902:20;55898:1;55887:9;55883:17;55876:47;55940:131;56066:4;55940:131;:::i;:::-;55932:139;;55659:419;;;:::o;56084:178::-;56224:30;56220:1;56212:6;56208:14;56201:54;56084:178;:::o;56268:366::-;56410:3;56431:67;56495:2;56490:3;56431:67;:::i;:::-;56424:74;;56507:93;56596:3;56507:93;:::i;:::-;56625:2;56620:3;56616:12;56609:19;;56268:366;;;:::o;56640:419::-;56806:4;56844:2;56833:9;56829:18;56821:26;;56893:9;56887:4;56883:20;56879:1;56868:9;56864:17;56857:47;56921:131;57047:4;56921:131;:::i;:::-;56913:139;;56640:419;;;:::o

Swarm Source

ipfs://406ba0cd0f421f3a14475d677bb1a975809e0eee17f9126b3cbacc5c5493b461
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.