ETH Price: $2,345.34 (-5.56%)

Token

The WordFaces NFTs (WordFace)
 

Overview

Max Total Supply

285 WordFace

Holders

185

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WORDFACES

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-20
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (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/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev 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


// OpenZeppelin Contracts v4.4.0 (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: contracts/words final.sol



pragma solidity >=0.7.0 <0.9.0;




contract WORDFACES is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string baseURI;
  string public baseExtension = ".json";
  
  uint256 public costWhitelisted = 0.04 ether; //presale price
  uint256 public cost = 0.06 ether; //public sale price

  uint256 public maxSupply = 2222; //max supply
  uint256 public maxSupplyPresale = 750; //presale max supply

  uint256 public maxMintAmount = 10; //max nfts per trx
  uint256 public nftPerAddressLimit = 3; //max nfts per wallet on presale

  bool public paused = false;
  bool public revealed = false;

  string public notRevealedUri;
  
  address[] public whitelistedAddresses;
 
  uint public presaleStartTimestamp = 1640008800; //DEC 20 2PM UTC Presale
  uint public mintingStartTimestamp = 1640095200; //DEC 21 2PM UTC Public Sale
  
  uint public moneyProportionForReward = 15; 

  uint256 public moneyOwner; 
  uint256 public moneyReward; 

  uint256 public moneyReward_Init; 
  uint256 public moneyReward_Payed;
  
  uint public money_Calculate;
 
  //Payout dates
  uint[] public rewardsTimestamp = 
  [
    1640995200, //JAN 1 2022
    1643673600, //FEB 1 2022
    1646092800, //Mar 1 2022
    1648771200, //Apr 1 2022
    1651363200, //May 1 2022
    1654041600, //June 1 2022
    1656633600, //July 1 2022
    1659312000, //Aug 1 2022
    1661990400, //Sept 1 2022
    1664582400, //Oct 1 2022
    1667260800, //Nov 1 2022
    1669852800  //Dec 1 2022
  ];

  uint[] public moneyReward_AddedPerMonth = [0,0,0, 0,0,0, 0,0,0, 0,0,0];

  TokenWithReward[] public tokensReward;
  struct TokenWithReward 
  {
    uint id;
    uint256 reward;//Payout share
    uint256 timestamp; //Last payout date
  }
  
  mapping(address => uint256) public addressMintedBalance;
   
  using Counters for Counters.Counter;
  Counters.Counter private _tokenCount;
  uint256 private startFrom = 1;
  mapping(uint256 => uint256) private tokenMatrix_Presale;
  mapping(uint256 => uint256) private tokenMatrix;
  using Strings for uint256;
  

  constructor(string memory _initNotRevealedUri) 
  ERC721("The WordFaces NFTs", "WordFace") 
  {
    setNotRevealedURI(_initNotRevealedUri);
    
    //Diamond WordFaces
    addTokenWithReward(1, 19);
    addTokenWithReward(2222, 19);

    //Gold WordFaces
    addTokenWithReward(111, 6);
    addTokenWithReward(555, 6);
    addTokenWithReward(1111, 6);
    addTokenWithReward(1999, 6);

    //Silver WordFaces
    addTokenWithReward(7, 3);
    addTokenWithReward(70, 3);
    addTokenWithReward(700, 3);
    addTokenWithReward(1000, 3);
    addTokenWithReward(1500, 3);
    addTokenWithReward(2000, 3);

    //Bronze WordFaces
    addTokenWithReward(100, 2);
    addTokenWithReward(200, 2);
    addTokenWithReward(300, 2);
    addTokenWithReward(400, 2);
    addTokenWithReward(500, 2);
    addTokenWithReward(808, 2);
    addTokenWithReward(909, 2);
    addTokenWithReward(1001, 2);
    addTokenWithReward(2002, 2);
    addTokenWithReward(2200, 2);  
  }

  function addTokenWithReward(uint id_, uint reward_) public onlyOwner()
  {
    TokenWithReward memory tokenWithReward = TokenWithReward(id_, reward_, 0);
    tokensReward.push(tokenWithReward);
  }

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

  function mint(uint256 _mintAmount) public payable 
  {
    uint256 timestampNow = block.timestamp;

    uint256 supply = totalSupply();
    require(_mintAmount > 0, "Need amount is > 0");
    require(_mintAmount <= maxMintAmount, "Too much");
    require(supply + _mintAmount <= maxSupply, "You are trying to buy more than the limit");

    require(!paused, "Smart Contract is paused");
    require(timestampNow > presaleStartTimestamp, "Minting is not available");
  
    //presale  
    if(timestampNow <= mintingStartTimestamp) {
        require(isWhitelisted(msg.sender), "user is not whitelisted");
        uint256 ownerMintedCount = addressMintedBalance[msg.sender];
        require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        require(msg.value >= costWhitelisted * _mintAmount, "Wrong mint price");
    }
    //main sale
    else if(timestampNow > mintingStartTimestamp){
        require(msg.value >= cost * _mintAmount, "Wrong mint price");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      uint256 id = nextToken();
      _safeMint(msg.sender, id);
    }
    
    uint money = msg.value;
    uint reward = moneyProportionForReward * money / 100;
    
    moneyOwner += (money-reward);
    moneyReward += reward;
    
    for (uint i; i < rewardsTimestamp.length; i++)
    {
      if(i+1 < rewardsTimestamp.length && timestampNow > rewardsTimestamp[i] && timestampNow < rewardsTimestamp[i+1])
      {
        moneyReward_AddedPerMonth[i] += reward;
      }
    }
  }

  function mintToAddress(address _address, uint256 _mintAmount) public onlyOwner() 
  {
    uint256 supply = totalSupply();
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);
    
    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[_address]++;
      uint256 id = nextToken();
      _safeMint(_address, id);
    }
  }

  function setMintingStartTimestamp(uint _newMintingStartTimestamp) public onlyOwner 
  {
    mintingStartTimestamp = _newMintingStartTimestamp;
  }
  
  function setPresaleStartTimestamp(uint _newPresaleStartTimestamp) public onlyOwner 
  {
    presaleStartTimestamp = _newPresaleStartTimestamp;
  }
  
  function setBaseURI(string memory _newBaseURI) public onlyOwner 
  {
    baseURI = _newBaseURI;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner 
  {
    notRevealedUri = _notRevealedURI;
  }
  
  function setReveal(bool _reveal) public onlyOwner() 
  {
      revealed = _reveal;
  }

  // Payout. The function should be called by the owners of the NFT
  // tokenID_ = 0 - Receive payments from all deposits
  // tokenID_ = ID - Receive payments from a specific NFT
  function TryPayToWinner_Token(uint256 tokenID_) public payable
  {    
        uint256 timestampNow = block.timestamp;

        require(timestampNow >= rewardsTimestamp[0], "Payments have not started yet!");
        
        if(moneyReward_Init == 0)
        {
            moneyReward_Init = moneyReward;
        }
        
        uint money = 0;
        
        uint256[] memory tokensUser = walletOfOwner(msg.sender);

        money_Calculate = 0;

        uint isHasRewards = 0;

        for (uint i; i < tokensReward.length; i++) 
        {
            for (uint ii; ii < tokensUser.length; ii++)
            {
                if(tokensReward[i].id == tokensUser[ii] && (tokenID_ == 0 || tokensReward[i].id == tokenID_))
                {
                    isHasRewards = 1;
                    for (uint iii; iii < rewardsTimestamp.length; iii++)
                    {
                        if(tokensReward[i].timestamp < rewardsTimestamp[iii] && timestampNow > rewardsTimestamp[iii])
                        {
                            if(iii > 0)
                            {
                                money_Calculate = (moneyReward_Init/12) * tokensReward[i].reward / 100 + (moneyReward_AddedPerMonth[iii-1]/(rewardsTimestamp.length-iii)) * tokensReward[i].reward / 100;
                            }
                            else
                            {
                                money_Calculate = (moneyReward_Init/12) * tokensReward[i].reward / 100;
                            }
                            
                            money += money_Calculate;
                        }
                    }
                    tokensReward[i].timestamp = timestampNow; 
                    break;
                }
            }
        }
        moneyReward -= money;
        moneyReward_Payed += money;
        
        require(isHasRewards > 0, "You do not have NTF with payouts!");
        require(money > 0, "No payouts yet, come back later");
        
        payable(msg.sender).transfer(money);
  }

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

  function nextToken() internal ensureAvailability returns (uint256) 
  {
    uint256 timestampNow = block.timestamp;

      uint256 maxIndex = 1;
        
      if (totalSupply() < maxSupplyPresale)
      {
        maxIndex = maxSupplyPresale - totalSupply();
            
        uint256 random = uint256(keccak256(
        abi.encodePacked(
          msg.sender,
          block.coinbase,
          block.difficulty,
          block.gaslimit,
          timestampNow
          )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix_Presale[random] == 0) {
          value = random;
        } else {
          value = tokenMatrix_Presale[random];
        }

        if (tokenMatrix_Presale[maxIndex - 1] == 0) {
          tokenMatrix_Presale[random] = maxIndex - 1;
        } else {
          tokenMatrix_Presale[random] = tokenMatrix_Presale[maxIndex - 1];
        }

        incrementToken();

        return value + startFrom;
      }
      else 
      {
        maxIndex = maxSupply - totalSupply();
            
        uint256 random = uint256(keccak256(
          abi.encodePacked(
            msg.sender,
            block.coinbase,
            block.difficulty,
            block.gaslimit,
            timestampNow
          )
        )) % maxIndex;
    
        uint256 value = 0;
        if (tokenMatrix[random] == 0) 
        {
          value = random;
        } else 
        {
          value = tokenMatrix[random];
        }

        if (tokenMatrix[maxIndex - 1] == 0) {
          tokenMatrix[random] = maxIndex - 1;
        } else 
        {
          tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }
        incrementToken();
        return value + (startFrom + maxSupplyPresale);
      }    
  }

  function isWhitelisted(address _user) public view returns (bool) 
  {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }
  
  //Request which NTF me own
  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 tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  function setMaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() 
  {
    maxMintAmount = _newmaxMintAmount;
  }

  function setCost(uint256 _newCost) public onlyOwner() 
  {
    cost = _newCost;
  }
  
  function setCostWhitelisted(uint256 _newCostWhitelisted) public onlyOwner() 
  {
    costWhitelisted = _newCostWhitelisted;
  }
  
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner() 
  {
    nftPerAddressLimit = _limit;
  }

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

  function setMoneyProportionForReward(uint _newMoneyProportionForReward) public onlyOwner 
  {
    moneyProportionForReward = _newMoneyProportionForReward;
  }

  function getNftPerAddressLimit() public view returns (uint256) 
  {
    return maxMintAmount;
  }

  function getPaused() public view returns (bool)
  {
    return paused;
  }

  function getCost() public view returns (uint256) 
  {
    return cost;
  }

  function getCostWhitelisted() public view returns (uint256) 
  {
    return costWhitelisted;
  }

  function getMaxMintAmount() public view returns (uint256) 
  {
    return maxMintAmount;
  }

    function getMoneyOwner() external view returns (uint256) 
  {
    return moneyOwner;
  }

  function getMoneyReward() external view returns (uint256) 
  {
    return moneyReward;
  }

  function getBalance() external view returns (uint256) 
  {
    return address(this).balance;
  }
   
  function getMintingStartTimestamp() external view returns (uint256)
  {
    return mintingStartTimestamp;
  }

  function getPresaleStartTimestamp() external view returns (uint256)
  {
    return presaleStartTimestamp;
  }
  
  function whitelistUsers(address[] calldata _users) public onlyOwner 
  {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

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

  //For application 

  function getRewardsTimestamp() public view returns (uint[] memory)
  {
    return rewardsTimestamp;
  }
  
  function getTokensReward() public view returns (TokenWithReward[] memory)
  {
    return tokensReward;
  }
  
  function getBlockTimestamp() public view returns (uint256)
  {
    uint256 timestampNow = block.timestamp;
    return timestampNow;
  }
  
  function getMoneyRewardInit() public view returns (uint256)
  {
    if(moneyReward_Init == 0)
    {
      return moneyReward;
    }
    return moneyReward_Init;
  }
  
  function getMoneyRewardAddedPerMonth() public view returns (uint[] memory)
  {
    return moneyReward_AddedPerMonth;
  }
    
  /// @dev Get the current token count
  /// @return the created token count
  function tokenCount() public view returns (uint256) {
    return _tokenCount.current();
  }

  /// @dev Check whether tokens are still available
  /// @return the available token count
  function availableTokenCount() public view returns (uint256) {
    return maxSupply - totalSupply();
  }

  /// @dev Increment the token count and fetch the latest count
  /// @return the next token id
  function incrementToken() internal virtual ensureAvailability returns (uint256) {
    uint256 token = _tokenCount.current();
    _tokenCount.increment();
    return token;
  }

  /// @dev Check whether another token is still available
  modifier ensureAvailability() {
    require(availableTokenCount() > 0, "No more tokens available");
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenID_","type":"uint256"}],"name":"TryPayToWinner_Token","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"reward_","type":"uint256"}],"name":"addTokenWithReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCostWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMoneyOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMoneyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMoneyRewardAddedPerMonth","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMoneyRewardInit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsTimestamp","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensReward","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct WORDFACES.TokenWithReward[]","name":"","type":"tuple[]"}],"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":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moneyOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moneyProportionForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moneyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"moneyReward_AddedPerMonth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moneyReward_Init","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moneyReward_Payed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"money_Calculate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsTimestamp","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":"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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCostWhitelisted","type":"uint256"}],"name":"setCostWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintingStartTimestamp","type":"uint256"}],"name":"setMintingStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMoneyProportionForReward","type":"uint256"}],"name":"setMoneyProportionForReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresaleStartTimestamp","type":"uint256"}],"name":"setPresaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensReward","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600c919062000542565b50668e1bc9bf040000600d5566d529ae9e860000600e556108ae600f9081556102ee601055600a60115560036012556013805461ffff191690556361c08c606016556361c1dde060175560185560408051610180810182526361cf998081526361f87800602082015263621d6200918101919091526362464080606082015263626dcd806080820152636296ac0060a08201526362be390060c08201526362e7178060e082015263630ff60061010082015263633783006101208201526363606180610140820152636387ee806101608201526200010b90601e90600c620005d1565b506040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526200017d90601f90600c62000617565b5060016023553480156200019057600080fd5b506040516200448538038062004485833981016040819052620001b39162000671565b604080518082018252601281527154686520576f72644661636573204e46547360701b602080830191825283518085019094526008845267576f72644661636560c01b9084015281519192916200020d9160009162000542565b5080516200022390600190602084019062000542565b505050620002406200023a6200039660201b60201c565b6200039a565b6200024b81620003ec565b620002596001601362000454565b620002686108ae601362000454565b62000276606f600662000454565b6200028561022b600662000454565b62000294610457600662000454565b620002a36107cf600662000454565b620002b16007600362000454565b620002bf6046600362000454565b620002ce6102bc600362000454565b620002dd6103e8600362000454565b620002ec6105dc600362000454565b620002fb6107d0600362000454565b620003096064600262000454565b6200031760c8600262000454565b6200032661012c600262000454565b62000335610190600262000454565b620003446101f4600262000454565b62000353610328600262000454565b6200036261038d600262000454565b620003716103e9600262000454565b620003806107d2600262000454565b6200038f610898600262000454565b50620007a0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200043b5760405162461bcd60e51b815260206004820181905260248201526000805160206200446583398151915260448201526064015b60405180910390fd5b80516200045090601490602084019062000542565b5050565b600a546001600160a01b031633146200049f5760405162461bcd60e51b8152602060048201819052602482015260008051602062004465833981519152604482015260640162000432565b604080516060810182529283526020808401928352600091840182815281546001810183559190925292517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb60039094029384015590517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bd90910155565b82805462000550906200074d565b90600052602060002090601f016020900481019282620005745760008555620005bf565b82601f106200058f57805160ff1916838001178555620005bf565b82800160010185558215620005bf579182015b82811115620005bf578251825591602001919060010190620005a2565b50620005cd9291506200065a565b5090565b828054828255906000526020600020908101928215620005bf579160200282015b82811115620005bf578251829063ffffffff16905591602001919060010190620005f2565b828054828255906000526020600020908101928215620005bf579160200282015b82811115620005bf578251829060ff1690559160200191906001019062000638565b5b80821115620005cd57600081556001016200065b565b600060208083850312156200068557600080fd5b82516001600160401b03808211156200069d57600080fd5b818501915085601f830112620006b257600080fd5b815181811115620006c757620006c76200078a565b604051601f8201601f19908116603f01168101908382118183101715620006f257620006f26200078a565b8160405282815288868487010111156200070b57600080fd5b600093505b828410156200072f578484018601518185018701529285019262000710565b82841115620007415760008684830101525b98975050505050505050565b600181811c908216806200076257607f821691505b602082108114156200078457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613cb580620007b06000396000f3fe6080604052600436106104685760003560e01c8063715018a61161024a578063bd3e19d411610139578063df927c11116100b6578063e985e9c51161007a578063e985e9c514610c6a578063ecbbc18f14610cb3578063edec5f2714610cc8578063f2c4ce1e14610ce8578063f2fde38b14610d0857600080fd5b8063df927c1114610bcf578063e0010caa14610be5578063e03f2fdf14610bfa578063e14ca35314610c35578063e3bc776214610c4a57600080fd5b8063d0eb26b0116100fd578063d0eb26b014610b63578063d5abeb0114610b83578063d6e7b8e414610af9578063da3b618414610b99578063da3ef23f14610baf57600080fd5b8063bd3e19d414610ae4578063be43089d14610af9578063bedb86fb14610b0e578063c668286214610b2e578063c87b56dd14610b4357600080fd5b8063a0712d68116101c7578063b7a23d9c1161018b578063b7a23d9c14610a57578063b88d4fde14610a6c578063ba4e5c4914610a8c578063ba7d2c7614610aac578063bcc1275514610ac257600080fd5b8063a0712d68146109d9578063a22cb465146109ec578063a44e065e14610a0c578063aeb9a45714610a21578063b7877ed414610a4157600080fd5b80638da5cb5b1161020e5780638da5cb5b1461096657806395d89b4114610984578063990c3223146109995780639b5d1b6e146109ae5780639f181b5e146109c457600080fd5b8063715018a6146108fd57806373e404711461091257806376362a8214610928578063796b89b91461093d578063831df0d41461095057600080fd5b806325977ec7116103665780634ea37fec116102e35780635c975abb116102a75780635c975abb146108755780636352211e1461088f578063655159c2146108af5780636805b84b146108c557806370a08231146108dd57600080fd5b80634ea37fec146107ea5780634f6ccce714610800578063518302271461082057806355b088521461083f57806355f804b31461085557600080fd5b80633af32abf1161032a5780633af32abf146107555780633ccfd60b1461077557806342842e0e1461077d578063438b63001461079d57806344a0d68a146107ca57600080fd5b806325977ec7146106cb5780632a3f300c146106eb5780632abee2751461070b5780632f745c59146107205780633793d5a21461074057600080fd5b806313078948116103f457806318cae269116103b857806318cae2691461062857806321ca423614610655578063239c70ae1461067557806323b872dd1461068b57806323f7cb4c146106ab57600080fd5b806313078948146105a757806313faede6146105bd57806315fceaea146105d35780631602f04a146105f357806318160ddd1461061357600080fd5b8063081c8c441161043b578063081c8c4414610511578063088a4ed014610526578063095ea7b31461054657806311824f791461056657806312065fe01461059457600080fd5b8063012427f21461046d57806301ffc9a71461048257806306fdde03146104b7578063081812fc146104d9575b600080fd5b61048061047b3660046137d8565b610d28565b005b34801561048e57600080fd5b506104a261049d366004613755565b61118b565b60405190151581526020015b60405180910390f35b3480156104c357600080fd5b506104cc6111b6565b6040516104ae9190613a18565b3480156104e557600080fd5b506104f96104f43660046137d8565b611248565b6040516001600160a01b0390911681526020016104ae565b34801561051d57600080fd5b506104cc6112dd565b34801561053257600080fd5b506104806105413660046137d8565b61136b565b34801561055257600080fd5b5061048061056136600461369b565b61139a565b34801561057257600080fd5b506105866105813660046137d8565b6114b0565b6040519081526020016104ae565b3480156105a057600080fd5b5047610586565b3480156105b357600080fd5b5061058660105481565b3480156105c957600080fd5b50610586600e5481565b3480156105df57600080fd5b506104806105ee3660046137f1565b6114d1565b3480156105ff57600080fd5b5061048061060e3660046137d8565b61159e565b34801561061f57600080fd5b50600854610586565b34801561063457600080fd5b5061058661064336600461356b565b60216020526000908152604090205481565b34801561066157600080fd5b5061048061067036600461369b565b6115cd565b34801561068157600080fd5b5061058660115481565b34801561069757600080fd5b506104806106a63660046135b9565b61169a565b3480156106b757600080fd5b506105866106c63660046137d8565b6116cb565b3480156106d757600080fd5b506104806106e63660046137d8565b6116db565b3480156106f757600080fd5b5061048061070636600461373a565b61170a565b34801561071757600080fd5b50601954610586565b34801561072c57600080fd5b5061058661073b36600461369b565b61174e565b34801561074c57600080fd5b50601a54610586565b34801561076157600080fd5b506104a261077036600461356b565b6117e4565b61048061184e565b34801561078957600080fd5b506104806107983660046135b9565b6118d1565b3480156107a957600080fd5b506107bd6107b836600461356b565b6118ec565b6040516104ae91906139d4565b3480156107d657600080fd5b506104806107e53660046137d8565b61198e565b3480156107f657600080fd5b5061058660165481565b34801561080c57600080fd5b5061058661081b3660046137d8565b6119bd565b34801561082c57600080fd5b506013546104a290610100900460ff1681565b34801561084b57600080fd5b50610586601c5481565b34801561086157600080fd5b5061048061087036600461378f565b611a50565b34801561088157600080fd5b506013546104a29060ff1681565b34801561089b57600080fd5b506104f96108aa3660046137d8565b611a91565b3480156108bb57600080fd5b5061058660195481565b3480156108d157600080fd5b5060135460ff166104a2565b3480156108e957600080fd5b506105866108f836600461356b565b611b08565b34801561090957600080fd5b50610480611b8f565b34801561091e57600080fd5b5061058660185481565b34801561093457600080fd5b50601654610586565b34801561094957600080fd5b5042610586565b34801561095c57600080fd5b50610586601a5481565b34801561097257600080fd5b50600a546001600160a01b03166104f9565b34801561099057600080fd5b506104cc611bc5565b3480156109a557600080fd5b50601754610586565b3480156109ba57600080fd5b50610586601b5481565b3480156109d057600080fd5b50610586611bd4565b6104806109e73660046137d8565b611be4565b3480156109f857600080fd5b50610480610a07366004613671565b61206f565b348015610a1857600080fd5b50600d54610586565b348015610a2d57600080fd5b50610480610a3c3660046137d8565b61207a565b348015610a4d57600080fd5b5061058660175481565b348015610a6357600080fd5b506107bd6120a9565b348015610a7857600080fd5b50610480610a873660046135f5565b612100565b348015610a9857600080fd5b506104f9610aa73660046137d8565b612132565b348015610ab857600080fd5b5061058660125481565b348015610ace57600080fd5b50610ad761215c565b6040516104ae919061397b565b348015610af057600080fd5b50600e54610586565b348015610b0557600080fd5b50601154610586565b348015610b1a57600080fd5b50610480610b2936600461373a565b6121d9565b348015610b3a57600080fd5b506104cc612216565b348015610b4f57600080fd5b506104cc610b5e3660046137d8565b612223565b348015610b6f57600080fd5b50610480610b7e3660046137d8565b6123a2565b348015610b8f57600080fd5b50610586600f5481565b348015610ba557600080fd5b50610586600d5481565b348015610bbb57600080fd5b50610480610bca36600461378f565b6123d1565b348015610bdb57600080fd5b50610586601d5481565b348015610bf157600080fd5b5061058661240e565b348015610c0657600080fd5b50610c1a610c153660046137d8565b612429565b604080519384526020840192909252908201526060016104ae565b348015610c4157600080fd5b5061058661245c565b348015610c5657600080fd5b50610480610c653660046137d8565b612474565b348015610c7657600080fd5b506104a2610c85366004613586565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cbf57600080fd5b506107bd6124a3565b348015610cd457600080fd5b50610480610ce33660046136c5565b6124f9565b348015610cf457600080fd5b50610480610d0336600461378f565b61253b565b348015610d1457600080fd5b50610480610d2336600461356b565b612578565b6000429050601e600081548110610d4157610d41613c3d565b9060005260206000200154811015610da05760405162461bcd60e51b815260206004820152601e60248201527f5061796d656e74732068617665206e6f7420737461727465642079657421000060448201526064015b60405180910390fd5b601b54610dae57601a54601b555b600080610dba336118ec565b6000601d819055909150805b60205481101561107e5760005b835181101561106b57838181518110610dee57610dee613c3d565b602002602001015160208381548110610e0957610e09613c3d565b906000526020600020906003020160000154148015610e535750861580610e5357508660208381548110610e3f57610e3f613c3d565b906000526020600020906003020160000154145b15611059576001925060005b601e5481101561102a57601e8181548110610e7c57610e7c613c3d565b906000526020600020015460208481548110610e9a57610e9a613c3d565b906000526020600020906003020160020154108015610ed55750601e8181548110610ec757610ec7613c3d565b906000526020600020015487115b15611018578015610fba57606460208481548110610ef557610ef5613c3d565b90600052602060002090600302016001015482601e80549050610f189190613b4e565b601f610f25600186613b4e565b81548110610f3557610f35613c3d565b9060005260206000200154610f4a9190613b1b565b610f549190613b2f565b610f5e9190613b1b565b606460208581548110610f7357610f73613c3d565b906000526020600020906003020160010154600c601b54610f949190613b1b565b610f9e9190613b2f565b610fa89190613b1b565b610fb29190613b03565b601d55611008565b606460208481548110610fcf57610fcf613c3d565b906000526020600020906003020160010154600c601b54610ff09190613b1b565b610ffa9190613b2f565b6110049190613b1b565b601d555b601d546110159087613b03565b95505b8061102281613bcc565b915050610e5f565b50856020838154811061103f5761103f613c3d565b90600052602060002090600302016002018190555061106b565b8061106381613bcc565b915050610dd3565b508061107681613bcc565b915050610dc6565b5082601a60008282546110919190613b4e565b9250508190555082601c60008282546110aa9190613b03565b9091555050806111065760405162461bcd60e51b815260206004820152602160248201527f596f7520646f206e6f742068617665204e54462077697468207061796f7574736044820152602160f81b6064820152608401610d97565b600083116111565760405162461bcd60e51b815260206004820152601f60248201527f4e6f207061796f757473207965742c20636f6d65206261636b206c61746572006044820152606401610d97565b604051339084156108fc029085906000818181858888f19350505050158015611183573d6000803e3d6000fd5b505050505050565b60006001600160e01b0319821663780e9d6360e01b14806111b057506111b082612610565b92915050565b6060600080546111c590613b91565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190613b91565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166112c15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d97565b506000908152600460205260409020546001600160a01b031690565b601480546112ea90613b91565b80601f016020809104026020016040519081016040528092919081815260200182805461131690613b91565b80156113635780601f1061133857610100808354040283529160200191611363565b820191906000526020600020905b81548152906001019060200180831161134657829003601f168201915b505050505081565b600a546001600160a01b031633146113955760405162461bcd60e51b8152600401610d9790613a7d565b601155565b60006113a582611a91565b9050806001600160a01b0316836001600160a01b031614156114135760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d97565b336001600160a01b038216148061142f575061142f8133610c85565b6114a15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d97565b6114ab8383612660565b505050565b601f81815481106114c057600080fd5b600091825260209091200154905081565b600a546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610d9790613a7d565b604080516060810182529283526020808401928352600091840182815281546001810183559190925292517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb60039094029384015590517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bd90910155565b600a546001600160a01b031633146115c85760405162461bcd60e51b8152600401610d9790613a7d565b600d55565b600a546001600160a01b031633146115f75760405162461bcd60e51b8152600401610d9790613a7d565b600061160260085490565b90506000821161161157600080fd5b60115482111561162057600080fd5b600f5461162d8383613b03565b111561163857600080fd5b60015b828111611694576001600160a01b038416600090815260216020526040812080549161166683613bcc565b919050555060006116756126ce565b9050611681858261295e565b508061168c81613bcc565b91505061163b565b50505050565b6116a43382612978565b6116c05760405162461bcd60e51b8152600401610d9790613ab2565b6114ab838383612a6f565b601e81815481106114c057600080fd5b600a546001600160a01b031633146117055760405162461bcd60e51b8152600401610d9790613a7d565b601755565b600a546001600160a01b031633146117345760405162461bcd60e51b8152600401610d9790613a7d565b601380549115156101000261ff0019909216919091179055565b600061175983611b08565b82106117bb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b60155481101561184557826001600160a01b03166015828154811061180f5761180f613c3d565b6000918252602090912001546001600160a01b031614156118335750600192915050565b8061183d81613bcc565b9150506117e8565b50600092915050565b600a546001600160a01b031633146118785760405162461bcd60e51b8152600401610d9790613a7d565b60195460405160009133918381818185875af1925050503d80600081146118bb576040519150601f19603f3d011682016040523d82523d6000602084013e6118c0565b606091505b50509050806118ce57600080fd5b50565b6114ab83838360405180602001604052806000815250612100565b606060006118f983611b08565b905060008167ffffffffffffffff81111561191657611916613c53565b60405190808252806020026020018201604052801561193f578160200160208202803683370190505b50905060005b8281101561198657611957858261174e565b82828151811061196957611969613c3d565b60209081029190910101528061197e81613bcc565b915050611945565b509392505050565b600a546001600160a01b031633146119b85760405162461bcd60e51b8152600401610d9790613a7d565b600e55565b60006119c860085490565b8210611a2b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d97565b60088281548110611a3e57611a3e613c3d565b90600052602060002001549050919050565b600a546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d90600b9060208401906133bf565b5050565b6000818152600260205260408120546001600160a01b0316806111b05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d97565b60006001600160a01b038216611b735760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d97565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611bb95760405162461bcd60e51b8152600401610d9790613a7d565b611bc36000612c1a565b565b6060600180546111c590613b91565b6000611bdf60225490565b905090565b426000611bf060085490565b905060008311611c375760405162461bcd60e51b815260206004820152601260248201527104e65656420616d6f756e74206973203e20360741b6044820152606401610d97565b601154831115611c745760405162461bcd60e51b81526020600482015260086024820152670a8dede40daeac6d60c31b6044820152606401610d97565b600f54611c818483613b03565b1115611ce15760405162461bcd60e51b815260206004820152602960248201527f596f752061726520747279696e6720746f20627579206d6f7265207468616e206044820152681d1a19481b1a5b5a5d60ba1b6064820152608401610d97565b60135460ff1615611d345760405162461bcd60e51b815260206004820152601860248201527f536d61727420436f6e74726163742069732070617573656400000000000000006044820152606401610d97565b6016548211611d855760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e67206973206e6f7420617661696c61626c6500000000000000006044820152606401610d97565b6017548211611ea457611d97336117e4565b611de35760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610d97565b33600090815260216020526040902054601254611e008583613b03565b1115611e4e5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610d97565b83600d54611e5c9190613b2f565b341015611e9e5760405162461bcd60e51b815260206004820152601060248201526f57726f6e67206d696e7420707269636560801b6044820152606401610d97565b50611efe565b601754821115611efe5782600e54611ebc9190613b2f565b341015611efe5760405162461bcd60e51b815260206004820152601060248201526f57726f6e67206d696e7420707269636560801b6044820152606401610d97565b60015b838111611f5157336000908152602160205260408120805491611f2383613bcc565b91905055506000611f326126ce565b9050611f3e338261295e565b5080611f4981613bcc565b915050611f01565b5060003490506000606482601854611f699190613b2f565b611f739190613b1b565b9050611f7f8183613b4e565b60196000828254611f909190613b03565b9250508190555080601a6000828254611fa99190613b03565b90915550600090505b601e5481101561118357601e54611fca826001613b03565b108015611ff35750601e8181548110611fe557611fe5613c3d565b906000526020600020015485115b80156120255750601e612007826001613b03565b8154811061201757612017613c3d565b906000526020600020015485105b1561205d5781601f828154811061203e5761203e613c3d565b9060005260206000200160008282546120579190613b03565b90915550505b8061206781613bcc565b915050611fb2565b611a8d338383612c6c565b600a546001600160a01b031633146120a45760405162461bcd60e51b8152600401610d9790613a7d565b601855565b6060601f80548060200260200160405190810160405280929190818152602001828054801561123e57602002820191906000526020600020905b8154815260200190600101908083116120e3575050505050905090565b61210a3383612978565b6121265760405162461bcd60e51b8152600401610d9790613ab2565b61169484848484612d3b565b6015818154811061214257600080fd5b6000918252602090912001546001600160a01b0316905081565b60606020805480602002602001604051908101604052809291908181526020016000905b828210156121d05783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612180565b50505050905090565b600a546001600160a01b031633146122035760405162461bcd60e51b8152600401610d9790613a7d565b6013805460ff1916911515919091179055565b600c80546112ea90613b91565b6000818152600260205260409020546060906001600160a01b03166122a25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d97565b601354610100900460ff1661234357601480546122be90613b91565b80601f01602080910402602001604051908101604052809291908181526020018280546122ea90613b91565b80156123375780601f1061230c57610100808354040283529160200191612337565b820191906000526020600020905b81548152906001019060200180831161231a57829003601f168201915b50505050509050919050565b600061234d612d6e565b9050600081511161236d576040518060200160405280600081525061239b565b8061237784612d7d565b600c60405160200161238b9392919061387a565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123cc5760405162461bcd60e51b8152600401610d9790613a7d565b601255565b600a546001600160a01b031633146123fb5760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d90600c9060208401906133bf565b6000601b54600014156124225750601a5490565b50601b5490565b6020818154811061243957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b600061246760085490565b600f54611bdf9190613b4e565b600a546001600160a01b0316331461249e5760405162461bcd60e51b8152600401610d9790613a7d565b601655565b6060601e80548060200260200160405190810160405280929190818152602001828054801561123e57602002820191906000526020600020908154815260200190600101908083116120e3575050505050905090565b600a546001600160a01b031633146125235760405162461bcd60e51b8152600401610d9790613a7d565b61252f60156000613443565b6114ab60158383613461565b600a546001600160a01b031633146125655760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d9060149060208401906133bf565b600a546001600160a01b031633146125a25760405162461bcd60e51b8152600401610d9790613a7d565b6001600160a01b0381166126075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d97565b6118ce81612c1a565b60006001600160e01b031982166380ac58cd60e01b148061264157506001600160e01b03198216635b5e139f60e01b145b806111b057506301ffc9a760e01b6001600160e01b03198316146111b0565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061269582611a91565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806126d961245c565b116127215760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610d97565b60105460085442916001911015612846576008546010546127429190613b4e565b9050600081334144458760405160200161276095949392919061383f565b6040516020818303038152906040528051906020012060001c6127839190613be7565b600081815260246020526040812054919250906127a15750806127b2565b506000818152602460205260409020545b602460006127c1600186613b4e565b815260200190815260200160002054600014156127f7576127e3600184613b4e565b600083815260246020526040902055612827565b60246000612806600186613b4e565b81526020808201929092526040908101600090812054858252602490935220555b61282f612e7b565b5060235461283d9082613b03565b94505050505090565b600854600f546128569190613b4e565b9050600081334144458760405160200161287495949392919061383f565b6040516020818303038152906040528051906020012060001c6128979190613be7565b600081815260256020526040812054919250906128b55750806128c6565b506000818152602560205260409020545b602560006128d5600186613b4e565b8152602001908152602001600020546000141561290b576128f7600184613b4e565b60008381526025602052604090205561293b565b6025600061291a600186613b4e565b81526020808201929092526040908101600090812054858252602590935220555b612943612e7b565b506010546023546129549190613b03565b61283d9082613b03565b611a8d828260405180602001604052806000815250612ee9565b6000818152600260205260408120546001600160a01b03166129f15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d97565b60006129fc83611a91565b9050806001600160a01b0316846001600160a01b03161480612a375750836001600160a01b0316612a2c84611248565b6001600160a01b0316145b80612a6757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612a8282611a91565b6001600160a01b031614612aea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d97565b6001600160a01b038216612b4c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d97565b612b57838383612f1c565b612b62600082612660565b6001600160a01b0383166000908152600360205260408120805460019290612b8b908490613b4e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb9908490613b03565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612cce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d46848484612a6f565b612d5284848484612fd4565b6116945760405162461bcd60e51b8152600401610d9790613a2b565b6060600b80546111c590613b91565b606081612da15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dcb5780612db581613bcc565b9150612dc49050600a83613b1b565b9150612da5565b60008167ffffffffffffffff811115612de657612de6613c53565b6040519080825280601f01601f191660200182016040528015612e10576020820181803683370190505b5090505b8415612a6757612e25600183613b4e565b9150612e32600a86613be7565b612e3d906030613b03565b60f81b818381518110612e5257612e52613c3d565b60200101906001600160f81b031916908160001a905350612e74600a86613b1b565b9450612e14565b600080612e8661245c565b11612ece5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610d97565b6000612ed960225490565b9050611bdf602280546001019055565b612ef383836130e1565b612f006000848484612fd4565b6114ab5760405162461bcd60e51b8152600401610d9790613a2b565b6001600160a01b038316612f7757612f7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f9a565b816001600160a01b0316836001600160a01b031614612f9a57612f9a838261322f565b6001600160a01b038216612fb1576114ab816132cc565b826001600160a01b0316826001600160a01b0316146114ab576114ab828261337b565b60006001600160a01b0384163b156130d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061301890339089908890889060040161393e565b602060405180830381600087803b15801561303257600080fd5b505af1925050508015613062575060408051601f3d908101601f1916820190925261305f91810190613772565b60015b6130bc573d808015613090576040519150601f19603f3d011682016040523d82523d6000602084013e613095565b606091505b5080516130b45760405162461bcd60e51b8152600401610d9790613a2b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a67565b506001949350505050565b6001600160a01b0382166131375760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d97565b6000818152600260205260409020546001600160a01b03161561319c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d97565b6131a860008383612f1c565b6001600160a01b03821660009081526003602052604081208054600192906131d1908490613b03565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161323c84611b08565b6132469190613b4e565b600083815260076020526040902054909150808214613299576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132de90600190613b4e565b6000838152600960205260408120546008805493945090928490811061330657613306613c3d565b90600052602060002001549050806008838154811061332757613327613c3d565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061335f5761335f613c27565b6001900381819060005260206000200160009055905550505050565b600061338683611b08565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546133cb90613b91565b90600052602060002090601f0160209004810192826133ed5760008555613433565b82601f1061340657805160ff1916838001178555613433565b82800160010185558215613433579182015b82811115613433578251825591602001919060010190613418565b5061343f9291506134b4565b5090565b50805460008255906000526020600020908101906118ce91906134b4565b828054828255906000526020600020908101928215613433579160200282015b828111156134335781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613481565b5b8082111561343f57600081556001016134b5565b600067ffffffffffffffff808411156134e4576134e4613c53565b604051601f8501601f19908116603f0116810190828211818310171561350c5761350c613c53565b8160405280935085815286868601111561352557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461355657600080fd5b919050565b8035801515811461355657600080fd5b60006020828403121561357d57600080fd5b61239b8261353f565b6000806040838503121561359957600080fd5b6135a28361353f565b91506135b06020840161353f565b90509250929050565b6000806000606084860312156135ce57600080fd5b6135d78461353f565b92506135e56020850161353f565b9150604084013590509250925092565b6000806000806080858703121561360b57600080fd5b6136148561353f565b93506136226020860161353f565b925060408501359150606085013567ffffffffffffffff81111561364557600080fd5b8501601f8101871361365657600080fd5b613665878235602084016134c9565b91505092959194509250565b6000806040838503121561368457600080fd5b61368d8361353f565b91506135b06020840161355b565b600080604083850312156136ae57600080fd5b6136b78361353f565b946020939093013593505050565b600080602083850312156136d857600080fd5b823567ffffffffffffffff808211156136f057600080fd5b818501915085601f83011261370457600080fd5b81358181111561371357600080fd5b8660208260051b850101111561372857600080fd5b60209290920196919550909350505050565b60006020828403121561374c57600080fd5b61239b8261355b565b60006020828403121561376757600080fd5b813561239b81613c69565b60006020828403121561378457600080fd5b815161239b81613c69565b6000602082840312156137a157600080fd5b813567ffffffffffffffff8111156137b857600080fd5b8201601f810184136137c957600080fd5b612a67848235602084016134c9565b6000602082840312156137ea57600080fd5b5035919050565b6000806040838503121561380457600080fd5b50508035926020909101359150565b6000815180845261382b816020860160208601613b65565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606096871b811682529490951b909316601485015260288401919091526048830152606882015260880190565b60008451602061388d8285838a01613b65565b8551918401916138a08184848a01613b65565b8554920191600090600181811c90808316806138bd57607f831692505b8583108114156138db57634e487b7160e01b85526022600452602485fd5b8080156138ef57600181146139005761392d565b60ff1985168852838801955061392d565b60008b81526020902060005b858110156139255781548a82015290840190880161390c565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061397190830184613813565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156139c75781518051855286810151878601528501518585015260609093019290850190600101613998565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a0c578351835292840192918401916001016139f0565b50909695505050505050565b60208152600061239b6020830184613813565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115613b1657613b16613bfb565b500190565b600082613b2a57613b2a613c11565b500490565b6000816000190483118215151615613b4957613b49613bfb565b500290565b600082821015613b6057613b60613bfb565b500390565b60005b83811015613b80578181015183820152602001613b68565b838111156116945750506000910152565b600181811c90821680613ba557607f821691505b60208210811415613bc657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613be057613be0613bfb565b5060010190565b600082613bf657613bf6613c11565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118ce57600080fdfea264697066735822122015236236ff78faa6e930a04af3b7665bfb19f63149ad117390b3cd2d89d9928764736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d644445483137624e66513165724c3967375372745873697955774b3857385561327748395853756d5350347200000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104685760003560e01c8063715018a61161024a578063bd3e19d411610139578063df927c11116100b6578063e985e9c51161007a578063e985e9c514610c6a578063ecbbc18f14610cb3578063edec5f2714610cc8578063f2c4ce1e14610ce8578063f2fde38b14610d0857600080fd5b8063df927c1114610bcf578063e0010caa14610be5578063e03f2fdf14610bfa578063e14ca35314610c35578063e3bc776214610c4a57600080fd5b8063d0eb26b0116100fd578063d0eb26b014610b63578063d5abeb0114610b83578063d6e7b8e414610af9578063da3b618414610b99578063da3ef23f14610baf57600080fd5b8063bd3e19d414610ae4578063be43089d14610af9578063bedb86fb14610b0e578063c668286214610b2e578063c87b56dd14610b4357600080fd5b8063a0712d68116101c7578063b7a23d9c1161018b578063b7a23d9c14610a57578063b88d4fde14610a6c578063ba4e5c4914610a8c578063ba7d2c7614610aac578063bcc1275514610ac257600080fd5b8063a0712d68146109d9578063a22cb465146109ec578063a44e065e14610a0c578063aeb9a45714610a21578063b7877ed414610a4157600080fd5b80638da5cb5b1161020e5780638da5cb5b1461096657806395d89b4114610984578063990c3223146109995780639b5d1b6e146109ae5780639f181b5e146109c457600080fd5b8063715018a6146108fd57806373e404711461091257806376362a8214610928578063796b89b91461093d578063831df0d41461095057600080fd5b806325977ec7116103665780634ea37fec116102e35780635c975abb116102a75780635c975abb146108755780636352211e1461088f578063655159c2146108af5780636805b84b146108c557806370a08231146108dd57600080fd5b80634ea37fec146107ea5780634f6ccce714610800578063518302271461082057806355b088521461083f57806355f804b31461085557600080fd5b80633af32abf1161032a5780633af32abf146107555780633ccfd60b1461077557806342842e0e1461077d578063438b63001461079d57806344a0d68a146107ca57600080fd5b806325977ec7146106cb5780632a3f300c146106eb5780632abee2751461070b5780632f745c59146107205780633793d5a21461074057600080fd5b806313078948116103f457806318cae269116103b857806318cae2691461062857806321ca423614610655578063239c70ae1461067557806323b872dd1461068b57806323f7cb4c146106ab57600080fd5b806313078948146105a757806313faede6146105bd57806315fceaea146105d35780631602f04a146105f357806318160ddd1461061357600080fd5b8063081c8c441161043b578063081c8c4414610511578063088a4ed014610526578063095ea7b31461054657806311824f791461056657806312065fe01461059457600080fd5b8063012427f21461046d57806301ffc9a71461048257806306fdde03146104b7578063081812fc146104d9575b600080fd5b61048061047b3660046137d8565b610d28565b005b34801561048e57600080fd5b506104a261049d366004613755565b61118b565b60405190151581526020015b60405180910390f35b3480156104c357600080fd5b506104cc6111b6565b6040516104ae9190613a18565b3480156104e557600080fd5b506104f96104f43660046137d8565b611248565b6040516001600160a01b0390911681526020016104ae565b34801561051d57600080fd5b506104cc6112dd565b34801561053257600080fd5b506104806105413660046137d8565b61136b565b34801561055257600080fd5b5061048061056136600461369b565b61139a565b34801561057257600080fd5b506105866105813660046137d8565b6114b0565b6040519081526020016104ae565b3480156105a057600080fd5b5047610586565b3480156105b357600080fd5b5061058660105481565b3480156105c957600080fd5b50610586600e5481565b3480156105df57600080fd5b506104806105ee3660046137f1565b6114d1565b3480156105ff57600080fd5b5061048061060e3660046137d8565b61159e565b34801561061f57600080fd5b50600854610586565b34801561063457600080fd5b5061058661064336600461356b565b60216020526000908152604090205481565b34801561066157600080fd5b5061048061067036600461369b565b6115cd565b34801561068157600080fd5b5061058660115481565b34801561069757600080fd5b506104806106a63660046135b9565b61169a565b3480156106b757600080fd5b506105866106c63660046137d8565b6116cb565b3480156106d757600080fd5b506104806106e63660046137d8565b6116db565b3480156106f757600080fd5b5061048061070636600461373a565b61170a565b34801561071757600080fd5b50601954610586565b34801561072c57600080fd5b5061058661073b36600461369b565b61174e565b34801561074c57600080fd5b50601a54610586565b34801561076157600080fd5b506104a261077036600461356b565b6117e4565b61048061184e565b34801561078957600080fd5b506104806107983660046135b9565b6118d1565b3480156107a957600080fd5b506107bd6107b836600461356b565b6118ec565b6040516104ae91906139d4565b3480156107d657600080fd5b506104806107e53660046137d8565b61198e565b3480156107f657600080fd5b5061058660165481565b34801561080c57600080fd5b5061058661081b3660046137d8565b6119bd565b34801561082c57600080fd5b506013546104a290610100900460ff1681565b34801561084b57600080fd5b50610586601c5481565b34801561086157600080fd5b5061048061087036600461378f565b611a50565b34801561088157600080fd5b506013546104a29060ff1681565b34801561089b57600080fd5b506104f96108aa3660046137d8565b611a91565b3480156108bb57600080fd5b5061058660195481565b3480156108d157600080fd5b5060135460ff166104a2565b3480156108e957600080fd5b506105866108f836600461356b565b611b08565b34801561090957600080fd5b50610480611b8f565b34801561091e57600080fd5b5061058660185481565b34801561093457600080fd5b50601654610586565b34801561094957600080fd5b5042610586565b34801561095c57600080fd5b50610586601a5481565b34801561097257600080fd5b50600a546001600160a01b03166104f9565b34801561099057600080fd5b506104cc611bc5565b3480156109a557600080fd5b50601754610586565b3480156109ba57600080fd5b50610586601b5481565b3480156109d057600080fd5b50610586611bd4565b6104806109e73660046137d8565b611be4565b3480156109f857600080fd5b50610480610a07366004613671565b61206f565b348015610a1857600080fd5b50600d54610586565b348015610a2d57600080fd5b50610480610a3c3660046137d8565b61207a565b348015610a4d57600080fd5b5061058660175481565b348015610a6357600080fd5b506107bd6120a9565b348015610a7857600080fd5b50610480610a873660046135f5565b612100565b348015610a9857600080fd5b506104f9610aa73660046137d8565b612132565b348015610ab857600080fd5b5061058660125481565b348015610ace57600080fd5b50610ad761215c565b6040516104ae919061397b565b348015610af057600080fd5b50600e54610586565b348015610b0557600080fd5b50601154610586565b348015610b1a57600080fd5b50610480610b2936600461373a565b6121d9565b348015610b3a57600080fd5b506104cc612216565b348015610b4f57600080fd5b506104cc610b5e3660046137d8565b612223565b348015610b6f57600080fd5b50610480610b7e3660046137d8565b6123a2565b348015610b8f57600080fd5b50610586600f5481565b348015610ba557600080fd5b50610586600d5481565b348015610bbb57600080fd5b50610480610bca36600461378f565b6123d1565b348015610bdb57600080fd5b50610586601d5481565b348015610bf157600080fd5b5061058661240e565b348015610c0657600080fd5b50610c1a610c153660046137d8565b612429565b604080519384526020840192909252908201526060016104ae565b348015610c4157600080fd5b5061058661245c565b348015610c5657600080fd5b50610480610c653660046137d8565b612474565b348015610c7657600080fd5b506104a2610c85366004613586565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cbf57600080fd5b506107bd6124a3565b348015610cd457600080fd5b50610480610ce33660046136c5565b6124f9565b348015610cf457600080fd5b50610480610d0336600461378f565b61253b565b348015610d1457600080fd5b50610480610d2336600461356b565b612578565b6000429050601e600081548110610d4157610d41613c3d565b9060005260206000200154811015610da05760405162461bcd60e51b815260206004820152601e60248201527f5061796d656e74732068617665206e6f7420737461727465642079657421000060448201526064015b60405180910390fd5b601b54610dae57601a54601b555b600080610dba336118ec565b6000601d819055909150805b60205481101561107e5760005b835181101561106b57838181518110610dee57610dee613c3d565b602002602001015160208381548110610e0957610e09613c3d565b906000526020600020906003020160000154148015610e535750861580610e5357508660208381548110610e3f57610e3f613c3d565b906000526020600020906003020160000154145b15611059576001925060005b601e5481101561102a57601e8181548110610e7c57610e7c613c3d565b906000526020600020015460208481548110610e9a57610e9a613c3d565b906000526020600020906003020160020154108015610ed55750601e8181548110610ec757610ec7613c3d565b906000526020600020015487115b15611018578015610fba57606460208481548110610ef557610ef5613c3d565b90600052602060002090600302016001015482601e80549050610f189190613b4e565b601f610f25600186613b4e565b81548110610f3557610f35613c3d565b9060005260206000200154610f4a9190613b1b565b610f549190613b2f565b610f5e9190613b1b565b606460208581548110610f7357610f73613c3d565b906000526020600020906003020160010154600c601b54610f949190613b1b565b610f9e9190613b2f565b610fa89190613b1b565b610fb29190613b03565b601d55611008565b606460208481548110610fcf57610fcf613c3d565b906000526020600020906003020160010154600c601b54610ff09190613b1b565b610ffa9190613b2f565b6110049190613b1b565b601d555b601d546110159087613b03565b95505b8061102281613bcc565b915050610e5f565b50856020838154811061103f5761103f613c3d565b90600052602060002090600302016002018190555061106b565b8061106381613bcc565b915050610dd3565b508061107681613bcc565b915050610dc6565b5082601a60008282546110919190613b4e565b9250508190555082601c60008282546110aa9190613b03565b9091555050806111065760405162461bcd60e51b815260206004820152602160248201527f596f7520646f206e6f742068617665204e54462077697468207061796f7574736044820152602160f81b6064820152608401610d97565b600083116111565760405162461bcd60e51b815260206004820152601f60248201527f4e6f207061796f757473207965742c20636f6d65206261636b206c61746572006044820152606401610d97565b604051339084156108fc029085906000818181858888f19350505050158015611183573d6000803e3d6000fd5b505050505050565b60006001600160e01b0319821663780e9d6360e01b14806111b057506111b082612610565b92915050565b6060600080546111c590613b91565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190613b91565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166112c15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d97565b506000908152600460205260409020546001600160a01b031690565b601480546112ea90613b91565b80601f016020809104026020016040519081016040528092919081815260200182805461131690613b91565b80156113635780601f1061133857610100808354040283529160200191611363565b820191906000526020600020905b81548152906001019060200180831161134657829003601f168201915b505050505081565b600a546001600160a01b031633146113955760405162461bcd60e51b8152600401610d9790613a7d565b601155565b60006113a582611a91565b9050806001600160a01b0316836001600160a01b031614156114135760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d97565b336001600160a01b038216148061142f575061142f8133610c85565b6114a15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d97565b6114ab8383612660565b505050565b601f81815481106114c057600080fd5b600091825260209091200154905081565b600a546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610d9790613a7d565b604080516060810182529283526020808401928352600091840182815281546001810183559190925292517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb60039094029384015590517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bd90910155565b600a546001600160a01b031633146115c85760405162461bcd60e51b8152600401610d9790613a7d565b600d55565b600a546001600160a01b031633146115f75760405162461bcd60e51b8152600401610d9790613a7d565b600061160260085490565b90506000821161161157600080fd5b60115482111561162057600080fd5b600f5461162d8383613b03565b111561163857600080fd5b60015b828111611694576001600160a01b038416600090815260216020526040812080549161166683613bcc565b919050555060006116756126ce565b9050611681858261295e565b508061168c81613bcc565b91505061163b565b50505050565b6116a43382612978565b6116c05760405162461bcd60e51b8152600401610d9790613ab2565b6114ab838383612a6f565b601e81815481106114c057600080fd5b600a546001600160a01b031633146117055760405162461bcd60e51b8152600401610d9790613a7d565b601755565b600a546001600160a01b031633146117345760405162461bcd60e51b8152600401610d9790613a7d565b601380549115156101000261ff0019909216919091179055565b600061175983611b08565b82106117bb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b60155481101561184557826001600160a01b03166015828154811061180f5761180f613c3d565b6000918252602090912001546001600160a01b031614156118335750600192915050565b8061183d81613bcc565b9150506117e8565b50600092915050565b600a546001600160a01b031633146118785760405162461bcd60e51b8152600401610d9790613a7d565b60195460405160009133918381818185875af1925050503d80600081146118bb576040519150601f19603f3d011682016040523d82523d6000602084013e6118c0565b606091505b50509050806118ce57600080fd5b50565b6114ab83838360405180602001604052806000815250612100565b606060006118f983611b08565b905060008167ffffffffffffffff81111561191657611916613c53565b60405190808252806020026020018201604052801561193f578160200160208202803683370190505b50905060005b8281101561198657611957858261174e565b82828151811061196957611969613c3d565b60209081029190910101528061197e81613bcc565b915050611945565b509392505050565b600a546001600160a01b031633146119b85760405162461bcd60e51b8152600401610d9790613a7d565b600e55565b60006119c860085490565b8210611a2b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d97565b60088281548110611a3e57611a3e613c3d565b90600052602060002001549050919050565b600a546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d90600b9060208401906133bf565b5050565b6000818152600260205260408120546001600160a01b0316806111b05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d97565b60006001600160a01b038216611b735760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d97565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611bb95760405162461bcd60e51b8152600401610d9790613a7d565b611bc36000612c1a565b565b6060600180546111c590613b91565b6000611bdf60225490565b905090565b426000611bf060085490565b905060008311611c375760405162461bcd60e51b815260206004820152601260248201527104e65656420616d6f756e74206973203e20360741b6044820152606401610d97565b601154831115611c745760405162461bcd60e51b81526020600482015260086024820152670a8dede40daeac6d60c31b6044820152606401610d97565b600f54611c818483613b03565b1115611ce15760405162461bcd60e51b815260206004820152602960248201527f596f752061726520747279696e6720746f20627579206d6f7265207468616e206044820152681d1a19481b1a5b5a5d60ba1b6064820152608401610d97565b60135460ff1615611d345760405162461bcd60e51b815260206004820152601860248201527f536d61727420436f6e74726163742069732070617573656400000000000000006044820152606401610d97565b6016548211611d855760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e67206973206e6f7420617661696c61626c6500000000000000006044820152606401610d97565b6017548211611ea457611d97336117e4565b611de35760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610d97565b33600090815260216020526040902054601254611e008583613b03565b1115611e4e5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610d97565b83600d54611e5c9190613b2f565b341015611e9e5760405162461bcd60e51b815260206004820152601060248201526f57726f6e67206d696e7420707269636560801b6044820152606401610d97565b50611efe565b601754821115611efe5782600e54611ebc9190613b2f565b341015611efe5760405162461bcd60e51b815260206004820152601060248201526f57726f6e67206d696e7420707269636560801b6044820152606401610d97565b60015b838111611f5157336000908152602160205260408120805491611f2383613bcc565b91905055506000611f326126ce565b9050611f3e338261295e565b5080611f4981613bcc565b915050611f01565b5060003490506000606482601854611f699190613b2f565b611f739190613b1b565b9050611f7f8183613b4e565b60196000828254611f909190613b03565b9250508190555080601a6000828254611fa99190613b03565b90915550600090505b601e5481101561118357601e54611fca826001613b03565b108015611ff35750601e8181548110611fe557611fe5613c3d565b906000526020600020015485115b80156120255750601e612007826001613b03565b8154811061201757612017613c3d565b906000526020600020015485105b1561205d5781601f828154811061203e5761203e613c3d565b9060005260206000200160008282546120579190613b03565b90915550505b8061206781613bcc565b915050611fb2565b611a8d338383612c6c565b600a546001600160a01b031633146120a45760405162461bcd60e51b8152600401610d9790613a7d565b601855565b6060601f80548060200260200160405190810160405280929190818152602001828054801561123e57602002820191906000526020600020905b8154815260200190600101908083116120e3575050505050905090565b61210a3383612978565b6121265760405162461bcd60e51b8152600401610d9790613ab2565b61169484848484612d3b565b6015818154811061214257600080fd5b6000918252602090912001546001600160a01b0316905081565b60606020805480602002602001604051908101604052809291908181526020016000905b828210156121d05783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612180565b50505050905090565b600a546001600160a01b031633146122035760405162461bcd60e51b8152600401610d9790613a7d565b6013805460ff1916911515919091179055565b600c80546112ea90613b91565b6000818152600260205260409020546060906001600160a01b03166122a25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d97565b601354610100900460ff1661234357601480546122be90613b91565b80601f01602080910402602001604051908101604052809291908181526020018280546122ea90613b91565b80156123375780601f1061230c57610100808354040283529160200191612337565b820191906000526020600020905b81548152906001019060200180831161231a57829003601f168201915b50505050509050919050565b600061234d612d6e565b9050600081511161236d576040518060200160405280600081525061239b565b8061237784612d7d565b600c60405160200161238b9392919061387a565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123cc5760405162461bcd60e51b8152600401610d9790613a7d565b601255565b600a546001600160a01b031633146123fb5760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d90600c9060208401906133bf565b6000601b54600014156124225750601a5490565b50601b5490565b6020818154811061243957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b600061246760085490565b600f54611bdf9190613b4e565b600a546001600160a01b0316331461249e5760405162461bcd60e51b8152600401610d9790613a7d565b601655565b6060601e80548060200260200160405190810160405280929190818152602001828054801561123e57602002820191906000526020600020908154815260200190600101908083116120e3575050505050905090565b600a546001600160a01b031633146125235760405162461bcd60e51b8152600401610d9790613a7d565b61252f60156000613443565b6114ab60158383613461565b600a546001600160a01b031633146125655760405162461bcd60e51b8152600401610d9790613a7d565b8051611a8d9060149060208401906133bf565b600a546001600160a01b031633146125a25760405162461bcd60e51b8152600401610d9790613a7d565b6001600160a01b0381166126075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d97565b6118ce81612c1a565b60006001600160e01b031982166380ac58cd60e01b148061264157506001600160e01b03198216635b5e139f60e01b145b806111b057506301ffc9a760e01b6001600160e01b03198316146111b0565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061269582611a91565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806126d961245c565b116127215760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610d97565b60105460085442916001911015612846576008546010546127429190613b4e565b9050600081334144458760405160200161276095949392919061383f565b6040516020818303038152906040528051906020012060001c6127839190613be7565b600081815260246020526040812054919250906127a15750806127b2565b506000818152602460205260409020545b602460006127c1600186613b4e565b815260200190815260200160002054600014156127f7576127e3600184613b4e565b600083815260246020526040902055612827565b60246000612806600186613b4e565b81526020808201929092526040908101600090812054858252602490935220555b61282f612e7b565b5060235461283d9082613b03565b94505050505090565b600854600f546128569190613b4e565b9050600081334144458760405160200161287495949392919061383f565b6040516020818303038152906040528051906020012060001c6128979190613be7565b600081815260256020526040812054919250906128b55750806128c6565b506000818152602560205260409020545b602560006128d5600186613b4e565b8152602001908152602001600020546000141561290b576128f7600184613b4e565b60008381526025602052604090205561293b565b6025600061291a600186613b4e565b81526020808201929092526040908101600090812054858252602590935220555b612943612e7b565b506010546023546129549190613b03565b61283d9082613b03565b611a8d828260405180602001604052806000815250612ee9565b6000818152600260205260408120546001600160a01b03166129f15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d97565b60006129fc83611a91565b9050806001600160a01b0316846001600160a01b03161480612a375750836001600160a01b0316612a2c84611248565b6001600160a01b0316145b80612a6757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612a8282611a91565b6001600160a01b031614612aea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d97565b6001600160a01b038216612b4c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d97565b612b57838383612f1c565b612b62600082612660565b6001600160a01b0383166000908152600360205260408120805460019290612b8b908490613b4e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb9908490613b03565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612cce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d46848484612a6f565b612d5284848484612fd4565b6116945760405162461bcd60e51b8152600401610d9790613a2b565b6060600b80546111c590613b91565b606081612da15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dcb5780612db581613bcc565b9150612dc49050600a83613b1b565b9150612da5565b60008167ffffffffffffffff811115612de657612de6613c53565b6040519080825280601f01601f191660200182016040528015612e10576020820181803683370190505b5090505b8415612a6757612e25600183613b4e565b9150612e32600a86613be7565b612e3d906030613b03565b60f81b818381518110612e5257612e52613c3d565b60200101906001600160f81b031916908160001a905350612e74600a86613b1b565b9450612e14565b600080612e8661245c565b11612ece5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610d97565b6000612ed960225490565b9050611bdf602280546001019055565b612ef383836130e1565b612f006000848484612fd4565b6114ab5760405162461bcd60e51b8152600401610d9790613a2b565b6001600160a01b038316612f7757612f7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f9a565b816001600160a01b0316836001600160a01b031614612f9a57612f9a838261322f565b6001600160a01b038216612fb1576114ab816132cc565b826001600160a01b0316826001600160a01b0316146114ab576114ab828261337b565b60006001600160a01b0384163b156130d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061301890339089908890889060040161393e565b602060405180830381600087803b15801561303257600080fd5b505af1925050508015613062575060408051601f3d908101601f1916820190925261305f91810190613772565b60015b6130bc573d808015613090576040519150601f19603f3d011682016040523d82523d6000602084013e613095565b606091505b5080516130b45760405162461bcd60e51b8152600401610d9790613a2b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a67565b506001949350505050565b6001600160a01b0382166131375760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d97565b6000818152600260205260409020546001600160a01b03161561319c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d97565b6131a860008383612f1c565b6001600160a01b03821660009081526003602052604081208054600192906131d1908490613b03565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161323c84611b08565b6132469190613b4e565b600083815260076020526040902054909150808214613299576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132de90600190613b4e565b6000838152600960205260408120546008805493945090928490811061330657613306613c3d565b90600052602060002001549050806008838154811061332757613327613c3d565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061335f5761335f613c27565b6001900381819060005260206000200160009055905550505050565b600061338683611b08565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546133cb90613b91565b90600052602060002090601f0160209004810192826133ed5760008555613433565b82601f1061340657805160ff1916838001178555613433565b82800160010185558215613433579182015b82811115613433578251825591602001919060010190613418565b5061343f9291506134b4565b5090565b50805460008255906000526020600020908101906118ce91906134b4565b828054828255906000526020600020908101928215613433579160200282015b828111156134335781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613481565b5b8082111561343f57600081556001016134b5565b600067ffffffffffffffff808411156134e4576134e4613c53565b604051601f8501601f19908116603f0116810190828211818310171561350c5761350c613c53565b8160405280935085815286868601111561352557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461355657600080fd5b919050565b8035801515811461355657600080fd5b60006020828403121561357d57600080fd5b61239b8261353f565b6000806040838503121561359957600080fd5b6135a28361353f565b91506135b06020840161353f565b90509250929050565b6000806000606084860312156135ce57600080fd5b6135d78461353f565b92506135e56020850161353f565b9150604084013590509250925092565b6000806000806080858703121561360b57600080fd5b6136148561353f565b93506136226020860161353f565b925060408501359150606085013567ffffffffffffffff81111561364557600080fd5b8501601f8101871361365657600080fd5b613665878235602084016134c9565b91505092959194509250565b6000806040838503121561368457600080fd5b61368d8361353f565b91506135b06020840161355b565b600080604083850312156136ae57600080fd5b6136b78361353f565b946020939093013593505050565b600080602083850312156136d857600080fd5b823567ffffffffffffffff808211156136f057600080fd5b818501915085601f83011261370457600080fd5b81358181111561371357600080fd5b8660208260051b850101111561372857600080fd5b60209290920196919550909350505050565b60006020828403121561374c57600080fd5b61239b8261355b565b60006020828403121561376757600080fd5b813561239b81613c69565b60006020828403121561378457600080fd5b815161239b81613c69565b6000602082840312156137a157600080fd5b813567ffffffffffffffff8111156137b857600080fd5b8201601f810184136137c957600080fd5b612a67848235602084016134c9565b6000602082840312156137ea57600080fd5b5035919050565b6000806040838503121561380457600080fd5b50508035926020909101359150565b6000815180845261382b816020860160208601613b65565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606096871b811682529490951b909316601485015260288401919091526048830152606882015260880190565b60008451602061388d8285838a01613b65565b8551918401916138a08184848a01613b65565b8554920191600090600181811c90808316806138bd57607f831692505b8583108114156138db57634e487b7160e01b85526022600452602485fd5b8080156138ef57600181146139005761392d565b60ff1985168852838801955061392d565b60008b81526020902060005b858110156139255781548a82015290840190880161390c565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061397190830184613813565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156139c75781518051855286810151878601528501518585015260609093019290850190600101613998565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a0c578351835292840192918401916001016139f0565b50909695505050505050565b60208152600061239b6020830184613813565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115613b1657613b16613bfb565b500190565b600082613b2a57613b2a613c11565b500490565b6000816000190483118215151615613b4957613b49613bfb565b500290565b600082821015613b6057613b60613bfb565b500390565b60005b83811015613b80578181015183820152602001613b68565b838111156116945750506000910152565b600181811c90821680613ba557607f821691505b60208210811415613bc657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613be057613be0613bfb565b5060010190565b600082613bf657613bf6613c11565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118ce57600080fdfea264697066735822122015236236ff78faa6e930a04af3b7665bfb19f63149ad117390b3cd2d89d9928764736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d644445483137624e66513165724c3967375372745873697955774b3857385561327748395853756d5350347200000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initNotRevealedUri (string): https://gateway.pinata.cloud/ipfs/QmdDEH17bNfQ1erL9g7SrtXsiyUwK8W8Ua2wH9XSumSP4r

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d644445483137624e66513165724c3967375372745873697955774b38
Arg [4] : 57385561327748395853756d5350347200000000000000000000000000000000


Deployed Bytecode Sourcemap

45962:15084:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52204:2105;;;;;;:::i;:::-;;:::i;:::-;;39731:224;;;;;;;;;;-1:-1:-1;39731:224:0;;;;;:::i;:::-;;:::i;:::-;;;10095:14:1;;10088:22;10070:41;;10058:2;10043:18;39731:224:0;;;;;;;;27225:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28784:221::-;;;;;;;;;;-1:-1:-1;28784:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7892:32:1;;;7874:51;;7862:2;7847:18;28784:221:0;7728:203:1;46549:28:0;;;;;;;;;;;;;:::i;57386:122::-;;;;;;;;;;-1:-1:-1;57386:122:0;;;;;:::i;:::-;;:::i;28307:411::-;;;;;;;;;;-1:-1:-1;28307:411:0;;;;;:::i;:::-;;:::i;47449:70::-;;;;;;;;;;-1:-1:-1;47449:70:0;;;;;:::i;:::-;;:::i;:::-;;;22026:25:1;;;22014:2;21999:18;47449:70:0;21880:177:1;58837:99:0;;;;;;;;;;-1:-1:-1;58909:21:0;58837:99;;46284:37;;;;;;;;;;;;;;;;46176:32;;;;;;;;;;;;;;;;49023:201;;;;;;;;;;-1:-1:-1;49023:201:0;;;;;:::i;:::-;;:::i;57608:130::-;;;;;;;;;;-1:-1:-1;57608:130:0;;;;;:::i;:::-;;:::i;40371:113::-;;;;;;;;;;-1:-1:-1;40459:10:0;:17;40371:113;;47701:55;;;;;;;;;;-1:-1:-1;47701:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;50944:421;;;;;;;;;;-1:-1:-1;50944:421:0;;;;;:::i;:::-;;:::i;46349:33::-;;;;;;;;;;;;;;;;29534:339;;;;;;;;;;-1:-1:-1;29534:339:0;;;;;:::i;:::-;;:::i;47036:406::-;;;;;;;;;;-1:-1:-1;47036:406:0;;;;;:::i;:::-;;:::i;51371:149::-;;;;;;;;;;-1:-1:-1;51371:149:0;;;;;:::i;:::-;;:::i;51925:89::-;;;;;;;;;;-1:-1:-1;51925:89:0;;;;;:::i;:::-;;:::i;58641:91::-;;;;;;;;;;-1:-1:-1;58716:10:0;;58641:91;;40039:256;;;;;;;;;;-1:-1:-1;40039:256:0;;;;;:::i;:::-;;:::i;58738:93::-;;;;;;;;;;-1:-1:-1;58814:11:0;;58738:93;;56248:243;;;;;;;;;;-1:-1:-1;56248:243:0;;;;;:::i;:::-;;:::i;59337:147::-;;;:::i;29944:185::-;;;;;;;;;;-1:-1:-1;29944:185:0;;;;;:::i;:::-;;:::i;56529:348::-;;;;;;;;;;-1:-1:-1;56529:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57514:86::-;;;;;;;;;;-1:-1:-1;57514:86:0;;;;;:::i;:::-;;:::i;46631:46::-;;;;;;;;;;;;;;;;40561:233;;;;;;;;;;-1:-1:-1;40561:233:0;;;;;:::i;:::-;;:::i;46514:28::-;;;;;;;;;;-1:-1:-1;46514:28:0;;;;;;;;;;;46942:32;;;;;;;;;;;;;;;;51685:102;;;;;;;;;;-1:-1:-1;51685:102:0;;;;;:::i;:::-;;:::i;46483:26::-;;;;;;;;;;-1:-1:-1;46483:26:0;;;;;;;;26919:239;;;;;;;;;;-1:-1:-1;26919:239:0;;;;;:::i;:::-;;:::i;46840:25::-;;;;;;;;;;;;;;;;58267:77;;;;;;;;;;-1:-1:-1;58332:6:0;;;;58267:77;;26649:208;;;;;;;;;;-1:-1:-1;26649:208:0;;;;;:::i;:::-;;:::i;6195:103::-;;;;;;;;;;;;;:::i;46791:41::-;;;;;;;;;;;;;;;;59063:112;;;;;;;;;;-1:-1:-1;59148:21:0;;59063:112;;59745:139;;;;;;;;;;-1:-1:-1;59837:15:0;59745:139;;46871:26;;;;;;;;;;;;;;;;5544:87;;;;;;;;;;-1:-1:-1;5617:6:0;;-1:-1:-1;;;;;5617:6:0;5544:87;;27394:104;;;;;;;;;;;;;:::i;58945:112::-;;;;;;;;;;-1:-1:-1;59030:21:0;;58945:112;;46905:31;;;;;;;;;;;;;;;;60283:93;;;;;;;;;;;;;:::i;49316:1622::-;;;;;;:::i;:::-;;:::i;29077:155::-;;;;;;;;;;-1:-1:-1;29077:155:0;;;;;:::i;:::-;;:::i;58433:99::-;;;;;;;;;;-1:-1:-1;58511:15:0;;58433:99;;57994:161;;;;;;;;;;-1:-1:-1;57994:161:0;;;;;:::i;:::-;;:::i;46707:46::-;;;;;;;;;;;;;;;;60071:123;;;;;;;;;;;;;:::i;30200:328::-;;;;;;;;;;-1:-1:-1;30200:328:0;;;;;:::i;:::-;;:::i;46586:37::-;;;;;;;;;;-1:-1:-1;46586:37:0;;;;;:::i;:::-;;:::i;46406:::-;;;;;;;;;;;;;;;;59628:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58350:77::-;;;;;;;;;;-1:-1:-1;58417:4:0;;58350:77;;58161:100;;;;;;;;;;-1:-1:-1;58242:13:0;;58161:100;;49230:80;;;;;;;;;;-1:-1:-1;49230:80:0;;;;;:::i;:::-;;:::i;46066:37::-;;;;;;;;;;;;;:::i;56883:497::-;;;;;;;;;;-1:-1:-1;56883:497:0;;;;;:::i;:::-;;:::i;57746:110::-;;;;;;;;;;-1:-1:-1;57746:110:0;;;;;:::i;:::-;;:::i;46235:31::-;;;;;;;;;;;;;;;;46112:43;;;;;;;;;;;;;;;;57862:126;;;;;;;;;;-1:-1:-1;57862:126:0;;;;;:::i;:::-;;:::i;46983:27::-;;;;;;;;;;;;;;;;59892:171;;;;;;;;;;;;;:::i;47526:37::-;;;;;;;;;;-1:-1:-1;47526:37:0;;;;;:::i;:::-;;:::i;:::-;;;;22264:25:1;;;22320:2;22305:18;;22298:34;;;;22348:18;;;22341:34;22252:2;22237:18;47526:37:0;22062:319:1;60476:106:0;;;;;;;;;;;;;:::i;51528:149::-;;;;;;;;;;-1:-1:-1;51528:149:0;;;;;:::i;:::-;;:::i;29303:164::-;;;;;;;;;;-1:-1:-1;29303:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29424:25:0;;;29400:4;29424:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29303:164;59514:106;;;;;;;;;;;;;:::i;59183:148::-;;;;;;;;;;-1:-1:-1;59183:148:0;;;;;:::i;:::-;;:::i;51793:124::-;;;;;;;;;;-1:-1:-1;51793:124:0;;;;;:::i;:::-;;:::i;6453:201::-;;;;;;;;;;-1:-1:-1;6453:201:0;;;;;:::i;:::-;;:::i;52204:2105::-;52285:20;52308:15;52285:38;;52360:16;52377:1;52360:19;;;;;;;;:::i;:::-;;;;;;;;;52344:12;:35;;52336:78;;;;-1:-1:-1;;;52336:78:0;;11229:2:1;52336:78:0;;;11211:21:1;11268:2;11248:18;;;11241:30;11307:32;11287:18;;;11280:60;11357:18;;52336:78:0;;;;;;;;;52438:16;;52435:92;;52504:11;;52485:16;:30;52435:92;52547:10;52582:27;52612:25;52626:10;52612:13;:25::i;:::-;52668:1;52650:15;:19;;;52582:55;;-1:-1:-1;52668:1:0;52716:1317;52733:12;:19;52729:23;;52716:1317;;;52789:7;52784:1238;52803:10;:17;52798:2;:22;52784:1238;;;52885:10;52896:2;52885:14;;;;;;;;:::i;:::-;;;;;;;52863:12;52876:1;52863:15;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;:36;:89;;;;-1:-1:-1;52904:13:0;;;:47;;;52943:8;52921:12;52934:1;52921:15;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;:30;52904:47;52860:1147;;;53009:1;52994:16;;53038:8;53033:863;53054:16;:23;53048:29;;53033:863;;;53165:16;53182:3;53165:21;;;;;;;;:::i;:::-;;;;;;;;;53137:12;53150:1;53137:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;:49;:89;;;;;53205:16;53222:3;53205:21;;;;;;;;:::i;:::-;;;;;;;;;53190:12;:36;53137:89;53134:739;;;53287:7;;53284:477;;53525:3;53500:12;53513:1;53500:15;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;53492:3;53468:16;:23;;;;:27;;;;:::i;:::-;53434:25;53460:5;53464:1;53460:3;:5;:::i;:::-;53434:32;;;;;;;;:::i;:::-;;;;;;;;;:62;;;;:::i;:::-;53433:89;;;;:::i;:::-;:95;;;;:::i;:::-;53427:3;53402:12;53415:1;53402:15;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;53396:2;53379:16;;:19;;;;:::i;:::-;53378:46;;;;:::i;:::-;:52;;;;:::i;:::-;:150;;;;:::i;:::-;53360:15;:168;53284:477;;;53726:3;53701:12;53714:1;53701:15;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;53695:2;53678:16;;:19;;;;:::i;:::-;53677:46;;;;:::i;:::-;:52;;;;:::i;:::-;53659:15;:70;53284:477;53830:15;;53821:24;;;;:::i;:::-;;;53134:739;53079:5;;;;:::i;:::-;;;;53033:863;;;;53946:12;53918;53931:1;53918:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:40;;;;53982:5;;52860:1147;52822:4;;;;:::i;:::-;;;;52784:1238;;;-1:-1:-1;52754:3:0;;;;:::i;:::-;;;;52716:1317;;;;54058:5;54043:11;;:20;;;;;;;:::i;:::-;;;;;;;;54095:5;54074:17;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;54129:16:0;54121:62;;;;-1:-1:-1;;;54121:62:0;;18979:2:1;54121:62:0;;;18961:21:1;19018:2;18998:18;;;18991:30;19057:34;19037:18;;;19030:62;-1:-1:-1;;;19108:18:1;;;19101:31;19149:19;;54121:62:0;18777:397:1;54121:62:0;54210:1;54202:5;:9;54194:53;;;;-1:-1:-1;;;54194:53:0;;15412:2:1;54194:53:0;;;15394:21:1;15451:2;15431:18;;;15424:30;15490:33;15470:18;;;15463:61;15541:18;;54194:53:0;15210:355:1;54194:53:0;54268:35;;54276:10;;54268:35;;;;;54297:5;;54268:35;;;;54297:5;54276:10;54268:35;;;;;;;;;;;;;;;;;;;;;52270:2039;;;;52204:2105;:::o;39731:224::-;39833:4;-1:-1:-1;;;;;;39857:50:0;;-1:-1:-1;;;39857:50:0;;:90;;;39911:36;39935:11;39911:23;:36::i;:::-;39850:97;39731:224;-1:-1:-1;;39731:224:0:o;27225:100::-;27279:13;27312:5;27305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27225:100;:::o;28784:221::-;28860:7;32127:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32127:16:0;28880:73;;;;-1:-1:-1;;;28880:73:0;;17379:2:1;28880:73:0;;;17361:21:1;17418:2;17398:18;;;17391:30;17457:34;17437:18;;;17430:62;-1:-1:-1;;;17508:18:1;;;17501:42;17560:19;;28880:73:0;17177:408:1;28880:73:0;-1:-1:-1;28973:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28973:24:0;;28784:221::o;46549:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57386:122::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;57469:13:::1;:33:::0;57386:122::o;28307:411::-;28388:13;28404:23;28419:7;28404:14;:23::i;:::-;28388:39;;28452:5;-1:-1:-1;;;;;28446:11:0;:2;-1:-1:-1;;;;;28446:11:0;;;28438:57;;;;-1:-1:-1;;;28438:57:0;;19381:2:1;28438:57:0;;;19363:21:1;19420:2;19400:18;;;19393:30;19459:34;19439:18;;;19432:62;-1:-1:-1;;;19510:18:1;;;19503:31;19551:19;;28438:57:0;19179:397:1;28438:57:0;4348:10;-1:-1:-1;;;;;28530:21:0;;;;:62;;-1:-1:-1;28555:37:0;28572:5;4348:10;29303:164;:::i;28555:37::-;28508:168;;;;-1:-1:-1;;;28508:168:0;;15772:2:1;28508:168:0;;;15754:21:1;15811:2;15791:18;;;15784:30;15850:34;15830:18;;;15823:62;15921:26;15901:18;;;15894:54;15965:19;;28508:168:0;15570:420:1;28508:168:0;28689:21;28698:2;28702:7;28689:8;:21::i;:::-;28377:341;28307:411;;:::o;47449:70::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47449:70:0;:::o;49023:201::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;49145:32:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;49145:32:0;;;;;;49184:34;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;49023:201::o;57608:130::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;57695:15:::1;:37:::0;57608:130::o;50944:421::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51036:14:::1;51053:13;40459:10:::0;:17;;40371:113;51053:13:::1;51036:30;;51095:1;51081:11;:15;51073:24;;;::::0;::::1;;51127:13;;51112:11;:28;;51104:37;;;::::0;::::1;;51180:9;::::0;51156:20:::1;51165:11:::0;51156:6;:20:::1;:::i;:::-;:33;;51148:42;;;::::0;::::1;;51220:1;51203:157;51228:11;51223:1;:16;51203:157;;-1:-1:-1::0;;;;;51255:30:0;::::1;;::::0;;;:20:::1;:30;::::0;;;;:32;;;::::1;::::0;::::1;:::i;:::-;;;;;;51296:10;51309:11;:9;:11::i;:::-;51296:24;;51329:23;51339:8;51349:2;51329:9;:23::i;:::-;-1:-1:-1::0;51241:3:0;::::1;::::0;::::1;:::i;:::-;;;;51203:157;;;;51029:336;50944:421:::0;;:::o;29534:339::-;29729:41;4348:10;29762:7;29729:18;:41::i;:::-;29721:103;;;;-1:-1:-1;;;29721:103:0;;;;;;;:::i;:::-;29837:28;29847:4;29853:2;29857:7;29837:9;:28::i;47036:406::-;;;;;;;;;;;;51371:149;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51465:21:::1;:49:::0;51371:149::o;51925:89::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51990:8:::1;:18:::0;;;::::1;;;;-1:-1:-1::0;;51990:18:0;;::::1;::::0;;;::::1;::::0;;51925:89::o;40039:256::-;40136:7;40172:23;40189:5;40172:16;:23::i;:::-;40164:5;:31;40156:87;;;;-1:-1:-1;;;40156:87:0;;11588:2:1;40156:87:0;;;11570:21:1;11627:2;11607:18;;;11600:30;11666:34;11646:18;;;11639:62;-1:-1:-1;;;11717:18:1;;;11710:41;11768:19;;40156:87:0;11386:407:1;40156:87:0;-1:-1:-1;;;;;;40261:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40039:256::o;56248:243::-;56307:4;;56324:143;56345:20;:27;56341:31;;56324:143;;;56419:5;-1:-1:-1;;;;;56392:32:0;:20;56413:1;56392:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;56392:23:0;:32;56388:72;;;-1:-1:-1;56446:4:0;;56248:243;-1:-1:-1;;56248:243:0:o;56388:72::-;56374:3;;;;:::i;:::-;;;;56324:143;;;-1:-1:-1;56480:5:0;;56248:243;-1:-1:-1;;56248:243:0:o;59337:147::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;59440:10:::1;::::0;59408:47:::1;::::0;59390:12:::1;::::0;59416:10:::1;::::0;59390:12;59408:47;59390:12;59408:47;59440:10;59416;59408:47:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59389:66;;;59470:7;59462:16;;;::::0;::::1;;59382:102;59337:147::o:0;29944:185::-;30082:39;30099:4;30105:2;30109:7;30082:39;;;;;;;;;;;;:16;:39::i;56529:348::-;56604:16;56632:23;56658:17;56668:6;56658:9;:17::i;:::-;56632:43;;56682:25;56724:15;56710:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56710:30:0;;56682:58;;56752:9;56747:103;56767:15;56763:1;:19;56747:103;;;56812:30;56832:6;56840:1;56812:19;:30::i;:::-;56798:8;56807:1;56798:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;56784:3;;;;:::i;:::-;;;;56747:103;;;-1:-1:-1;56863:8:0;56529:348;-1:-1:-1;;;56529:348:0:o;57514:86::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;57579:4:::1;:15:::0;57514:86::o;40561:233::-;40636:7;40672:30;40459:10;:17;;40371:113;40672:30;40664:5;:38;40656:95;;;;-1:-1:-1;;;40656:95:0;;20554:2:1;40656:95:0;;;20536:21:1;20593:2;20573:18;;;20566:30;20632:34;20612:18;;;20605:62;-1:-1:-1;;;20683:18:1;;;20676:42;20735:19;;40656:95:0;20352:408:1;40656:95:0;40769:10;40780:5;40769:17;;;;;;;;:::i;:::-;;;;;;;;;40762:24;;40561:233;;;:::o;51685:102::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51760:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51685:102:::0;:::o;26919:239::-;26991:7;27027:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27027:16:0;27062:19;27054:73;;;;-1:-1:-1;;;27054:73:0;;16608:2:1;27054:73:0;;;16590:21:1;16647:2;16627:18;;;16620:30;16686:34;16666:18;;;16659:62;-1:-1:-1;;;16737:18:1;;;16730:39;16786:19;;27054:73:0;16406:405:1;26649:208:0;26721:7;-1:-1:-1;;;;;26749:19:0;;26741:74;;;;-1:-1:-1;;;26741:74:0;;16197:2:1;26741:74:0;;;16179:21:1;16236:2;16216:18;;;16209:30;16275:34;16255:18;;;16248:62;-1:-1:-1;;;16326:18:1;;;16319:40;16376:19;;26741:74:0;15995:406:1;26741:74:0;-1:-1:-1;;;;;;26833:16:0;;;;;:9;:16;;;;;;;26649:208::o;6195:103::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;27394:104::-;27450:13;27483:7;27476:14;;;;;:::i;60283:93::-;60326:7;60349:21;:11;964:14;;872:114;60349:21;60342:28;;60283:93;:::o;49316:1622::-;49400:15;49377:20;49441:13;40459:10;:17;;40371:113;49441:13;49424:30;;49483:1;49469:11;:15;49461:46;;;;-1:-1:-1;;;49461:46:0;;13540:2:1;49461:46:0;;;13522:21:1;13579:2;13559:18;;;13552:30;-1:-1:-1;;;13598:18:1;;;13591:48;13656:18;;49461:46:0;13338:342:1;49461:46:0;49537:13;;49522:11;:28;;49514:49;;;;-1:-1:-1;;;49514:49:0;;10548:2:1;49514:49:0;;;10530:21:1;10587:1;10567:18;;;10560:29;-1:-1:-1;;;10605:18:1;;;10598:38;10653:18;;49514:49:0;10346:331:1;49514:49:0;49602:9;;49578:20;49587:11;49578:6;:20;:::i;:::-;:33;;49570:87;;;;-1:-1:-1;;;49570:87:0;;20967:2:1;49570:87:0;;;20949:21:1;21006:2;20986:18;;;20979:30;21045:34;21025:18;;;21018:62;-1:-1:-1;;;21096:18:1;;;21089:39;21145:19;;49570:87:0;20765:405:1;49570:87:0;49675:6;;;;49674:7;49666:44;;;;-1:-1:-1;;;49666:44:0;;20201:2:1;49666:44:0;;;20183:21:1;20240:2;20220:18;;;20213:30;20279:26;20259:18;;;20252:54;20323:18;;49666:44:0;19999:348:1;49666:44:0;49740:21;;49725:12;:36;49717:73;;;;-1:-1:-1;;;49717:73:0;;21729:2:1;49717:73:0;;;21711:21:1;21768:2;21748:18;;;21741:30;21807:26;21787:18;;;21780:54;21851:18;;49717:73:0;21527:348:1;49717:73:0;49837:21;;49821:12;:37;49818:525;;49879:25;49893:10;49879:13;:25::i;:::-;49871:61;;;;-1:-1:-1;;;49871:61:0;;21377:2:1;49871:61:0;;;21359:21:1;21416:2;21396:18;;;21389:30;21455:25;21435:18;;;21428:53;21498:18;;49871:61:0;21175:347:1;49871:61:0;49991:10;49943:24;49970:32;;;:20;:32;;;;;;50055:18;;50021:30;50040:11;49970:32;50021:30;:::i;:::-;:52;;50013:93;;;;-1:-1:-1;;;50013:93:0;;13183:2:1;50013:93:0;;;13165:21:1;13222:2;13202:18;;;13195:30;13261;13241:18;;;13234:58;13309:18;;50013:93:0;12981:352:1;50013:93:0;50156:11;50138:15;;:29;;;;:::i;:::-;50125:9;:42;;50117:71;;;;-1:-1:-1;;;50117:71:0;;10884:2:1;50117:71:0;;;10866:21:1;10923:2;10903:18;;;10896:30;-1:-1:-1;;;10942:18:1;;;10935:46;10998:18;;50117:71:0;10682:340:1;50117:71:0;49860:336;49818:525;;;50242:21;;50227:12;:36;50224:119;;;50303:11;50296:4;;:18;;;;:::i;:::-;50283:9;:31;;50275:60;;;;-1:-1:-1;;;50275:60:0;;10884:2:1;50275:60:0;;;10866:21:1;10923:2;10903:18;;;10896:30;-1:-1:-1;;;10942:18:1;;;10935:46;10998:18;;50275:60:0;10682:340:1;50275:60:0;50368:1;50351:161;50376:11;50371:1;:16;50351:161;;50424:10;50403:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;;;50446:10;50459:11;:9;:11::i;:::-;50446:24;;50479:25;50489:10;50501:2;50479:9;:25::i;:::-;-1:-1:-1;50389:3:0;;;;:::i;:::-;;;;50351:161;;;;50524:10;50537:9;50524:22;;50553:11;50602:3;50594:5;50567:24;;:32;;;;:::i;:::-;:38;;;;:::i;:::-;50553:52;-1:-1:-1;50633:12:0;50553:52;50633:5;:12;:::i;:::-;50618:10;;:28;;;;;;;:::i;:::-;;;;;;;;50668:6;50653:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;50692:6:0;;-1:-1:-1;50687:246:0;50704:16;:23;50700:27;;50687:246;;;50757:16;:23;50751:3;:1;50753;50751:3;:::i;:::-;:29;:67;;;;;50799:16;50816:1;50799:19;;;;;;;;:::i;:::-;;;;;;;;;50784:12;:34;50751:67;:107;;;;-1:-1:-1;50837:16:0;50854:3;:1;50856;50854:3;:::i;:::-;50837:21;;;;;;;;:::i;:::-;;;;;;;;;50822:12;:36;50751:107;50748:178;;;50910:6;50878:25;50904:1;50878:28;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;50748:178:0;50729:3;;;;:::i;:::-;;;;50687:246;;29077:155;29172:52;4348:10;29205:8;29215;29172:18;:52::i;57994:161::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;58094:24:::1;:55:::0;57994:161::o;60071:123::-;60131:13;60163:25;60156:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60071:123;:::o;30200:328::-;30375:41;4348:10;30408:7;30375:18;:41::i;:::-;30367:103;;;;-1:-1:-1;;;30367:103:0;;;;;;;:::i;:::-;30481:39;30495:4;30501:2;30505:7;30514:5;30481:13;:39::i;46586:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46586:37:0;;-1:-1:-1;46586:37:0;:::o;59628:109::-;59676:24;59719:12;59712:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59628:109;:::o;49230:80::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;49289:6:::1;:15:::0;;-1:-1:-1;;49289:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49230:80::o;46066:37::-;;;;;;;:::i;56883:497::-;32103:4;32127:16;;;:7;:16;;;;;;56981:13;;-1:-1:-1;;;;;32127:16:0;57006:97;;;;-1:-1:-1;;;57006:97:0;;18563:2:1;57006:97:0;;;18545:21:1;18602:2;18582:18;;;18575:30;18641:34;18621:18;;;18614:62;-1:-1:-1;;;18692:18:1;;;18685:45;18747:19;;57006:97:0;18361:411:1;57006:97:0;57119:8;;;;;;;57116:62;;57156:14;57149:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56883:497;;;:::o;57116:62::-;57186:28;57217:10;:8;:10::i;:::-;57186:41;;57272:1;57247:14;57241:28;:32;:133;;;;;;;;;;;;;;;;;57309:14;57325:18;:7;:16;:18::i;:::-;57345:13;57292:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57241:133;57234:140;56883:497;-1:-1:-1;;;56883:497:0:o;57746:110::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;57823:18:::1;:27:::0;57746:110::o;57862:126::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;57949:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;59892:171::-:0;59943:7;59965:16;;59985:1;59965:21;59962:66;;;-1:-1:-1;60009:11:0;;;59892:171::o;59962:66::-;-1:-1:-1;60041:16:0;;;59892:171::o;47526:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47526:37:0;:::o;60476:106::-;60528:7;60563:13;40459:10;:17;;40371:113;60563:13;60551:9;;:25;;;;:::i;51528:149::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51622:21:::1;:49:::0;51528:149::o;59514:106::-;59566:13;59598:16;59591:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59514:106;:::o;59183:148::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;59262:27:::1;59269:20;;59262:27;:::i;:::-;59296:29;:20;59319:6:::0;;59296:29:::1;:::i;51793:124::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51879:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;6453:201::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6542:22:0;::::1;6534:73;;;::::0;-1:-1:-1;;;6534:73:0;;12419:2:1;6534:73:0::1;::::0;::::1;12401:21:1::0;12458:2;12438:18;;;12431:30;12497:34;12477:18;;;12470:62;-1:-1:-1;;;12548:18:1;;;12541:36;12594:19;;6534:73:0::1;12217:402:1::0;6534:73:0::1;6618:28;6637:8;6618:18;:28::i;26280:305::-:0;26382:4;-1:-1:-1;;;;;;26419:40:0;;-1:-1:-1;;;26419:40:0;;:105;;-1:-1:-1;;;;;;;26476:48:0;;-1:-1:-1;;;26476:48:0;26419:105;:158;;;-1:-1:-1;;;;;;;;;;18085:40:0;;;26541:36;17976:157;36020:174;36095:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36095:29:0;-1:-1:-1;;;;;36095:29:0;;;;;;;;:24;;36149:23;36095:24;36149:14;:23::i;:::-;-1:-1:-1;;;;;36140:46:0;;;;;;;;;;;36020:174;;:::o;54427:1815::-;54485:7;60999:1;60975:21;:19;:21::i;:::-;:25;60967:62;;;;-1:-1:-1;;;60967:62:0;;14646:2:1;60967:62:0;;;14628:21:1;14685:2;14665:18;;;14658:30;-1:-1:-1;;;14704:18:1;;;14697:54;14768:18;;60967:62:0;14444:348:1;60967:62:0;54613:16:::1;::::0;40459:10;:17;54528:15:::1;::::0;54573:1:::1;::::0;54597:32:::1;54593:1640;;;40459:10:::0;:17;54660:16:::1;;:32;;;;:::i;:::-;54649:43;;54717:14;54937:8;54791:10;54814:14;54841:16;54870:14;54897:12;54762:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54742:191;;;;;;54734:200;;:211;;;;:::i;:::-;54958:13;54990:27:::0;;;:19:::1;:27;::::0;;;;;54717:228;;-1:-1:-1;54958:13:0;54986:143:::1;;-1:-1:-1::0;55045:6:0;54986:143:::1;;;-1:-1:-1::0;55090:27:0::1;::::0;;;:19:::1;:27;::::0;;;;;54986:143:::1;55145:19;:33;55165:12;55176:1;55165:8:::0;:12:::1;:::i;:::-;55145:33;;;;;;;;;;;;55182:1;55145:38;55141:205;;;55228:12;55239:1;55228:8:::0;:12:::1;:::i;:::-;55198:27;::::0;;;:19:::1;:27;::::0;;;;:42;55141:205:::1;;;55301:19;:33;55321:12;55332:1;55321:8:::0;:12:::1;:::i;:::-;55301:33:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;55301:33:0;;;;55271:27;;;:19:::1;:27:::0;;;;:63;55141:205:::1;55358:16;:14;:16::i;:::-;-1:-1:-1::0;55402:9:0::1;::::0;55394:17:::1;::::0;:5;:17:::1;:::i;:::-;55387:24;;;;;;54427:1815:::0;:::o;54593:1640::-:1;40459:10:::0;:17;55464:9:::1;;:25;;;;:::i;:::-;55453:36;;55514:14;55746:8;55592:10;55617:14;55646:16;55677:14;55706:12;55561:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55539:203;;;;;;55531:212;;:223;;;;:::i;:::-;55771:13;55803:19:::0;;;:11:::1;:19;::::0;;;;;55514:240;;-1:-1:-1;55771:13:0;55799:147:::1;;-1:-1:-1::0;55860:6:0;55799:147:::1;;;-1:-1:-1::0;55915:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;55799:147:::1;55962:11;:25;55974:12;55985:1;55974:8:::0;:12:::1;:::i;:::-;55962:25;;;;;;;;;;;;55991:1;55962:30;55958:183;;;56029:12;56040:1;56029:8:::0;:12:::1;:::i;:::-;56007:19;::::0;;;:11:::1;:19;::::0;;;;:34;55958:183:::1;;;56104:11;:25;56116:12;56127:1;56116:8:::0;:12:::1;:::i;:::-;56104:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;56104:25:0;;;;56082:19;;;:11:::1;:19:::0;;;;:47;55958:183:::1;56151:16;:14;:16::i;:::-;;56206;;56194:9;;:28;;;;:::i;:::-;56185:38;::::0;:5;:38:::1;:::i;33022:110::-:0;33098:26;33108:2;33112:7;33098:26;;;;;;;;;;;;:9;:26::i;32332:348::-;32425:4;32127:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32127:16:0;32442:73;;;;-1:-1:-1;;;32442:73:0;;14999:2:1;32442:73:0;;;14981:21:1;15038:2;15018:18;;;15011:30;15077:34;15057:18;;;15050:62;-1:-1:-1;;;15128:18:1;;;15121:42;15180:19;;32442:73:0;14797:408:1;32442:73:0;32526:13;32542:23;32557:7;32542:14;:23::i;:::-;32526:39;;32595:5;-1:-1:-1;;;;;32584:16:0;:7;-1:-1:-1;;;;;32584:16:0;;:51;;;;32628:7;-1:-1:-1;;;;;32604:31:0;:20;32616:7;32604:11;:20::i;:::-;-1:-1:-1;;;;;32604:31:0;;32584:51;:87;;;-1:-1:-1;;;;;;29424:25:0;;;29400:4;29424:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32639:32;32576:96;32332:348;-1:-1:-1;;;;32332:348:0:o;35324:578::-;35483:4;-1:-1:-1;;;;;35456:31:0;:23;35471:7;35456:14;:23::i;:::-;-1:-1:-1;;;;;35456:31:0;;35448:85;;;;-1:-1:-1;;;35448:85:0;;18153:2:1;35448:85:0;;;18135:21:1;18192:2;18172:18;;;18165:30;18231:34;18211:18;;;18204:62;-1:-1:-1;;;18282:18:1;;;18275:39;18331:19;;35448:85:0;17951:405:1;35448:85:0;-1:-1:-1;;;;;35552:16:0;;35544:65;;;;-1:-1:-1;;;35544:65:0;;13887:2:1;35544:65:0;;;13869:21:1;13926:2;13906:18;;;13899:30;13965:34;13945:18;;;13938:62;-1:-1:-1;;;14016:18:1;;;14009:34;14060:19;;35544:65:0;13685:400:1;35544:65:0;35622:39;35643:4;35649:2;35653:7;35622:20;:39::i;:::-;35726:29;35743:1;35747:7;35726:8;:29::i;:::-;-1:-1:-1;;;;;35768:15:0;;;;;;:9;:15;;;;;:20;;35787:1;;35768:15;:20;;35787:1;;35768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35799:13:0;;;;;;:9;:13;;;;;:18;;35816:1;;35799:13;:18;;35816:1;;35799:18;:::i;:::-;;;;-1:-1:-1;;35828:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35828:21:0;-1:-1:-1;;;;;35828:21:0;;;;;;;;;35867:27;;35828:16;;35867:27;;;;;;;35324:578;;;:::o;6814:191::-;6907:6;;;-1:-1:-1;;;;;6924:17:0;;;-1:-1:-1;;;;;;6924:17:0;;;;;;;6957:40;;6907:6;;;6924:17;6907:6;;6957:40;;6888:16;;6957:40;6877:128;6814:191;:::o;36336:315::-;36491:8;-1:-1:-1;;;;;36482:17:0;:5;-1:-1:-1;;;;;36482:17:0;;;36474:55;;;;-1:-1:-1;;;36474:55:0;;14292:2:1;36474:55:0;;;14274:21:1;14331:2;14311:18;;;14304:30;14370:27;14350:18;;;14343:55;14415:18;;36474:55:0;14090:349:1;36474:55:0;-1:-1:-1;;;;;36540:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36540:46:0;;;;;;;;;;36602:41;;10070::1;;;36602::0;;10043:18:1;36602:41:0;;;;;;;36336:315;;;:::o;31410:::-;31567:28;31577:4;31583:2;31587:7;31567:9;:28::i;:::-;31614:48;31637:4;31643:2;31647:7;31656:5;31614:22;:48::i;:::-;31606:111;;;;-1:-1:-1;;;31606:111:0;;;;;;;:::i;54315:106::-;54375:13;54408:7;54401:14;;;;;:::i;1830:723::-;1886:13;2107:10;2103:53;;-1:-1:-1;;2134:10:0;;;;;;;;;;;;-1:-1:-1;;;2134:10:0;;;;;1830:723::o;2103:53::-;2181:5;2166:12;2222:78;2229:9;;2222:78;;2255:8;;;;:::i;:::-;;-1:-1:-1;2278:10:0;;-1:-1:-1;2286:2:0;2278:10;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2332:17:0;;2310:39;;2360:154;2367:10;;2360:154;;2394:11;2404:1;2394:11;;:::i;:::-;;-1:-1:-1;2463:10:0;2471:2;2463:5;:10;:::i;:::-;2450:24;;:2;:24;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2420:56:0;;;;;;;;-1:-1:-1;2491:11:0;2500:2;2491:11;;:::i;:::-;;;2360:154;;60686:179;60757:7;60999:1;60975:21;:19;:21::i;:::-;:25;60967:62;;;;-1:-1:-1;;;60967:62:0;;14646:2:1;60967:62:0;;;14628:21:1;14685:2;14665:18;;;14658:30;-1:-1:-1;;;14704:18:1;;;14697:54;14768:18;;60967:62:0;14444:348:1;60967:62:0;60773:13:::1;60789:21;:11;964:14:::0;;872:114;60789:21:::1;60773:37;;60817:23;:11;1083:19:::0;;1101:1;1083:19;;;994:127;33359:321;33489:18;33495:2;33499:7;33489:5;:18::i;:::-;33540:54;33571:1;33575:2;33579:7;33588:5;33540:22;:54::i;:::-;33518:154;;;;-1:-1:-1;;;33518:154:0;;;;;;;:::i;41407:589::-;-1:-1:-1;;;;;41613:18:0;;41609:187;;41648:40;41680:7;42823:10;:17;;42796:24;;;;:15;:24;;;;;:44;;;42851:24;;;;;;;;;;;;42719:164;41648:40;41609:187;;;41718:2;-1:-1:-1;;;;;41710:10:0;:4;-1:-1:-1;;;;;41710:10:0;;41706:90;;41737:47;41770:4;41776:7;41737:32;:47::i;:::-;-1:-1:-1;;;;;41810:16:0;;41806:183;;41843:45;41880:7;41843:36;:45::i;41806:183::-;41916:4;-1:-1:-1;;;;;41910:10:0;:2;-1:-1:-1;;;;;41910:10:0;;41906:83;;41937:40;41965:2;41969:7;41937:27;:40::i;37216:799::-;37371:4;-1:-1:-1;;;;;37392:13:0;;8155:20;8203:8;37388:620;;37428:72;;-1:-1:-1;;;37428:72:0;;-1:-1:-1;;;;;37428:36:0;;;;;:72;;4348:10;;37479:4;;37485:7;;37494:5;;37428:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37428:72:0;;;;;;;;-1:-1:-1;;37428:72:0;;;;;;;;;;;;:::i;:::-;;;37424:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37670:13:0;;37666:272;;37713:60;;-1:-1:-1;;;37713:60:0;;;;;;;:::i;37666:272::-;37888:6;37882:13;37873:6;37869:2;37865:15;37858:38;37424:529;-1:-1:-1;;;;;;37551:51:0;-1:-1:-1;;;37551:51:0;;-1:-1:-1;37544:58:0;;37388:620;-1:-1:-1;37992:4:0;37216:799;;;;;;:::o;34016:382::-;-1:-1:-1;;;;;34096:16:0;;34088:61;;;;-1:-1:-1;;;34088:61:0;;17018:2:1;34088:61:0;;;17000:21:1;;;17037:18;;;17030:30;17096:34;17076:18;;;17069:62;17148:18;;34088:61:0;16816:356:1;34088:61:0;32103:4;32127:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32127:16:0;:30;34160:58;;;;-1:-1:-1;;;34160:58:0;;12826:2:1;34160:58:0;;;12808:21:1;12865:2;12845:18;;;12838:30;12904;12884:18;;;12877:58;12952:18;;34160:58:0;12624:352:1;34160:58:0;34231:45;34260:1;34264:2;34268:7;34231:20;:45::i;:::-;-1:-1:-1;;;;;34289:13:0;;;;;;:9;:13;;;;;:18;;34306:1;;34289:13;:18;;34306:1;;34289:18;:::i;:::-;;;;-1:-1:-1;;34318:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34318:21:0;-1:-1:-1;;;;;34318:21:0;;;;;;;;34357:33;;34318:16;;;34357:33;;34318:16;;34357:33;34016:382;;:::o;43510:988::-;43776:22;43826:1;43801:22;43818:4;43801:16;:22::i;:::-;:26;;;;:::i;:::-;43838:18;43859:26;;;:17;:26;;;;;;43776:51;;-1:-1:-1;43992:28:0;;;43988:328;;-1:-1:-1;;;;;44059:18:0;;44037:19;44059:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44110:30;;;;;;:44;;;44227:30;;:17;:30;;;;;:43;;;43988:328;-1:-1:-1;44412:26:0;;;;:17;:26;;;;;;;;44405:33;;;-1:-1:-1;;;;;44456:18:0;;;;;:12;:18;;;;;:34;;;;;;;44449:41;43510:988::o;44793:1079::-;45071:10;:17;45046:22;;45071:21;;45091:1;;45071:21;:::i;:::-;45103:18;45124:24;;;:15;:24;;;;;;45497:10;:26;;45046:46;;-1:-1:-1;45124:24:0;;45046:46;;45497:26;;;;;;:::i;:::-;;;;;;;;;45475:48;;45561:11;45536:10;45547;45536:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45641:28;;;:15;:28;;;;;;;:41;;;45813:24;;;;;45806:31;45848:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44864:1008;;;44793:1079;:::o;42297:221::-;42382:14;42399:20;42416:2;42399:16;:20::i;:::-;-1:-1:-1;;;;;42430:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42475:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42297:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:615::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3174:9;3161:23;3203:18;3244:2;3236:6;3233:14;3230:34;;;3260:1;3257;3250:12;3230:34;3298:6;3287:9;3283:22;3273:32;;3343:7;3336:4;3332:2;3328:13;3324:27;3314:55;;3365:1;3362;3355:12;3314:55;3405:2;3392:16;3431:2;3423:6;3420:14;3417:34;;;3447:1;3444;3437:12;3417:34;3500:7;3495:2;3485:6;3482:1;3478:14;3474:2;3470:23;3466:32;3463:45;3460:65;;;3521:1;3518;3511:12;3460:65;3552:2;3544:11;;;;;3574:6;;-1:-1:-1;2971:615:1;;-1:-1:-1;;;;2971:615:1:o;3591:180::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3739:26;3755:9;3739:26;:::i;3776:245::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3942:9;3929:23;3961:30;3985:5;3961:30;:::i;4026:249::-;4095:6;4148:2;4136:9;4127:7;4123:23;4119:32;4116:52;;;4164:1;4161;4154:12;4116:52;4196:9;4190:16;4215:30;4239:5;4215:30;:::i;4280:450::-;4349:6;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4458:9;4445:23;4491:18;4483:6;4480:30;4477:50;;;4523:1;4520;4513:12;4477:50;4546:22;;4599:4;4591:13;;4587:27;-1:-1:-1;4577:55:1;;4628:1;4625;4618:12;4577:55;4651:73;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4651:73;:::i;4735:180::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;-1:-1:-1;4886:23:1;;4735:180;-1:-1:-1;4735:180:1:o;4920:248::-;4988:6;4996;5049:2;5037:9;5028:7;5024:23;5020:32;5017:52;;;5065:1;5062;5055:12;5017:52;-1:-1:-1;;5088:23:1;;;5158:2;5143:18;;;5130:32;;-1:-1:-1;4920:248:1:o;5173:257::-;5214:3;5252:5;5246:12;5279:6;5274:3;5267:19;5295:63;5351:6;5344:4;5339:3;5335:14;5328:4;5321:5;5317:16;5295:63;:::i;:::-;5412:2;5391:15;-1:-1:-1;;5387:29:1;5378:39;;;;5419:4;5374:50;;5173:257;-1:-1:-1;;5173:257:1:o;5435:546::-;-1:-1:-1;;5762:2:1;5758:15;;;5754:24;;5742:37;;5813:15;;;;5809:24;;;5804:2;5795:12;;5788:46;5859:2;5850:12;;5843:28;;;;5896:2;5887:12;;5880:28;5933:3;5924:13;;5917:29;5971:3;5962:13;;5435:546::o;5986:1527::-;6210:3;6248:6;6242:13;6274:4;6287:51;6331:6;6326:3;6321:2;6313:6;6309:15;6287:51;:::i;:::-;6401:13;;6360:16;;;;6423:55;6401:13;6360:16;6445:15;;;6423:55;:::i;:::-;6567:13;;6500:20;;;6540:1;;6627;6649:18;;;;6702;;;;6729:93;;6807:4;6797:8;6793:19;6781:31;;6729:93;6870:2;6860:8;6857:16;6837:18;6834:40;6831:167;;;-1:-1:-1;;;6897:33:1;;6953:4;6950:1;6943:15;6983:4;6904:3;6971:17;6831:167;7014:18;7041:110;;;;7165:1;7160:328;;;;7007:481;;7041:110;-1:-1:-1;;7076:24:1;;7062:39;;7121:20;;;;-1:-1:-1;7041:110:1;;7160:328;22459:1;22452:14;;;22496:4;22483:18;;7255:1;7269:169;7283:8;7280:1;7277:15;7269:169;;;7365:14;;7350:13;;;7343:37;7408:16;;;;7300:10;;7269:169;;;7273:3;;7469:8;7462:5;7458:20;7451:27;;7007:481;-1:-1:-1;7504:3:1;;5986:1527;-1:-1:-1;;;;;;;;;;;5986:1527:1:o;7936:488::-;-1:-1:-1;;;;;8205:15:1;;;8187:34;;8257:15;;8252:2;8237:18;;8230:43;8304:2;8289:18;;8282:34;;;8352:3;8347:2;8332:18;;8325:31;;;8130:4;;8373:45;;8398:19;;8390:6;8373:45;:::i;:::-;8365:53;7936:488;-1:-1:-1;;;;;;7936:488:1:o;8429:859::-;8666:2;8718:21;;;8788:13;;8691:18;;;8810:22;;;8637:4;;8666:2;8851;;8869:18;;;;8910:15;;;8637:4;8953:309;8967:6;8964:1;8961:13;8953:309;;;9026:13;;9064:9;;9052:22;;9114:11;;;9108:18;9094:12;;;9087:40;9167:11;;9161:18;9147:12;;;9140:40;9209:4;9200:14;;;;9237:15;;;;8989:1;8982:9;8953:309;;;-1:-1:-1;9279:3:1;;8429:859;-1:-1:-1;;;;;;;8429:859:1:o;9293:632::-;9464:2;9516:21;;;9586:13;;9489:18;;;9608:22;;;9435:4;;9464:2;9687:15;;;;9661:2;9646:18;;;9435:4;9730:169;9744:6;9741:1;9738:13;9730:169;;;9805:13;;9793:26;;9874:15;;;;9839:12;;;;9766:1;9759:9;9730:169;;;-1:-1:-1;9916:3:1;;9293:632;-1:-1:-1;;;;;;9293:632:1:o;10122:219::-;10271:2;10260:9;10253:21;10234:4;10291:44;10331:2;10320:9;10316:18;10308:6;10291:44;:::i;11798:414::-;12000:2;11982:21;;;12039:2;12019:18;;;12012:30;12078:34;12073:2;12058:18;;12051:62;-1:-1:-1;;;12144:2:1;12129:18;;12122:48;12202:3;12187:19;;11798:414::o;17590:356::-;17792:2;17774:21;;;17811:18;;;17804:30;17870:34;17865:2;17850:18;;17843:62;17937:2;17922:18;;17590:356::o;19581:413::-;19783:2;19765:21;;;19822:2;19802:18;;;19795:30;19861:34;19856:2;19841:18;;19834:62;-1:-1:-1;;;19927:2:1;19912:18;;19905:47;19984:3;19969:19;;19581:413::o;22512:128::-;22552:3;22583:1;22579:6;22576:1;22573:13;22570:39;;;22589:18;;:::i;:::-;-1:-1:-1;22625:9:1;;22512:128::o;22645:120::-;22685:1;22711;22701:35;;22716:18;;:::i;:::-;-1:-1:-1;22750:9:1;;22645:120::o;22770:168::-;22810:7;22876:1;22872;22868:6;22864:14;22861:1;22858:21;22853:1;22846:9;22839:17;22835:45;22832:71;;;22883:18;;:::i;:::-;-1:-1:-1;22923:9:1;;22770:168::o;22943:125::-;22983:4;23011:1;23008;23005:8;23002:34;;;23016:18;;:::i;:::-;-1:-1:-1;23053:9:1;;22943:125::o;23073:258::-;23145:1;23155:113;23169:6;23166:1;23163:13;23155:113;;;23245:11;;;23239:18;23226:11;;;23219:39;23191:2;23184:10;23155:113;;;23286:6;23283:1;23280:13;23277:48;;;-1:-1:-1;;23321:1:1;23303:16;;23296:27;23073:258::o;23336:380::-;23415:1;23411:12;;;;23458;;;23479:61;;23533:4;23525:6;23521:17;23511:27;;23479:61;23586:2;23578:6;23575:14;23555:18;23552:38;23549:161;;;23632:10;23627:3;23623:20;23620:1;23613:31;23667:4;23664:1;23657:15;23695:4;23692:1;23685:15;23549:161;;23336:380;;;:::o;23721:135::-;23760:3;-1:-1:-1;;23781:17:1;;23778:43;;;23801:18;;:::i;:::-;-1:-1:-1;23848:1:1;23837:13;;23721:135::o;23861:112::-;23893:1;23919;23909:35;;23924:18;;:::i;:::-;-1:-1:-1;23958:9:1;;23861:112::o;23978:127::-;24039:10;24034:3;24030:20;24027:1;24020:31;24070:4;24067:1;24060:15;24094:4;24091:1;24084:15;24110:127;24171:10;24166:3;24162:20;24159:1;24152:31;24202:4;24199:1;24192:15;24226:4;24223:1;24216:15;24242:127;24303:10;24298:3;24294:20;24291:1;24284:31;24334:4;24331:1;24324:15;24358:4;24355:1;24348:15;24374:127;24435:10;24430:3;24426:20;24423:1;24416:31;24466:4;24463:1;24456:15;24490:4;24487:1;24480:15;24506:127;24567:10;24562:3;24558:20;24555:1;24548:31;24598:4;24595:1;24588:15;24622:4;24619:1;24612:15;24638:131;-1:-1:-1;;;;;;24712:32:1;;24702:43;;24692:71;;24759:1;24756;24749:12

Swarm Source

ipfs://15236236ff78faa6e930a04af3b7665bfb19f63149ad117390b3cd2d89d99287
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.