ETH Price: $3,108.83 (-0.22%)

Token

MultiNode (mNODE)
 

Overview

Max Total Supply

3,070 mNODE

Holders

1,090

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 mNODE
0x93ea4e0c572f7067afe4703012d9f7e82354c15d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Passive income utility that is transferrable, tradeable, and flexible in nature.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MCCNode

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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 contracts/nodes/IMCCNode.sol

pragma solidity ^0.8.4;

interface IMCCNode is IERC721 {
  function mainToken() external view returns (address);

  function stableToken() external view returns (address);

  function tokenMintedAt(uint256 tokenId) external view returns (uint256);

  function tokenLastTransferredAt(uint256 tokenId)
    external
    view
    returns (uint256);

  function pricePaidUSD18(uint256 tokenId) external view returns (uint256);

  function tokenPerDayReturn(uint256 tokenId) external view returns (uint256);

  function mint(uint256[] memory tierId, uint256[] memory amount)
    external
    payable;
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]


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/utils/[email protected]


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/introspection/[email protected]


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/[email protected]


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).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/[email protected]


pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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/[email protected]


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/security/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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/math/[email protected]


pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/nodes/IDexUtils.sol

pragma solidity ^0.8.4;

interface IDexUtils {
  function getMainPriceViaNativePair(address token)
    external
    view
    returns (uint256);
}


// File contracts/nodes/MCCNode.sol

pragma solidity ^0.8.4;


interface IERC20Decimals is IERC20 {
  function decimals() external view returns (uint8);
}

/**
 * MultiChainCapital Nodes
 */
contract MCCNode is
  IMCCNode,
  Ownable,
  ERC721Burnable,
  ERC721Enumerable,
  ERC721Pausable
{
  using SafeMath for uint256;
  using Strings for uint256;
  using Counters for Counters.Counter;

  uint16 public constant PERCENT_DENOMENATOR = 10000;

  struct Tier {
    uint256 id;
    string name;
    uint256 tokenPrice; // price excluding decimals
    uint256 stablePrice; // price excluding decimals
    uint256 dailyReturnPercent; // see PERCENT_DENOMENATOR, 1% = 100
  }

  Counters.Counter private _tokenIds;

  // Base token uri
  string private baseTokenURI; // baseTokenURI can point to IPFS folder like https://ipfs.io/ipfs/{cid}/ while

  address public override mainToken;
  address public override stableToken;
  IDexUtils dexUtils;

  // Payment address
  address public paymentAddress = 0xed528FC31f2575312Ec3336E0F6ec9812B534937;

  // Royalties address
  address public royaltyAddress = 0xed528FC31f2575312Ec3336E0F6ec9812B534937;

  // Royalties basis points (percentage using 2 decimals - 10000 = 100, 5000 = 50, 0 = 0)
  uint256 private royaltyBasisPoints = 300; // 3%

  // Token info
  string public constant TOKEN_NAME = 'MultiNode';
  string public constant TOKEN_SYMBOL = 'mNODE';

  // Public sale params
  uint256 public publicSaleStartTime;
  bool public publicSaleActive;

  uint256 public numTiers;
  mapping(uint256 => Tier) public allTiers;

  mapping(uint256 => Tier) public tokenTier;
  mapping(uint256 => uint256) public override tokenMintedAt;
  mapping(uint256 => uint256) public override tokenLastTransferredAt;
  mapping(uint256 => uint256) public override pricePaidUSD18;
  mapping(uint256 => uint256) public override tokenPerDayReturn; // the amount of mainToken to reward per day, locked at mint time

  mapping(uint256 => uint256) public tierCounts;

  event PublicSaleStart(uint256 indexed _saleStartTime);
  event PublicSalePaused(uint256 indexed _timeElapsed);
  event PublicSaleActive(bool indexed _publicSaleActive);
  event RoyaltyBasisPoints(uint256 indexed _royaltyBasisPoints);

  // Public sale active modifier
  modifier whenPublicSaleActive() {
    require(publicSaleActive, 'Public sale is not active');
    _;
  }

  // Public sale not active modifier
  modifier whenPublicSaleNotActive() {
    require(
      !publicSaleActive && publicSaleStartTime == 0,
      'Public sale is already active'
    );
    _;
  }

  // Owner or public sale active modifier
  modifier whenOwnerOrPublicSaleActive() {
    require(
      owner() == _msgSender() || publicSaleActive,
      'Public sale is not active'
    );
    _;
  }

  // -- Constructor --//
  constructor(
    string memory _baseTokenURI,
    address _mainToken,
    address _stableToken,
    address _dexUtils
  ) ERC721(TOKEN_NAME, TOKEN_SYMBOL) {
    baseTokenURI = _baseTokenURI;
    mainToken = _mainToken;
    stableToken = _stableToken;
    dexUtils = IDexUtils(_dexUtils);

    Tier[5] memory initTiers = [
      Tier({
        id: 1,
        name: 'Presidential',
        tokenPrice: 108_300_000,
        stablePrice: 5000,
        dailyReturnPercent: 100
      }),
      Tier({
        id: 2,
        name: 'Director',
        tokenPrice: 54_100_000,
        stablePrice: 2500,
        dailyReturnPercent: 80
      }),
      Tier({
        id: 3,
        name: 'Executive',
        tokenPrice: 21_700_000,
        stablePrice: 1000,
        dailyReturnPercent: 65
      }),
      Tier({
        id: 4,
        name: 'Banker',
        tokenPrice: 10_800_000,
        stablePrice: 500,
        dailyReturnPercent: 58
      }),
      Tier({
        id: 5,
        name: 'Analyst',
        tokenPrice: 5_400_000,
        stablePrice: 250,
        dailyReturnPercent: 50
      })
    ];

    numTiers = initTiers.length;
    for (uint256 i = 0; i < initTiers.length; i++) {
      Tier memory tier = initTiers[i];
      allTiers[tier.id] = tier;
    }
  }

  // -- External Functions -- //
  function getDexUtils() external view returns (address) {
    return address(dexUtils);
  }

  // Start public sale
  function startPublicSale() external onlyOwner whenPublicSaleNotActive {
    publicSaleStartTime = block.timestamp;
    publicSaleActive = true;
    emit PublicSaleStart(publicSaleStartTime);
  }

  // Set this value to the block.timestamp you'd like to reset to
  // Created as a way to fast foward in time for tier timing unit tests
  // Can also be used if needing to pause and restart public sale from original start time (returned in startPublicSale() above)
  function setPublicSaleStartTime(uint256 _publicSaleStartTime)
    external
    onlyOwner
  {
    publicSaleStartTime = _publicSaleStartTime;
    emit PublicSaleStart(publicSaleStartTime);
  }

  // Toggle public sale
  function togglePublicSaleActive() external onlyOwner {
    publicSaleActive = !publicSaleActive;
    emit PublicSaleActive(publicSaleActive);
  }

  // Pause public sale
  function pausePublicSale() external onlyOwner whenPublicSaleActive {
    publicSaleActive = false;
    emit PublicSalePaused(getElapsedSaleTime());
  }

  // Get all tiers
  function getAllTiers() external view returns (Tier[] memory) {
    Tier[] memory tiers = new Tier[](numTiers);
    for (uint256 i = 1; i < numTiers + 1; i++) {
      tiers[i - 1] = allTiers[i];
    }
    return tiers;
  }

  // Support royalty info - See {EIP-2981}: https://eips.ethereum.org/EIPS/eip-2981
  function royaltyInfo(uint256, uint256 _salePrice)
    external
    view
    returns (address receiver, uint256 royaltyAmount)
  {
    return (
      royaltyAddress,
      (_salePrice.mul(royaltyBasisPoints)).div(PERCENT_DENOMENATOR)
    );
  }

  //-- Public Functions --//

  // Get elapsed sale time
  function getElapsedSaleTime() public view returns (uint256) {
    return
      publicSaleStartTime > 0 ? block.timestamp.sub(publicSaleStartTime) : 0;
  }

  // Mint token - requires tier and amount
  function mint(uint256[] memory _tierIds, uint256[] memory _amounts)
    public
    payable
    override
    whenOwnerOrPublicSaleActive
  {
    require(
      _tierIds.length == _amounts.length,
      'Tier and amounts per tier should be the same'
    );

    for (uint256 _i = 0; _i < _tierIds.length; _i++) {
      uint256 _tierId = _tierIds[_i];
      uint256 _amount = _amounts[_i];

      Tier memory tier = allTiers[_tierId];

      require(tier.id == _tierId, 'Invalid tier');

      // Must mint at least one
      require(_amount > 0, 'Must mint at least one');

      // Get current address total balance
      uint256 currentTotalAmount = super.balanceOf(_msgSender());

      // Loop over all tokens for address and get current tier count
      uint256 currentTierAmount = 0;
      for (uint256 _j = 0; _j < currentTotalAmount; _j++) {
        uint256 tokenId = super.tokenOfOwnerByIndex(_msgSender(), _j);
        Tier memory _tokenTier = tokenTier[tokenId];
        if (_tokenTier.id == tier.id) {
          currentTierAmount++;
        }
      }

      // Pay for nodes
      payToMint(tier.id, _amount);

      for (uint256 i = 0; i < _amount; i++) {
        _tokenIds.increment();

        // Safe mint
        _safeMint(_msgSender(), _tokenIds.current());

        (uint256 mainPriceUSD18, uint256 pricePaid) = _getTotalPaidUSD18(
          tier.id
        );
        pricePaidUSD18[_tokenIds.current()] = pricePaid;

        tokenPerDayReturn[_tokenIds.current()] = getPerDayReturnFromTier(
          tier.id,
          mainPriceUSD18
        );

        // Attribute token id with tier
        tokenTier[_tokenIds.current()] = tier;

        // Store minted at timestamp by token id
        tokenMintedAt[_tokenIds.current()] = block.timestamp;

        // Increment tier counter
        tierCounts[tier.id] = tierCounts[tier.id].add(1);
      }

      // Return unused value
      if (msg.value > 0) {
        Address.sendValue(payable(_msgSender()), msg.value);
      }
    }
  }

  function payToMint(uint256 _tierId, uint256 amount)
    internal
    whenOwnerOrPublicSaleActive
  {
    bool isOwner = owner() == _msgSender();
    if (isOwner) {
      return;
    }

    Tier memory tier = allTiers[_tierId];

    IERC20Decimals main = IERC20Decimals(mainToken);
    IERC20Decimals stable = IERC20Decimals(stableToken);

    uint256 totalMainTokenPrice = tier.tokenPrice.mul(10**main.decimals()).mul(
      amount
    );
    uint256 totalStablePrice = tier.stablePrice.mul(10**stable.decimals()).mul(
      amount
    );

    require(
      main.balanceOf(msg.sender) >= totalMainTokenPrice,
      'not enough main token balance to mint'
    );
    require(
      stable.balanceOf(msg.sender) >= totalStablePrice,
      'not enough stable token balance to mint'
    );

    main.transferFrom(msg.sender, paymentAddress, totalMainTokenPrice);
    stable.transferFrom(msg.sender, paymentAddress, totalStablePrice);
  }

  function setPaymentAddress(address _address) external onlyOwner {
    paymentAddress = _address;
  }

  // Set royalty wallet address
  function setRoyaltyAddress(address _address) external onlyOwner {
    royaltyAddress = _address;
  }

  function setMainToken(address _mainToken) external onlyOwner {
    mainToken = _mainToken;
  }

  function setStableToken(address _stableToken) external onlyOwner {
    stableToken = _stableToken;
  }

  // Set royalty basis points
  function setRoyaltyBasisPoints(uint256 _basisPoints) external onlyOwner {
    royaltyBasisPoints = _basisPoints;
    emit RoyaltyBasisPoints(_basisPoints);
  }

  // Set base URI
  function setBaseURI(string memory _uri) external onlyOwner {
    baseTokenURI = _uri;
  }

  function setDexUtils(address _newUtils) external onlyOwner {
    dexUtils = IDexUtils(_newUtils);
  }

  function addOrUpdateTier(
    uint256 id,
    string memory name,
    uint256 tokenPrice,
    uint256 stablePrice,
    uint256 dailyReturnPercent
  ) external onlyOwner {
    Tier storage tier = allTiers[id];

    // check if tier exists and add to number of tiers if new tier
    if (tier.tokenPrice == 0 && tier.stablePrice == 0) {
      numTiers++;
    }
    tier.name = name;
    tier.tokenPrice = tokenPrice;
    tier.stablePrice = stablePrice;
    tier.dailyReturnPercent = dailyReturnPercent;
  }

  function updateNodePerDayReturn(uint256 tokenId, uint256 amount)
    external
    onlyOwner
  {
    tokenPerDayReturn[tokenId] = amount;
  }

  function getPerDayReturnFromTier(uint256 tierId, uint256 mainPriceUSD18)
    public
    view
    returns (uint256)
  {
    Tier memory tier = allTiers[tierId];
    IERC20Decimals main = IERC20Decimals(mainToken);
    (, uint256 totalUSDPaid18) = _getTotalPaidUSD18(tierId);
    uint256 perDayUSDRewards18 = totalUSDPaid18
      .mul(tier.dailyReturnPercent)
      .div(PERCENT_DENOMENATOR);
    return perDayUSDRewards18.mul(10**main.decimals()).div(mainPriceUSD18);
  }

  function _getTotalPaidUSD18(uint256 tierId)
    internal
    view
    returns (uint256, uint256)
  {
    Tier memory tier = allTiers[tierId];
    IERC20Decimals main = IERC20Decimals(mainToken);
    IERC20Decimals stable = IERC20Decimals(stableToken);
    uint256 mainIncDecimals = tier.tokenPrice.mul(10**main.decimals());
    uint256 stableIncDecimals = tier.stablePrice.mul(10**stable.decimals());
    uint256 mainPriceUSD18 = dexUtils.getMainPriceViaNativePair(mainToken);
    uint256 mainUSDPaid18 = mainPriceUSD18
      .mul(mainIncDecimals.mul(10**18).div(10**main.decimals()))
      .div(10**18);
    return (
      mainPriceUSD18,
      mainUSDPaid18.add(
        stableIncDecimals.mul(10**18).div(10**stable.decimals())
      )
    );
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(_exists(_tokenId), 'Nonexistent token');

    return string(abi.encodePacked(_baseURI(), _tokenId.toString(), '.json'));
  }

  // Contract metadata URI - Support for OpenSea: https://docs.opensea.io/docs/contract-level-metadata
  function contractURI() public view returns (string memory) {
    return string(abi.encodePacked(_baseURI(), 'contract.json'));
  }

  // Override supportsInterface - See {IERC165-supportsInterface}
  function supportsInterface(bytes4 _interfaceId)
    public
    view
    virtual
    override(ERC721, ERC721Enumerable, IERC165)
    returns (bool)
  {
    return super.supportsInterface(_interfaceId);
  }

  // Pauses all token transfers - See {ERC721Pausable}
  function pause() public virtual onlyOwner {
    _pause();
  }

  // Unpauses all token transfers - See {ERC721Pausable}
  function unpause() public virtual onlyOwner {
    _unpause();
  }

  //-- Internal Functions --//

  // Get base URI
  function _baseURI() internal view override returns (string memory) {
    return baseTokenURI;
  }

  // Before all token transfer
  function _beforeTokenTransfer(
    address _from,
    address _to,
    uint256 _tokenId
  ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
    // Store token last transfer timestamp by id
    tokenLastTransferredAt[_tokenId] = block.timestamp;

    // TODO: update tracker of from/to owned tokenIds

    super._beforeTokenTransfer(_from, _to, _tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_mainToken","type":"address"},{"internalType":"address","name":"_stableToken","type":"address"},{"internalType":"address","name":"_dexUtils","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_publicSaleActive","type":"bool"}],"name":"PublicSaleActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_timeElapsed","type":"uint256"}],"name":"PublicSalePaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_saleStartTime","type":"uint256"}],"name":"PublicSaleStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_royaltyBasisPoints","type":"uint256"}],"name":"RoyaltyBasisPoints","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"PERCENT_DENOMENATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"stablePrice","type":"uint256"},{"internalType":"uint256","name":"dailyReturnPercent","type":"uint256"}],"name":"addOrUpdateTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allTiers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"stablePrice","type":"uint256"},{"internalType":"uint256","name":"dailyReturnPercent","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllTiers","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"stablePrice","type":"uint256"},{"internalType":"uint256","name":"dailyReturnPercent","type":"uint256"}],"internalType":"struct MCCNode.Tier[]","name":"","type":"tuple[]"}],"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":"getDexUtils","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getElapsedSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tierId","type":"uint256"},{"internalType":"uint256","name":"mainPriceUSD18","type":"uint256"}],"name":"getPerDayReturnFromTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tierIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pricePaidUSD18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newUtils","type":"address"}],"name":"setDexUtils","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mainToken","type":"address"}],"name":"setMainToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleStartTime","type":"uint256"}],"name":"setPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basisPoints","type":"uint256"}],"name":"setRoyaltyBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stableToken","type":"address"}],"name":"setStableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPublicSale","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":"","type":"uint256"}],"name":"tierCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenLastTransferredAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMintedAt","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":"","type":"uint256"}],"name":"tokenPerDayReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTier","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"stablePrice","type":"uint256"},{"internalType":"uint256","name":"dailyReturnPercent","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateNodePerDayReturn","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526011805473ed528fc31f2575312ec3336e0f6ec9812b5349376001600160a01b0319918216811790925560128054909116909117905561012c6013553480156200004d57600080fd5b5060405162004a4d38038062004a4d8339810160408190526200007091620004a5565b604051806040016040528060098152602001684d756c74694e6f646560b81b815250604051806040016040528060058152602001646d4e4f444560d81b815250620000ca620000c46200038e60201b60201c565b62000392565b8151620000df906001906020850190620003e2565b508051620000f5906002906020840190620003e2565b5050600b805460ff191690555083516200011790600d906020870190620003e2565b50600e80546001600160a01b038086166001600160a01b031992831617909255600f805485841690831617905560108054928416929091169190911790556040805161014081018252600160a080830191825283518085018552600c81526b141c995cda59195b9d1a585b60a21b60208281019190915260c085019190915263067486e060e0850152611388610100850152606461012085015291835283518082018552600281528451808601865260088152672234b932b1ba37b960c11b81850152818401526303398020818601526109c4606082810191909152605060808084019190915284860192909252855180840187526003815286518088018852600981526845786563757469766560b81b818701528186015263014b1da0818801526103e8818301526041818401528587015285518084018752600481528651808801885260068152652130b735b2b960d11b818701528186015262a4cb80818801526101f481830152603a8184015281860152855192830186526005808452865180880188526007815266105b985b1e5cdd60ca1b8187015294840194909452625265c09583019590955260fa948201949094526032818501529282019290925260169190915560005b6005811015620003825760008282600581106200030f57634e487b7160e01b600052603260045260246000fd5b6020908102919091015180516000908152601783526040902081518155818301518051929450849391926200034b9260018501920190620003e2565b50604082015160028201556060820151600382015560809091015160049091015550806200037981620005f2565b915050620002e2565b50505050505062000630565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620003f090620005b5565b90600052602060002090601f0160209004810192826200041457600085556200045f565b82601f106200042f57805160ff19168380011785556200045f565b828001600101855582156200045f579182015b828111156200045f57825182559160200191906001019062000442565b506200046d92915062000471565b5090565b5b808211156200046d576000815560010162000472565b80516001600160a01b0381168114620004a057600080fd5b919050565b60008060008060808587031215620004bb578384fd5b84516001600160401b0380821115620004d2578586fd5b818701915087601f830112620004e6578586fd5b815181811115620004fb57620004fb6200061a565b604051601f8201601f19908116603f011681019083821181831017156200052657620005266200061a565b81604052828152602093508a8484870101111562000542578889fd5b8891505b8282101562000565578482018401518183018501529083019062000546565b828211156200057657888484830101525b97506200058891505087820162000488565b945050506200059a6040860162000488565b9150620005aa6060860162000488565b905092959194509250565b600181811c90821680620005ca57607f821691505b60208210811415620005ec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200061357634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b61440d80620006406000396000f3fe6080604052600436106103975760003560e01c80635e1e1004116101dc578063a22cb46511610102578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d48514610ade578063e985e9c514610af3578063f2fde38b14610b3c578063f39e640014610b5c57600080fd5b8063c87b56dd14610a60578063d60f8f3f14610a80578063db1bc87b14610aa0578063dede544f14610ac057600080fd5b8063b47071ca116100dc578063b47071ca146109e6578063b6b8194014610a06578063b88d4fde14610a26578063bc8893b414610a4657600080fd5b8063a22cb46514610986578063a9d75b2b146109a6578063ad2f852a146109c657600080fd5b806370a082311161017a5780638da5cb5b116101495780638da5cb5b146109115780638e70e30a1461092f57806392ed0d1b1461094457806395d89b411461097157600080fd5b806370a082311461089a578063715018a6146108ba57806376772cf8146108cf5780638456cb59146108fc57600080fd5b80636471af83116101b65780636471af8314610811578063649e705f146108335780636bb7b1d9146108645780636d5d40c61461087a57600080fd5b80635e1e1004146107b1578063633423be146107d15780636352211e146107f157600080fd5b80632a55205a116102c157806340445a4f1161025f57806346098ccd1161022e57806346098ccd1461072c5780634f6ccce71461075957806355f804b3146107795780635c975abb1461079957600080fd5b806340445a4f146106a957806342842e0e146106bf57806342966c68146106df5780634369f4e5146106ff57600080fd5b80632f745c591161029b5780632f745c59146106415780633d5d190c146106615780633f4ba83a146106745780633fc15f151461068957600080fd5b80632a55205a146105a45780632a905318146105e35780632ee34d941461061457600080fd5b80630c41f497116103395780631882140011610308578063188214001461050f5780631fb368861461054457806323b872dd1461056457806327ce464e1461058457600080fd5b80630c41f497146104a25780630c894cfe146104b75780630cf51ff2146104cc57806318160ddd146104fa57600080fd5b8063081812fc11610375578063081812fc14610415578063087a9ad21461044d578063095ea7b31461046d5780630c1c972a1461048d57600080fd5b806301ffc9a71461039c57806306d254da146103d157806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613d5e565b610b85565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613b82565b610b96565b005b3480156103ff57600080fd5b50610408610beb565b6040516103c89190614008565b34801561042157600080fd5b50610435610430366004613dc9565b610c7d565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613b82565b610d12565b34801561047957600080fd5b506103f1610488366004613cb8565b610d5e565b34801561049957600080fd5b506103f1610e74565b3480156104ae57600080fd5b506103f1610f3b565b3480156104c357600080fd5b506103f1610fc4565b3480156104d857600080fd5b506104ec6104e7366004613e59565b611033565b6040519081526020016103c8565b34801561050657600080fd5b506009546104ec565b34801561051b57600080fd5b50610408604051806040016040528060098152602001684d756c74694e6f646560b81b81525081565b34801561055057600080fd5b506103f161055f366004613e59565b6111e4565b34801561057057600080fd5b506103f161057f366004613bce565b611220565b34801561059057600080fd5b506103f161059f366004613b82565b611252565b3480156105b057600080fd5b506105c46105bf366004613e59565b61129e565b604080516001600160a01b0390931683526020830191909152016103c8565b3480156105ef57600080fd5b50610408604051806040016040528060058152602001646d4e4f444560d81b81525081565b34801561062057600080fd5b506104ec61062f366004613dc9565b601c6020526000908152604090205481565b34801561064d57600080fd5b506104ec61065c366004613cb8565b6112d3565b6103f161066f366004613ce1565b611369565b34801561068057600080fd5b506103f161187e565b34801561069557600080fd5b50600e54610435906001600160a01b031681565b3480156106b557600080fd5b506104ec60165481565b3480156106cb57600080fd5b506103f16106da366004613bce565b6118b2565b3480156106eb57600080fd5b506103f16106fa366004613dc9565b6118cd565b34801561070b57600080fd5b506104ec61071a366004613dc9565b601a6020526000908152604090205481565b34801561073857600080fd5b506104ec610747366004613dc9565b601b6020526000908152604090205481565b34801561076557600080fd5b506104ec610774366004613dc9565b611947565b34801561078557600080fd5b506103f1610794366004613d96565b6119e8565b3480156107a557600080fd5b50600b5460ff166103bc565b3480156107bd57600080fd5b506103f16107cc366004613b82565b611a29565b3480156107dd57600080fd5b50601154610435906001600160a01b031681565b3480156107fd57600080fd5b5061043561080c366004613dc9565b611a75565b34801561081d57600080fd5b50610826611aec565b6040516103c89190613f74565b34801561083f57600080fd5b5061085361084e366004613dc9565b611cbe565b6040516103c895949392919061412a565b34801561087057600080fd5b506104ec60145481565b34801561088657600080fd5b506103f1610895366004613dc9565b611d75565b3480156108a657600080fd5b506104ec6108b5366004613b82565b611dd2565b3480156108c657600080fd5b506103f1611e59565b3480156108db57600080fd5b506104ec6108ea366004613dc9565b60196020526000908152604090205481565b34801561090857600080fd5b506103f1611e8d565b34801561091d57600080fd5b506000546001600160a01b0316610435565b34801561093b57600080fd5b506104ec611ebf565b34801561095057600080fd5b506104ec61095f366004613dc9565b601d6020526000908152604090205481565b34801561097d57600080fd5b50610408611ee3565b34801561099257600080fd5b506103f16109a1366004613c82565b611ef2565b3480156109b257600080fd5b50600f54610435906001600160a01b031681565b3480156109d257600080fd5b50601254610435906001600160a01b031681565b3480156109f257600080fd5b506103f1610a01366004613df9565b611fb7565b348015610a1257600080fd5b506103f1610a21366004613dc9565b61204e565b348015610a3257600080fd5b506103f1610a41366004613c09565b6120ab565b348015610a5257600080fd5b506015546103bc9060ff1681565b348015610a6c57600080fd5b50610408610a7b366004613dc9565b6120e3565b348015610a8c57600080fd5b50610853610a9b366004613dc9565b612176565b348015610aac57600080fd5b506103f1610abb366004613b82565b612198565b348015610acc57600080fd5b506010546001600160a01b0316610435565b348015610aea57600080fd5b506104086121e4565b348015610aff57600080fd5b506103bc610b0e366004613b9c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b4857600080fd5b506103f1610b57366004613b82565b612212565b348015610b6857600080fd5b50610b7261271081565b60405161ffff90911681526020016103c8565b6000610b90826122aa565b92915050565b6000546001600160a01b03163314610bc95760405162461bcd60e51b8152600401610bc0906140a4565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b606060018054610bfa9061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c269061430d565b8015610c735780601f10610c4857610100808354040283529160200191610c73565b820191906000526020600020905b815481529060010190602001808311610c5657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610cf65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bc0565b506000908152600560205260409020546001600160a01b031690565b6000546001600160a01b03163314610d3c5760405162461bcd60e51b8152600401610bc0906140a4565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d6982611a75565b9050806001600160a01b0316836001600160a01b03161415610dd75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bc0565b336001600160a01b0382161480610df35750610df38133610b0e565b610e655760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bc0565b610e6f83836122cf565b505050565b6000546001600160a01b03163314610e9e5760405162461bcd60e51b8152600401610bc0906140a4565b60155460ff16158015610eb15750601454155b610efd5760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520697320616c7265616479206163746976650000006044820152606401610bc0565b4260148190556015805460ff191660011790556040517fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a2565b6000546001600160a01b03163314610f655760405162461bcd60e51b8152600401610bc0906140a4565b60155460ff16610f875760405162461bcd60e51b8152600401610bc09061406d565b6015805460ff19169055610f99611ebf565b6040517fb94d4ebcdba018821f2c6ae2fb3a03d4023685b1c78faa4fe43dada42890cd2d90600090a2565b6000546001600160a01b03163314610fee5760405162461bcd60e51b8152600401610bc0906140a4565b6015805460ff19811660ff9182161590811790925560405191161515907fafa97d89ca766bd74e787f7998a071ea20f4ddeea353499106df17bc9cf4deb890600090a2565b6000828152601760209081526040808320815160a08101909252805482526001810180548594840191906110669061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546110929061430d565b80156110df5780601f106110b4576101008083540402835291602001916110df565b820191906000526020600020905b8154815290600101906020018083116110c257829003601f168201915b50505091835250506002820154602082015260038201546040820152600490910154606090910152600e549091506001600160a01b031660006111218661233d565b915050600061114d61271061ffff1661114786608001518561272d90919063ffffffff16565b90612740565b90506111d986611147856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561118f57600080fd5b505afa1580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c79190613e7a565b6111d290600a614200565b849061272d565b979650505050505050565b6000546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610bc0906140a4565b6000918252601c602052604090912055565b61122b335b8261274c565b6112475760405162461bcd60e51b8152600401610bc0906140d9565b610e6f838383612843565b6000546001600160a01b0316331461127c5760405162461bcd60e51b8152600401610bc0906140a4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60125460135460009182916001600160a01b03909116906112c8906127109061114790879061272d565b915091509250929050565b60006112de83611dd2565b82106113405760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bc0565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b0316331480611384575060155460ff165b6113a05760405162461bcd60e51b8152600401610bc09061406d565b80518251146114065760405162461bcd60e51b815260206004820152602c60248201527f5469657220616e6420616d6f756e74732070657220746965722073686f756c6460448201526b206265207468652073616d6560a01b6064820152608401610bc0565b60005b8251811015610e6f57600083828151811061143457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061146057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601760008481526020019081526020016000206040518060a0016040529081600082015481526020016001820180546114a49061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546114d09061430d565b801561151d5780601f106114f25761010080835404028352916020019161151d565b820191906000526020600020905b81548152906001019060200180831161150057829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820154815250509050828160000151146115885760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103a34b2b960a11b6044820152606401610bc0565b600082116115d15760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610bc0565b60006115dc33611dd2565b90506000805b828110156117035760006115f633836112d3565b90506000601860008381526020019081526020016000206040518060a0016040529081600082015481526020016001820180546116329061430d565b80601f016020809104026020016040519081016040528092919081815260200182805461165e9061430d565b80156116ab5780601f10611680576101008083540402835291602001916116ab565b820191906000526020600020905b81548152906001019060200180831161168e57829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546060909101528651815191925014156116ee57836116ea81614342565b9450505b505080806116fb90614342565b9150506115e2565b50825161171090856129ee565b60005b8481101561185557611729600c80546001019055565b61173533600c54612f49565b600080611745866000015161233d565b9150915080601b6000611757600c5490565b815260208101919091526040016000205585516117749083611033565b601c6000611781600c5490565b81526020019081526020016000208190555085601860006117a1600c5490565b81526020808201929092526040016000208251815582820151805191926117d0926001850192909101906139d3565b50604082015160028201556060820151600382015560809091015160049091015542601960006117ff600c5490565b8152602080820192909252604090810160009081209390935588518352601d90915290205461182f906001612f63565b86516000908152601d60205260409020555081905061184d81614342565b915050611713565b503415611866576118663334612f6f565b5050505050808061187690614342565b915050611409565b6000546001600160a01b031633146118a85760405162461bcd60e51b8152600401610bc0906140a4565b6118b0613088565b565b610e6f838383604051806020016040528060008152506120ab565b6118d633611225565b61193b5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610bc0565b6119448161311b565b50565b600061195260095490565b82106119b55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bc0565b600982815481106119d657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b03163314611a125760405162461bcd60e51b8152600401610bc0906140a4565b8051611a2590600d9060208401906139d3565b5050565b6000546001600160a01b03163314611a535760405162461bcd60e51b8152600401610bc0906140a4565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260408120546001600160a01b031680610b905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bc0565b6060600060165467ffffffffffffffff811115611b1957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b7c57816020015b611b696040518060a0016040528060008152602001606081526020016000815260200160008152602001600081525090565b815260200190600190039081611b375790505b50905060015b601654611b90906001614191565b811015611cb857601760008281526020019081526020016000206040518060a001604052908160008201548152602001600182018054611bcf9061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfb9061430d565b8015611c485780601f10611c1d57610100808354040283529160200191611c48565b820191906000526020600020905b815481529060010190602001808311611c2b57829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460609091015282611c7c6001846142ca565b81518110611c9a57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611cb090614342565b915050611b82565b50919050565b60186020526000908152604090208054600182018054919291611ce09061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0c9061430d565b8015611d595780601f10611d2e57610100808354040283529160200191611d59565b820191906000526020600020905b815481529060010190602001808311611d3c57829003601f168201915b5050505050908060020154908060030154908060040154905085565b6000546001600160a01b03163314611d9f5760405162461bcd60e51b8152600401610bc0906140a4565b601481905560405181907fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a250565b60006001600160a01b038216611e3d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bc0565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e835760405162461bcd60e51b8152600401610bc0906140a4565b6118b060006131c2565b6000546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610bc0906140a4565b6118b0613212565b60008060145411611ed05750600090565b601454611ede90429061328d565b905090565b606060028054610bfa9061430d565b6001600160a01b038216331415611f4b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bc0565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611fe15760405162461bcd60e51b8152600401610bc0906140a4565b6000858152601760205260409020600281015415801561200357506003810154155b1561201e576016805490600061201883614342565b91905055505b845161203390600183019060208801906139d3565b50600281019390935560038301919091556004909101555050565b6000546001600160a01b031633146120785760405162461bcd60e51b8152600401610bc0906140a4565b601381905560405181907fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c690600090a250565b6120b5338361274c565b6120d15760405162461bcd60e51b8152600401610bc0906140d9565b6120dd84848484613299565b50505050565b6000818152600360205260409020546060906001600160a01b031661213e5760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610bc0565b6121466132cc565b61214f836132db565b604051602001612160929190613ec7565b6040516020818303038152906040529050919050565b60176020526000908152604090208054600182018054919291611ce09061430d565b6000546001600160a01b031633146121c25760405162461bcd60e51b8152600401610bc0906140a4565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606121ee6132cc565b6040516020016121fe9190613f06565b604051602081830303815290604052905090565b6000546001600160a01b0316331461223c5760405162461bcd60e51b8152600401610bc0906140a4565b6001600160a01b0381166122a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bc0565b611944816131c2565b60006001600160e01b0319821663780e9d6360e01b1480610b905750610b90826133f5565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230482611a75565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000601760008581526020019081526020016000206040518060a00160405290816000820154815260200160018201805461237a9061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546123a69061430d565b80156123f35780601f106123c8576101008083540402835291602001916123f3565b820191906000526020600020905b8154815290600101906020018083116123d657829003601f168201915b505050918352505060028201546020808301919091526003830154604080840191909152600493840154606090930192909252600e54600f54835163313ce56760e01b815293519596506001600160a01b03918216959116936000936124c193879363313ce5679383810193829003018186803b15801561247357600080fd5b505afa158015612487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ab9190613e7a565b6124b690600a614200565b60408601519061272d565b9050600061254f836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125399190613e7a565b61254490600a614200565b60608701519061272d565b601054600e54604051632e877e9160e11b81526001600160a01b039182166004820152929350600092911690635d0efd229060240160206040518083038186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d49190613de1565b9050600061267f670de0b6b3a7640000611147612678896001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262357600080fd5b505afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190613e7a565b61266690600a614200565b61114789670de0b6b3a764000061272d565b859061272d565b90508161271d612716876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f99190613e7a565b61270490600a614200565b61114787670de0b6b3a764000061272d565b8390612f63565b9850985050505050505050915091565b600061273982846142ab565b9392505050565b600061273982846141a9565b6000818152600360205260408120546001600160a01b03166127c55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bc0565b60006127d083611a75565b9050806001600160a01b0316846001600160a01b0316148061280b5750836001600160a01b031661280084610c7d565b6001600160a01b0316145b8061283b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661285682611a75565b6001600160a01b0316146128be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bc0565b6001600160a01b0382166129205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bc0565b61292b838383613445565b6129366000826122cf565b6001600160a01b038316600090815260046020526040812080546001929061295f9084906142ca565b90915550506001600160a01b038216600090815260046020526040812080546001929061298d908490614191565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b0316331480612a09575060155460ff165b612a255760405162461bcd60e51b8152600401610bc09061406d565b6000546001600160a01b031633148015612a3e57505050565b6000601760008581526020019081526020016000206040518060a001604052908160008201548152602001600182018054612a789061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa49061430d565b8015612af15780601f10612ac657610100808354040283529160200191612af1565b820191906000526020600020905b815481529060010190602001808311612ad457829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152505090506000600e60009054906101000a90046001600160a01b031690506000600f60009054906101000a90046001600160a01b031690506000612be486612bde856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9057600080fd5b505afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc89190613e7a565b612bd390600a614200565b60408801519061272d565b9061272d565b90506000612c7687612bde856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2857600080fd5b505afa158015612c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c609190613e7a565b612c6b90600a614200565b60608901519061272d565b6040516370a0823160e01b815233600482015290915082906001600160a01b038616906370a082319060240160206040518083038186803b158015612cba57600080fd5b505afa158015612cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf29190613de1565b1015612d4e5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420656e6f756768206d61696e20746f6b656e2062616c616e636520746f604482015264081b5a5b9d60da1b6064820152608401610bc0565b6040516370a0823160e01b815233600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015612d8f57600080fd5b505afa158015612da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc79190613de1565b1015612e255760405162461bcd60e51b815260206004820152602760248201527f6e6f7420656e6f75676820737461626c6520746f6b656e2062616c616e6365206044820152661d1bc81b5a5b9d60ca1b6064820152608401610bc0565b6011546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101849052908516906323b872dd90606401602060405180830381600087803b158015612e7957600080fd5b505af1158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb19190613d42565b506011546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908416906323b872dd90606401602060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3e9190613d42565b505050505050505050565b611a25828260405180602001604052806000815250613461565b60006127398284614191565b80471015612fbf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bc0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461300c576040519150601f19603f3d011682016040523d82523d6000602084013e613011565b606091505b5050905080610e6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bc0565b600b5460ff166130d15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bc0565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061312682611a75565b905061313481600084613445565b61313f6000836122cf565b6001600160a01b03811660009081526004602052604081208054600192906131689084906142ca565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156132585760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bc0565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130fe3390565b600061273982846142ca565b6132a4848484612843565b6132b084848484613494565b6120dd5760405162461bcd60e51b8152600401610bc09061401b565b6060600d8054610bfa9061430d565b6060816132ff5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613329578061331381614342565b91506133229050600a836141a9565b9150613303565b60008167ffffffffffffffff81111561335257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561337c576020820181803683370190505b5090505b841561283b576133916001836142ca565b915061339e600a8661435d565b6133a9906030614191565b60f81b8183815181106133cc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506133ee600a866141a9565b9450613380565b60006001600160e01b031982166380ac58cd60e01b148061342657506001600160e01b03198216635b5e139f60e01b145b80610b9057506301ffc9a760e01b6001600160e01b0319831614610b90565b6000818152601a60205260409020429055610e6f8383836135a1565b61346b8383613613565b6134786000848484613494565b610e6f5760405162461bcd60e51b8152600401610bc09061401b565b60006001600160a01b0384163b1561359657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134d8903390899088908890600401613f37565b602060405180830381600087803b1580156134f257600080fd5b505af1925050508015613522575060408051601f3d908101601f1916820190925261351f91810190613d7a565b60015b61357c573d808015613550576040519150601f19603f3d011682016040523d82523d6000602084013e613555565b606091505b5080516135745760405162461bcd60e51b8152600401610bc09061401b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061283b565b506001949350505050565b6135ac838383613761565b600b5460ff1615610e6f5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610bc0565b6001600160a01b0382166136695760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bc0565b6000818152600360205260409020546001600160a01b0316156136ce5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bc0565b6136da60008383613445565b6001600160a01b0382166000908152600460205260408120805460019290613703908490614191565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137bc576137b781600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6137df565b816001600160a01b0316836001600160a01b0316146137df576137df8382613819565b6001600160a01b0382166137f657610e6f816138b6565b826001600160a01b0316826001600160a01b031614610e6f57610e6f828261398f565b6000600161382684611dd2565b61383091906142ca565b600083815260086020526040902054909150808214613883576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906138c8906001906142ca565b6000838152600a6020526040812054600980549394509092849081106138fe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806009838154811061392d57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061397357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061399a83611dd2565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b8280546139df9061430d565b90600052602060002090601f016020900481019282613a015760008555613a47565b82601f10613a1a57805160ff1916838001178555613a47565b82800160010185558215613a47579182015b82811115613a47578251825591602001919060010190613a2c565b50613a53929150613a57565b5090565b5b80821115613a535760008155600101613a58565b600067ffffffffffffffff831115613a8657613a8661439d565b613a99601f8401601f1916602001614160565b9050828152838383011115613aad57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613adb57600080fd5b919050565b600082601f830112613af0578081fd5b8135602067ffffffffffffffff821115613b0c57613b0c61439d565b8160051b613b1b828201614160565b838152828101908684018388018501891015613b35578687fd5b8693505b85841015613b57578035835260019390930192918401918401613b39565b50979650505050505050565b600082601f830112613b73578081fd5b61273983833560208501613a6c565b600060208284031215613b93578081fd5b61273982613ac4565b60008060408385031215613bae578081fd5b613bb783613ac4565b9150613bc560208401613ac4565b90509250929050565b600080600060608486031215613be2578081fd5b613beb84613ac4565b9250613bf960208501613ac4565b9150604084013590509250925092565b60008060008060808587031215613c1e578081fd5b613c2785613ac4565b9350613c3560208601613ac4565b925060408501359150606085013567ffffffffffffffff811115613c57578182fd5b8501601f81018713613c67578182fd5b613c7687823560208401613a6c565b91505092959194509250565b60008060408385031215613c94578182fd5b613c9d83613ac4565b91506020830135613cad816143b3565b809150509250929050565b60008060408385031215613cca578182fd5b613cd383613ac4565b946020939093013593505050565b60008060408385031215613cf3578182fd5b823567ffffffffffffffff80821115613d0a578384fd5b613d1686838701613ae0565b93506020850135915080821115613d2b578283fd5b50613d3885828601613ae0565b9150509250929050565b600060208284031215613d53578081fd5b8151612739816143b3565b600060208284031215613d6f578081fd5b8135612739816143c1565b600060208284031215613d8b578081fd5b8151612739816143c1565b600060208284031215613da7578081fd5b813567ffffffffffffffff811115613dbd578182fd5b61283b84828501613b63565b600060208284031215613dda578081fd5b5035919050565b600060208284031215613df2578081fd5b5051919050565b600080600080600060a08688031215613e10578283fd5b85359450602086013567ffffffffffffffff811115613e2d578384fd5b613e3988828901613b63565b959895975050505060408401359360608101359360809091013592509050565b60008060408385031215613e6b578182fd5b50508035926020909101359150565b600060208284031215613e8b578081fd5b815160ff81168114612739578182fd5b60008151808452613eb38160208601602086016142e1565b601f01601f19169290920160200192915050565b60008351613ed98184602088016142e1565b835190830190613eed8183602088016142e1565b64173539b7b760d91b9101908152600501949350505050565b60008251613f188184602087016142e1565b6c31b7b73a3930b1ba173539b7b760991b920191825250600d01919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f6a90830184613e9b565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b83811015613ffa57603f19898403018552815160a08151855288820151818a870152613fc882870182613e9b565b838a0151878b015260608085015190880152608093840151939096019290925250509386019390860190600101613f9a565b509098975050505050505050565b6020815260006127396020830184613e9b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b85815260a06020820152600061414360a0830187613e9b565b604083019590955250606081019290925260809091015292915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156141895761418961439d565b604052919050565b600082198211156141a4576141a4614371565b500190565b6000826141b8576141b8614387565b500490565b600181815b808511156141f85781600019048211156141de576141de614371565b808516156141eb57918102915b93841c93908002906141c2565b509250929050565b600061273960ff84168360008261421957506001610b90565b8161422657506000610b90565b816001811461423c576002811461424657614262565b6001915050610b90565b60ff84111561425757614257614371565b50506001821b610b90565b5060208310610133831016604e8410600b8410161715614285575081810a610b90565b61428f83836141bd565b80600019048211156142a3576142a3614371565b029392505050565b60008160001904831182151516156142c5576142c5614371565b500290565b6000828210156142dc576142dc614371565b500390565b60005b838110156142fc5781810151838201526020016142e4565b838111156120dd5750506000910152565b600181811c9082168061432157607f821691505b60208210811415611cb857634e487b7160e01b600052602260045260246000fd5b600060001982141561435657614356614371565b5060010190565b60008261436c5761436c614387565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461194457600080fd5b6001600160e01b03198116811461194457600080fdfea26469706673582212208bf7b9fa464783b64ef4d14d3e6966664f68558f427a79af8f2327e11682138b64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c146b7cdbaff065090077151d391f4c96aa09e0c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000738f7a7d2f7af556321fae259b37d49034827e09000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f6e66746170692e6d636861696e2e6361706974616c2f6d657461646174612f6574682f000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103975760003560e01c80635e1e1004116101dc578063a22cb46511610102578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d48514610ade578063e985e9c514610af3578063f2fde38b14610b3c578063f39e640014610b5c57600080fd5b8063c87b56dd14610a60578063d60f8f3f14610a80578063db1bc87b14610aa0578063dede544f14610ac057600080fd5b8063b47071ca116100dc578063b47071ca146109e6578063b6b8194014610a06578063b88d4fde14610a26578063bc8893b414610a4657600080fd5b8063a22cb46514610986578063a9d75b2b146109a6578063ad2f852a146109c657600080fd5b806370a082311161017a5780638da5cb5b116101495780638da5cb5b146109115780638e70e30a1461092f57806392ed0d1b1461094457806395d89b411461097157600080fd5b806370a082311461089a578063715018a6146108ba57806376772cf8146108cf5780638456cb59146108fc57600080fd5b80636471af83116101b65780636471af8314610811578063649e705f146108335780636bb7b1d9146108645780636d5d40c61461087a57600080fd5b80635e1e1004146107b1578063633423be146107d15780636352211e146107f157600080fd5b80632a55205a116102c157806340445a4f1161025f57806346098ccd1161022e57806346098ccd1461072c5780634f6ccce71461075957806355f804b3146107795780635c975abb1461079957600080fd5b806340445a4f146106a957806342842e0e146106bf57806342966c68146106df5780634369f4e5146106ff57600080fd5b80632f745c591161029b5780632f745c59146106415780633d5d190c146106615780633f4ba83a146106745780633fc15f151461068957600080fd5b80632a55205a146105a45780632a905318146105e35780632ee34d941461061457600080fd5b80630c41f497116103395780631882140011610308578063188214001461050f5780631fb368861461054457806323b872dd1461056457806327ce464e1461058457600080fd5b80630c41f497146104a25780630c894cfe146104b75780630cf51ff2146104cc57806318160ddd146104fa57600080fd5b8063081812fc11610375578063081812fc14610415578063087a9ad21461044d578063095ea7b31461046d5780630c1c972a1461048d57600080fd5b806301ffc9a71461039c57806306d254da146103d157806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613d5e565b610b85565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613b82565b610b96565b005b3480156103ff57600080fd5b50610408610beb565b6040516103c89190614008565b34801561042157600080fd5b50610435610430366004613dc9565b610c7d565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613b82565b610d12565b34801561047957600080fd5b506103f1610488366004613cb8565b610d5e565b34801561049957600080fd5b506103f1610e74565b3480156104ae57600080fd5b506103f1610f3b565b3480156104c357600080fd5b506103f1610fc4565b3480156104d857600080fd5b506104ec6104e7366004613e59565b611033565b6040519081526020016103c8565b34801561050657600080fd5b506009546104ec565b34801561051b57600080fd5b50610408604051806040016040528060098152602001684d756c74694e6f646560b81b81525081565b34801561055057600080fd5b506103f161055f366004613e59565b6111e4565b34801561057057600080fd5b506103f161057f366004613bce565b611220565b34801561059057600080fd5b506103f161059f366004613b82565b611252565b3480156105b057600080fd5b506105c46105bf366004613e59565b61129e565b604080516001600160a01b0390931683526020830191909152016103c8565b3480156105ef57600080fd5b50610408604051806040016040528060058152602001646d4e4f444560d81b81525081565b34801561062057600080fd5b506104ec61062f366004613dc9565b601c6020526000908152604090205481565b34801561064d57600080fd5b506104ec61065c366004613cb8565b6112d3565b6103f161066f366004613ce1565b611369565b34801561068057600080fd5b506103f161187e565b34801561069557600080fd5b50600e54610435906001600160a01b031681565b3480156106b557600080fd5b506104ec60165481565b3480156106cb57600080fd5b506103f16106da366004613bce565b6118b2565b3480156106eb57600080fd5b506103f16106fa366004613dc9565b6118cd565b34801561070b57600080fd5b506104ec61071a366004613dc9565b601a6020526000908152604090205481565b34801561073857600080fd5b506104ec610747366004613dc9565b601b6020526000908152604090205481565b34801561076557600080fd5b506104ec610774366004613dc9565b611947565b34801561078557600080fd5b506103f1610794366004613d96565b6119e8565b3480156107a557600080fd5b50600b5460ff166103bc565b3480156107bd57600080fd5b506103f16107cc366004613b82565b611a29565b3480156107dd57600080fd5b50601154610435906001600160a01b031681565b3480156107fd57600080fd5b5061043561080c366004613dc9565b611a75565b34801561081d57600080fd5b50610826611aec565b6040516103c89190613f74565b34801561083f57600080fd5b5061085361084e366004613dc9565b611cbe565b6040516103c895949392919061412a565b34801561087057600080fd5b506104ec60145481565b34801561088657600080fd5b506103f1610895366004613dc9565b611d75565b3480156108a657600080fd5b506104ec6108b5366004613b82565b611dd2565b3480156108c657600080fd5b506103f1611e59565b3480156108db57600080fd5b506104ec6108ea366004613dc9565b60196020526000908152604090205481565b34801561090857600080fd5b506103f1611e8d565b34801561091d57600080fd5b506000546001600160a01b0316610435565b34801561093b57600080fd5b506104ec611ebf565b34801561095057600080fd5b506104ec61095f366004613dc9565b601d6020526000908152604090205481565b34801561097d57600080fd5b50610408611ee3565b34801561099257600080fd5b506103f16109a1366004613c82565b611ef2565b3480156109b257600080fd5b50600f54610435906001600160a01b031681565b3480156109d257600080fd5b50601254610435906001600160a01b031681565b3480156109f257600080fd5b506103f1610a01366004613df9565b611fb7565b348015610a1257600080fd5b506103f1610a21366004613dc9565b61204e565b348015610a3257600080fd5b506103f1610a41366004613c09565b6120ab565b348015610a5257600080fd5b506015546103bc9060ff1681565b348015610a6c57600080fd5b50610408610a7b366004613dc9565b6120e3565b348015610a8c57600080fd5b50610853610a9b366004613dc9565b612176565b348015610aac57600080fd5b506103f1610abb366004613b82565b612198565b348015610acc57600080fd5b506010546001600160a01b0316610435565b348015610aea57600080fd5b506104086121e4565b348015610aff57600080fd5b506103bc610b0e366004613b9c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b4857600080fd5b506103f1610b57366004613b82565b612212565b348015610b6857600080fd5b50610b7261271081565b60405161ffff90911681526020016103c8565b6000610b90826122aa565b92915050565b6000546001600160a01b03163314610bc95760405162461bcd60e51b8152600401610bc0906140a4565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b606060018054610bfa9061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c269061430d565b8015610c735780601f10610c4857610100808354040283529160200191610c73565b820191906000526020600020905b815481529060010190602001808311610c5657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610cf65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bc0565b506000908152600560205260409020546001600160a01b031690565b6000546001600160a01b03163314610d3c5760405162461bcd60e51b8152600401610bc0906140a4565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d6982611a75565b9050806001600160a01b0316836001600160a01b03161415610dd75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bc0565b336001600160a01b0382161480610df35750610df38133610b0e565b610e655760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bc0565b610e6f83836122cf565b505050565b6000546001600160a01b03163314610e9e5760405162461bcd60e51b8152600401610bc0906140a4565b60155460ff16158015610eb15750601454155b610efd5760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520697320616c7265616479206163746976650000006044820152606401610bc0565b4260148190556015805460ff191660011790556040517fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a2565b6000546001600160a01b03163314610f655760405162461bcd60e51b8152600401610bc0906140a4565b60155460ff16610f875760405162461bcd60e51b8152600401610bc09061406d565b6015805460ff19169055610f99611ebf565b6040517fb94d4ebcdba018821f2c6ae2fb3a03d4023685b1c78faa4fe43dada42890cd2d90600090a2565b6000546001600160a01b03163314610fee5760405162461bcd60e51b8152600401610bc0906140a4565b6015805460ff19811660ff9182161590811790925560405191161515907fafa97d89ca766bd74e787f7998a071ea20f4ddeea353499106df17bc9cf4deb890600090a2565b6000828152601760209081526040808320815160a08101909252805482526001810180548594840191906110669061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546110929061430d565b80156110df5780601f106110b4576101008083540402835291602001916110df565b820191906000526020600020905b8154815290600101906020018083116110c257829003601f168201915b50505091835250506002820154602082015260038201546040820152600490910154606090910152600e549091506001600160a01b031660006111218661233d565b915050600061114d61271061ffff1661114786608001518561272d90919063ffffffff16565b90612740565b90506111d986611147856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561118f57600080fd5b505afa1580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c79190613e7a565b6111d290600a614200565b849061272d565b979650505050505050565b6000546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610bc0906140a4565b6000918252601c602052604090912055565b61122b335b8261274c565b6112475760405162461bcd60e51b8152600401610bc0906140d9565b610e6f838383612843565b6000546001600160a01b0316331461127c5760405162461bcd60e51b8152600401610bc0906140a4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60125460135460009182916001600160a01b03909116906112c8906127109061114790879061272d565b915091509250929050565b60006112de83611dd2565b82106113405760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bc0565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b0316331480611384575060155460ff165b6113a05760405162461bcd60e51b8152600401610bc09061406d565b80518251146114065760405162461bcd60e51b815260206004820152602c60248201527f5469657220616e6420616d6f756e74732070657220746965722073686f756c6460448201526b206265207468652073616d6560a01b6064820152608401610bc0565b60005b8251811015610e6f57600083828151811061143457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061146057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601760008481526020019081526020016000206040518060a0016040529081600082015481526020016001820180546114a49061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546114d09061430d565b801561151d5780601f106114f25761010080835404028352916020019161151d565b820191906000526020600020905b81548152906001019060200180831161150057829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820154815250509050828160000151146115885760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103a34b2b960a11b6044820152606401610bc0565b600082116115d15760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610bc0565b60006115dc33611dd2565b90506000805b828110156117035760006115f633836112d3565b90506000601860008381526020019081526020016000206040518060a0016040529081600082015481526020016001820180546116329061430d565b80601f016020809104026020016040519081016040528092919081815260200182805461165e9061430d565b80156116ab5780601f10611680576101008083540402835291602001916116ab565b820191906000526020600020905b81548152906001019060200180831161168e57829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546060909101528651815191925014156116ee57836116ea81614342565b9450505b505080806116fb90614342565b9150506115e2565b50825161171090856129ee565b60005b8481101561185557611729600c80546001019055565b61173533600c54612f49565b600080611745866000015161233d565b9150915080601b6000611757600c5490565b815260208101919091526040016000205585516117749083611033565b601c6000611781600c5490565b81526020019081526020016000208190555085601860006117a1600c5490565b81526020808201929092526040016000208251815582820151805191926117d0926001850192909101906139d3565b50604082015160028201556060820151600382015560809091015160049091015542601960006117ff600c5490565b8152602080820192909252604090810160009081209390935588518352601d90915290205461182f906001612f63565b86516000908152601d60205260409020555081905061184d81614342565b915050611713565b503415611866576118663334612f6f565b5050505050808061187690614342565b915050611409565b6000546001600160a01b031633146118a85760405162461bcd60e51b8152600401610bc0906140a4565b6118b0613088565b565b610e6f838383604051806020016040528060008152506120ab565b6118d633611225565b61193b5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610bc0565b6119448161311b565b50565b600061195260095490565b82106119b55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bc0565b600982815481106119d657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b03163314611a125760405162461bcd60e51b8152600401610bc0906140a4565b8051611a2590600d9060208401906139d3565b5050565b6000546001600160a01b03163314611a535760405162461bcd60e51b8152600401610bc0906140a4565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260408120546001600160a01b031680610b905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bc0565b6060600060165467ffffffffffffffff811115611b1957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b7c57816020015b611b696040518060a0016040528060008152602001606081526020016000815260200160008152602001600081525090565b815260200190600190039081611b375790505b50905060015b601654611b90906001614191565b811015611cb857601760008281526020019081526020016000206040518060a001604052908160008201548152602001600182018054611bcf9061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfb9061430d565b8015611c485780601f10611c1d57610100808354040283529160200191611c48565b820191906000526020600020905b815481529060010190602001808311611c2b57829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460609091015282611c7c6001846142ca565b81518110611c9a57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611cb090614342565b915050611b82565b50919050565b60186020526000908152604090208054600182018054919291611ce09061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0c9061430d565b8015611d595780601f10611d2e57610100808354040283529160200191611d59565b820191906000526020600020905b815481529060010190602001808311611d3c57829003601f168201915b5050505050908060020154908060030154908060040154905085565b6000546001600160a01b03163314611d9f5760405162461bcd60e51b8152600401610bc0906140a4565b601481905560405181907fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a250565b60006001600160a01b038216611e3d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bc0565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e835760405162461bcd60e51b8152600401610bc0906140a4565b6118b060006131c2565b6000546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610bc0906140a4565b6118b0613212565b60008060145411611ed05750600090565b601454611ede90429061328d565b905090565b606060028054610bfa9061430d565b6001600160a01b038216331415611f4b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bc0565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611fe15760405162461bcd60e51b8152600401610bc0906140a4565b6000858152601760205260409020600281015415801561200357506003810154155b1561201e576016805490600061201883614342565b91905055505b845161203390600183019060208801906139d3565b50600281019390935560038301919091556004909101555050565b6000546001600160a01b031633146120785760405162461bcd60e51b8152600401610bc0906140a4565b601381905560405181907fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c690600090a250565b6120b5338361274c565b6120d15760405162461bcd60e51b8152600401610bc0906140d9565b6120dd84848484613299565b50505050565b6000818152600360205260409020546060906001600160a01b031661213e5760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610bc0565b6121466132cc565b61214f836132db565b604051602001612160929190613ec7565b6040516020818303038152906040529050919050565b60176020526000908152604090208054600182018054919291611ce09061430d565b6000546001600160a01b031633146121c25760405162461bcd60e51b8152600401610bc0906140a4565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606121ee6132cc565b6040516020016121fe9190613f06565b604051602081830303815290604052905090565b6000546001600160a01b0316331461223c5760405162461bcd60e51b8152600401610bc0906140a4565b6001600160a01b0381166122a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bc0565b611944816131c2565b60006001600160e01b0319821663780e9d6360e01b1480610b905750610b90826133f5565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230482611a75565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000601760008581526020019081526020016000206040518060a00160405290816000820154815260200160018201805461237a9061430d565b80601f01602080910402602001604051908101604052809291908181526020018280546123a69061430d565b80156123f35780601f106123c8576101008083540402835291602001916123f3565b820191906000526020600020905b8154815290600101906020018083116123d657829003601f168201915b505050918352505060028201546020808301919091526003830154604080840191909152600493840154606090930192909252600e54600f54835163313ce56760e01b815293519596506001600160a01b03918216959116936000936124c193879363313ce5679383810193829003018186803b15801561247357600080fd5b505afa158015612487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ab9190613e7a565b6124b690600a614200565b60408601519061272d565b9050600061254f836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125399190613e7a565b61254490600a614200565b60608701519061272d565b601054600e54604051632e877e9160e11b81526001600160a01b039182166004820152929350600092911690635d0efd229060240160206040518083038186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d49190613de1565b9050600061267f670de0b6b3a7640000611147612678896001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262357600080fd5b505afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190613e7a565b61266690600a614200565b61114789670de0b6b3a764000061272d565b859061272d565b90508161271d612716876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f99190613e7a565b61270490600a614200565b61114787670de0b6b3a764000061272d565b8390612f63565b9850985050505050505050915091565b600061273982846142ab565b9392505050565b600061273982846141a9565b6000818152600360205260408120546001600160a01b03166127c55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bc0565b60006127d083611a75565b9050806001600160a01b0316846001600160a01b0316148061280b5750836001600160a01b031661280084610c7d565b6001600160a01b0316145b8061283b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661285682611a75565b6001600160a01b0316146128be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bc0565b6001600160a01b0382166129205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bc0565b61292b838383613445565b6129366000826122cf565b6001600160a01b038316600090815260046020526040812080546001929061295f9084906142ca565b90915550506001600160a01b038216600090815260046020526040812080546001929061298d908490614191565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b0316331480612a09575060155460ff165b612a255760405162461bcd60e51b8152600401610bc09061406d565b6000546001600160a01b031633148015612a3e57505050565b6000601760008581526020019081526020016000206040518060a001604052908160008201548152602001600182018054612a789061430d565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa49061430d565b8015612af15780601f10612ac657610100808354040283529160200191612af1565b820191906000526020600020905b815481529060010190602001808311612ad457829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152505090506000600e60009054906101000a90046001600160a01b031690506000600f60009054906101000a90046001600160a01b031690506000612be486612bde856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9057600080fd5b505afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc89190613e7a565b612bd390600a614200565b60408801519061272d565b9061272d565b90506000612c7687612bde856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2857600080fd5b505afa158015612c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c609190613e7a565b612c6b90600a614200565b60608901519061272d565b6040516370a0823160e01b815233600482015290915082906001600160a01b038616906370a082319060240160206040518083038186803b158015612cba57600080fd5b505afa158015612cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf29190613de1565b1015612d4e5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420656e6f756768206d61696e20746f6b656e2062616c616e636520746f604482015264081b5a5b9d60da1b6064820152608401610bc0565b6040516370a0823160e01b815233600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015612d8f57600080fd5b505afa158015612da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc79190613de1565b1015612e255760405162461bcd60e51b815260206004820152602760248201527f6e6f7420656e6f75676820737461626c6520746f6b656e2062616c616e6365206044820152661d1bc81b5a5b9d60ca1b6064820152608401610bc0565b6011546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101849052908516906323b872dd90606401602060405180830381600087803b158015612e7957600080fd5b505af1158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb19190613d42565b506011546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908416906323b872dd90606401602060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3e9190613d42565b505050505050505050565b611a25828260405180602001604052806000815250613461565b60006127398284614191565b80471015612fbf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bc0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461300c576040519150601f19603f3d011682016040523d82523d6000602084013e613011565b606091505b5050905080610e6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bc0565b600b5460ff166130d15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bc0565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061312682611a75565b905061313481600084613445565b61313f6000836122cf565b6001600160a01b03811660009081526004602052604081208054600192906131689084906142ca565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156132585760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bc0565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130fe3390565b600061273982846142ca565b6132a4848484612843565b6132b084848484613494565b6120dd5760405162461bcd60e51b8152600401610bc09061401b565b6060600d8054610bfa9061430d565b6060816132ff5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613329578061331381614342565b91506133229050600a836141a9565b9150613303565b60008167ffffffffffffffff81111561335257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561337c576020820181803683370190505b5090505b841561283b576133916001836142ca565b915061339e600a8661435d565b6133a9906030614191565b60f81b8183815181106133cc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506133ee600a866141a9565b9450613380565b60006001600160e01b031982166380ac58cd60e01b148061342657506001600160e01b03198216635b5e139f60e01b145b80610b9057506301ffc9a760e01b6001600160e01b0319831614610b90565b6000818152601a60205260409020429055610e6f8383836135a1565b61346b8383613613565b6134786000848484613494565b610e6f5760405162461bcd60e51b8152600401610bc09061401b565b60006001600160a01b0384163b1561359657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134d8903390899088908890600401613f37565b602060405180830381600087803b1580156134f257600080fd5b505af1925050508015613522575060408051601f3d908101601f1916820190925261351f91810190613d7a565b60015b61357c573d808015613550576040519150601f19603f3d011682016040523d82523d6000602084013e613555565b606091505b5080516135745760405162461bcd60e51b8152600401610bc09061401b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061283b565b506001949350505050565b6135ac838383613761565b600b5460ff1615610e6f5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610bc0565b6001600160a01b0382166136695760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bc0565b6000818152600360205260409020546001600160a01b0316156136ce5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bc0565b6136da60008383613445565b6001600160a01b0382166000908152600460205260408120805460019290613703908490614191565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137bc576137b781600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6137df565b816001600160a01b0316836001600160a01b0316146137df576137df8382613819565b6001600160a01b0382166137f657610e6f816138b6565b826001600160a01b0316826001600160a01b031614610e6f57610e6f828261398f565b6000600161382684611dd2565b61383091906142ca565b600083815260086020526040902054909150808214613883576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906138c8906001906142ca565b6000838152600a6020526040812054600980549394509092849081106138fe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806009838154811061392d57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061397357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061399a83611dd2565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b8280546139df9061430d565b90600052602060002090601f016020900481019282613a015760008555613a47565b82601f10613a1a57805160ff1916838001178555613a47565b82800160010185558215613a47579182015b82811115613a47578251825591602001919060010190613a2c565b50613a53929150613a57565b5090565b5b80821115613a535760008155600101613a58565b600067ffffffffffffffff831115613a8657613a8661439d565b613a99601f8401601f1916602001614160565b9050828152838383011115613aad57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613adb57600080fd5b919050565b600082601f830112613af0578081fd5b8135602067ffffffffffffffff821115613b0c57613b0c61439d565b8160051b613b1b828201614160565b838152828101908684018388018501891015613b35578687fd5b8693505b85841015613b57578035835260019390930192918401918401613b39565b50979650505050505050565b600082601f830112613b73578081fd5b61273983833560208501613a6c565b600060208284031215613b93578081fd5b61273982613ac4565b60008060408385031215613bae578081fd5b613bb783613ac4565b9150613bc560208401613ac4565b90509250929050565b600080600060608486031215613be2578081fd5b613beb84613ac4565b9250613bf960208501613ac4565b9150604084013590509250925092565b60008060008060808587031215613c1e578081fd5b613c2785613ac4565b9350613c3560208601613ac4565b925060408501359150606085013567ffffffffffffffff811115613c57578182fd5b8501601f81018713613c67578182fd5b613c7687823560208401613a6c565b91505092959194509250565b60008060408385031215613c94578182fd5b613c9d83613ac4565b91506020830135613cad816143b3565b809150509250929050565b60008060408385031215613cca578182fd5b613cd383613ac4565b946020939093013593505050565b60008060408385031215613cf3578182fd5b823567ffffffffffffffff80821115613d0a578384fd5b613d1686838701613ae0565b93506020850135915080821115613d2b578283fd5b50613d3885828601613ae0565b9150509250929050565b600060208284031215613d53578081fd5b8151612739816143b3565b600060208284031215613d6f578081fd5b8135612739816143c1565b600060208284031215613d8b578081fd5b8151612739816143c1565b600060208284031215613da7578081fd5b813567ffffffffffffffff811115613dbd578182fd5b61283b84828501613b63565b600060208284031215613dda578081fd5b5035919050565b600060208284031215613df2578081fd5b5051919050565b600080600080600060a08688031215613e10578283fd5b85359450602086013567ffffffffffffffff811115613e2d578384fd5b613e3988828901613b63565b959895975050505060408401359360608101359360809091013592509050565b60008060408385031215613e6b578182fd5b50508035926020909101359150565b600060208284031215613e8b578081fd5b815160ff81168114612739578182fd5b60008151808452613eb38160208601602086016142e1565b601f01601f19169290920160200192915050565b60008351613ed98184602088016142e1565b835190830190613eed8183602088016142e1565b64173539b7b760d91b9101908152600501949350505050565b60008251613f188184602087016142e1565b6c31b7b73a3930b1ba173539b7b760991b920191825250600d01919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f6a90830184613e9b565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b83811015613ffa57603f19898403018552815160a08151855288820151818a870152613fc882870182613e9b565b838a0151878b015260608085015190880152608093840151939096019290925250509386019390860190600101613f9a565b509098975050505050505050565b6020815260006127396020830184613e9b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b85815260a06020820152600061414360a0830187613e9b565b604083019590955250606081019290925260809091015292915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156141895761418961439d565b604052919050565b600082198211156141a4576141a4614371565b500190565b6000826141b8576141b8614387565b500490565b600181815b808511156141f85781600019048211156141de576141de614371565b808516156141eb57918102915b93841c93908002906141c2565b509250929050565b600061273960ff84168360008261421957506001610b90565b8161422657506000610b90565b816001811461423c576002811461424657614262565b6001915050610b90565b60ff84111561425757614257614371565b50506001821b610b90565b5060208310610133831016604e8410600b8410161715614285575081810a610b90565b61428f83836141bd565b80600019048211156142a3576142a3614371565b029392505050565b60008160001904831182151516156142c5576142c5614371565b500290565b6000828210156142dc576142dc614371565b500390565b60005b838110156142fc5781810151838201526020016142e4565b838111156120dd5750506000910152565b600181811c9082168061432157607f821691505b60208210811415611cb857634e487b7160e01b600052602260045260246000fd5b600060001982141561435657614356614371565b5060010190565b60008261436c5761436c614387565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461194457600080fd5b6001600160e01b03198116811461194457600080fdfea26469706673582212208bf7b9fa464783b64ef4d14d3e6966664f68558f427a79af8f2327e11682138b64736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c146b7cdbaff065090077151d391f4c96aa09e0c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000738f7a7d2f7af556321fae259b37d49034827e09000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f6e66746170692e6d636861696e2e6361706974616c2f6d657461646174612f6574682f000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://nftapi.mchain.capital/metadata/eth/
Arg [1] : _mainToken (address): 0xC146B7CdBaff065090077151d391f4c96Aa09e0C
Arg [2] : _stableToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : _dexUtils (address): 0x738f7a7D2F7aF556321fae259b37d49034827E09

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000c146b7cdbaff065090077151d391f4c96aa09e0c
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 000000000000000000000000738f7a7d2f7af556321fae259b37d49034827e09
Arg [4] : 000000000000000000000000000000000000000000000000000000000000002b
Arg [5] : 68747470733a2f2f6e66746170692e6d636861696e2e6361706974616c2f6d65
Arg [6] : 7461646174612f6574682f000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59203:13582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71727:212;;;;;;;;;;-1:-1:-1;71727:212:0;;;;;:::i;:::-;;:::i;:::-;;;11447:14:1;;11440:22;11422:41;;11410:2;11395:18;71727:212:0;;;;;;;;68470:102;;;;;;;;;;-1:-1:-1;68470:102:0;;;;;:::i;:::-;;:::i;:::-;;25019:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26578:221::-;;;;;;;;;;-1:-1:-1;26578:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8776:32:1;;;8758:51;;8746:2;8731:18;26578:221:0;8713:102:1;69105:103:0;;;;;;;;;;-1:-1:-1;69105:103:0;;;;;:::i;:::-;;:::i;26101:411::-;;;;;;;;;;-1:-1:-1;26101:411:0;;;;;:::i;:::-;;:::i;63378:198::-;;;;;;;;;;;;;:::i;64258:154::-;;;;;;;;;;;;;:::i;64080:148::-;;;;;;;;;;;;;:::i;69891:482::-;;;;;;;;;;-1:-1:-1;69891:482:0;;;;;:::i;:::-;;:::i;:::-;;;24113:25:1;;;24101:2;24086:18;69891:482:0;24068:76:1;39483:113:0;;;;;;;;;;-1:-1:-1;39571:10:0;:17;39483:113;;60356:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60356:47:0;;;;;69740:145;;;;;;;;;;-1:-1:-1;69740:145:0;;;;;:::i;:::-;;:::i;27468:339::-;;;;;;;;;;-1:-1:-1;27468:339:0;;;;;:::i;:::-;;:::i;68578:96::-;;;;;;;;;;-1:-1:-1;68578:96:0;;;;;:::i;:::-;;:::i;64756:252::-;;;;;;;;;;-1:-1:-1;64756:252:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9885:32:1;;;9867:51;;9949:2;9934:18;;9927:34;;;;9840:18;64756:252:0;9822:145:1;60408:45:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60408:45:0;;;;;60876:61;;;;;;;;;;-1:-1:-1;60876:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;39151:256;;;;;;;;;;-1:-1:-1;39151:256:0;;;;;:::i;:::-;;:::i;65281:2070::-;;;;;;:::i;:::-;;:::i;72128:67::-;;;;;;;;;;;;;:::i;59884:33::-;;;;;;;;;;-1:-1:-1;59884:33:0;;;;-1:-1:-1;;;;;59884:33:0;;;60559:23;;;;;;;;;;;;;;;;27878:185;;;;;;;;;;-1:-1:-1;27878:185:0;;;;;:::i;:::-;;:::i;36662:245::-;;;;;;;;;;-1:-1:-1;36662:245:0;;;;;:::i;:::-;;:::i;60742:66::-;;;;;;;;;;-1:-1:-1;60742:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;60813:58;;;;;;;;;;-1:-1:-1;60813:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;39673:233;;;;;;;;;;-1:-1:-1;39673:233:0;;;;;:::i;:::-;;:::i;69008:91::-;;;;;;;;;;-1:-1:-1;69008:91:0;;;;;:::i;:::-;;:::i;46067:86::-;;;;;;;;;;-1:-1:-1;46138:7:0;;;;46067:86;;68329:102;;;;;;;;;;-1:-1:-1;68329:102:0;;;;;:::i;:::-;;:::i;60009:74::-;;;;;;;;;;-1:-1:-1;60009:74:0;;;;-1:-1:-1;;;;;60009:74:0;;;24713:239;;;;;;;;;;-1:-1:-1;24713:239:0;;;;;:::i;:::-;;:::i;64438:227::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60634:41::-;;;;;;;;;;-1:-1:-1;60634:41:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;60485:34::-;;;;;;;;;;;;;;;;63852:197;;;;;;;;;;-1:-1:-1;63852:197:0;;;;;:::i;:::-;;:::i;24443:208::-;;;;;;;;;;-1:-1:-1;24443:208:0;;;;;:::i;:::-;;:::i;49791:94::-;;;;;;;;;;;;;:::i;60680:57::-;;;;;;;;;;-1:-1:-1;60680:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;72001:63;;;;;;;;;;;;;:::i;49140:87::-;;;;;;;;;;-1:-1:-1;49186:7:0;49213:6;-1:-1:-1;;;;;49213:6:0;49140:87;;65074:157;;;;;;;;;;;;;:::i;61010:45::-;;;;;;;;;;-1:-1:-1;61010:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;25188:104;;;;;;;;;;;;;:::i;26871:295::-;;;;;;;;;;-1:-1:-1;26871:295:0;;;;;:::i;:::-;;:::i;59922:35::-;;;;;;;;;;-1:-1:-1;59922:35:0;;;;-1:-1:-1;;;;;59922:35:0;;;60114:74;;;;;;;;;;-1:-1:-1;60114:74:0;;;;-1:-1:-1;;;;;60114:74:0;;;69214:520;;;;;;;;;;-1:-1:-1;69214:520:0;;;;;:::i;:::-;;:::i;68821:162::-;;;;;;;;;;-1:-1:-1;68821:162:0;;;;;:::i;:::-;;:::i;28134:328::-;;;;;;;;;;-1:-1:-1;28134:328:0;;;;;:::i;:::-;;:::i;60524:28::-;;;;;;;;;;-1:-1:-1;60524:28:0;;;;;;;;71153:259;;;;;;;;;;-1:-1:-1;71153:259:0;;;;;:::i;:::-;;:::i;60587:40::-;;;;;;;;;;-1:-1:-1;60587:40:0;;;;;:::i;:::-;;:::i;68680:104::-;;;;;;;;;;-1:-1:-1;68680:104:0;;;;;:::i;:::-;;:::i;63256:92::-;;;;;;;;;;-1:-1:-1;63333:8:0;;-1:-1:-1;;;;;63333:8:0;63256:92;;71522:132;;;;;;;;;;;;;:::i;27237:164::-;;;;;;;;;;-1:-1:-1;27237:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27358:25:0;;;27334:4;27358:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27237:164;50040:192;;;;;;;;;;-1:-1:-1;50040:192:0;;;;;:::i;:::-;;:::i;59415:50::-;;;;;;;;;;;;59460:5;59415:50;;;;;23948:6:1;23936:19;;;23918:38;;23906:2;23891:18;59415:50:0;23873:89:1;71727:212:0;71873:4;71896:37;71920:12;71896:23;:37::i;:::-;71889:44;71727:212;-1:-1:-1;;71727:212:0:o;68470:102::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;;;;;;;;;68541:14:::1;:25:::0;;-1:-1:-1;;;;;;68541:25:0::1;-1:-1:-1::0;;;;;68541:25:0;;;::::1;::::0;;;::::1;::::0;;68470:102::o;25019:100::-;25073:13;25106:5;25099:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25019:100;:::o;26578:221::-;26654:7;30061:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30061:16:0;26674:73;;;;-1:-1:-1;;;26674:73:0;;19619:2:1;26674:73:0;;;19601:21:1;19658:2;19638:18;;;19631:30;19697:34;19677:18;;;19670:62;-1:-1:-1;;;19748:18:1;;;19741:42;19800:19;;26674:73:0;19591:234:1;26674:73:0;-1:-1:-1;26767:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26767:24:0;;26578:221::o;69105:103::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;69171:8:::1;:31:::0;;-1:-1:-1;;;;;;69171:31:0::1;-1:-1:-1::0;;;;;69171:31:0;;;::::1;::::0;;;::::1;::::0;;69105:103::o;26101:411::-;26182:13;26198:23;26213:7;26198:14;:23::i;:::-;26182:39;;26246:5;-1:-1:-1;;;;;26240:11:0;:2;-1:-1:-1;;;;;26240:11:0;;;26232:57;;;;-1:-1:-1;;;26232:57:0;;20803:2:1;26232:57:0;;;20785:21:1;20842:2;20822:18;;;20815:30;20881:34;20861:18;;;20854:62;-1:-1:-1;;;20932:18:1;;;20925:31;20973:19;;26232:57:0;20775:223:1;26232:57:0;19562:10;-1:-1:-1;;;;;26324:21:0;;;;:62;;-1:-1:-1;26349:37:0;26366:5;19562:10;27237:164;:::i;26349:37::-;26302:168;;;;-1:-1:-1;;;26302:168:0;;16899:2:1;26302:168:0;;;16881:21:1;16938:2;16918:18;;;16911:30;16977:34;16957:18;;;16950:62;17048:26;17028:18;;;17021:54;17092:19;;26302:168:0;16871:246:1;26302:168:0;26483:21;26492:2;26496:7;26483:8;:21::i;:::-;26101:411;;;:::o;63378:198::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;61548:16:::1;::::0;::::1;;61547:17;:45:::0;::::1;;;-1:-1:-1::0;61568:19:0::1;::::0;:24;61547:45:::1;61531:108;;;::::0;-1:-1:-1;;;61531:108:0;;22444:2:1;61531:108:0::1;::::0;::::1;22426:21:1::0;22483:2;22463:18;;;22456:30;22522:31;22502:18;;;22495:59;22571:18;;61531:108:0::1;22416:179:1::0;61531:108:0::1;63477:15:::2;63455:19;:37:::0;;;63499:16:::2;:23:::0;;-1:-1:-1;;63499:23:0::2;63518:4;63499:23;::::0;;63534:36:::2;::::0;::::2;::::0;63499:16:::2;::::0;63534:36:::2;63378:198::o:0;64258:154::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;61385:16:::1;::::0;::::1;;61377:54;;;;-1:-1:-1::0;;;61377:54:0::1;;;;;;;:::i;:::-;64332:16:::2;:24:::0;;-1:-1:-1;;64332:24:0::2;::::0;;64385:20:::2;:18;:20::i;:::-;64368:38;::::0;::::2;::::0;;;::::2;64258:154::o:0;64080:148::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;64160:16:::1;::::0;;-1:-1:-1;;64140:36:0;::::1;64160:16;::::0;;::::1;64159:17;64140:36:::0;;::::1;::::0;;;64188:34:::1;::::0;64205:16;;64188:34:::1;;::::0;::::1;::::0;64160:16:::1;::::0;64188:34:::1;64080:148::o:0;69891:482::-;70000:7;70038:16;;;:8;:16;;;;;;;;70019:35;;;;;;;;;;;;;;;;;70000:7;;70019:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70019:35:0;;;-1:-1:-1;;70019:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;70098:9;;70019:35;;-1:-1:-1;;;;;;70098:9:0;-1:-1:-1;70144:26:0;70163:6;70144:18;:26::i;:::-;70115:55;;;70177:26;70206:84;59460:5;70206:84;;:51;70233:4;:23;;;70206:14;:26;;:51;;;;:::i;:::-;:63;;:84::i;:::-;70177:113;;70304:63;70352:14;70304:43;70331:4;-1:-1:-1;;;;;70331:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70327:19;;:2;:19;:::i;:::-;70304:18;;:22;:43::i;:63::-;70297:70;69891:482;-1:-1:-1;;;;;;;69891:482:0:o;69740:145::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;69844:26:::1;::::0;;;:17:::1;:26;::::0;;;;;:35;69740:145::o;27468:339::-;27663:41;19562:10;27682:12;27696:7;27663:18;:41::i;:::-;27655:103;;;;-1:-1:-1;;;27655:103:0;;;;;;;:::i;:::-;27771:28;27781:4;27787:2;27791:7;27771:9;:28::i;68578:96::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;68646:9:::1;:22:::0;;-1:-1:-1;;;;;;68646:22:0::1;-1:-1:-1::0;;;;;68646:22:0;;;::::1;::::0;;;::::1;::::0;;68578:96::o;64756:252::-;64911:14;;64950:18;;64844:16;;;;-1:-1:-1;;;;;64911:14:0;;;;64934:61;;59460:5;;64935:34;;:10;;:14;:34::i;64934:61::-;64895:107;;;;64756:252;;;;;:::o;39151:256::-;39248:7;39284:23;39301:5;39284:16;:23::i;:::-;39276:5;:31;39268:87;;;;-1:-1:-1;;;39268:87:0;;12661:2:1;39268:87:0;;;12643:21:1;12700:2;12680:18;;;12673:30;12739:34;12719:18;;;12712:62;-1:-1:-1;;;12790:18:1;;;12783:41;12841:19;;39268:87:0;12633:233:1;39268:87:0;-1:-1:-1;;;;;;39373:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39151:256::o;65281:2070::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;61764:23;;:43;;-1:-1:-1;61791:16:0;;;;61764:43;61748:102;;;;-1:-1:-1;;;61748:102:0;;;;;;;:::i;:::-;65466:8:::1;:15;65447:8;:15;:34;65431:112;;;::::0;-1:-1:-1;;;65431:112:0;;17670:2:1;65431:112:0::1;::::0;::::1;17652:21:1::0;17709:2;17689:18;;;17682:30;17748:34;17728:18;;;17721:62;-1:-1:-1;;;17799:18:1;;;17792:42;17851:19;;65431:112:0::1;17642:234:1::0;65431:112:0::1;65557:10;65552:1794;65578:8;:15;65573:2;:20;65552:1794;;;65610:15;65628:8;65637:2;65628:12;;;;;;-1:-1:-1::0;;;65628:12:0::1;;;;;;;;;;;;;;;65610:30;;65649:15;65667:8;65676:2;65667:12;;;;;;-1:-1:-1::0;;;65667:12:0::1;;;;;;;;;;;;;;;65649:30;;65690:16;65709:8;:17;65718:7;65709:17;;;;;;;;;;;65690:36;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;65756:7;65745:4;:7;;;:18;65737:43;;;::::0;-1:-1:-1;;;65737:43:0;;13492:2:1;65737:43:0::1;::::0;::::1;13474:21:1::0;13531:2;13511:18;;;13504:30;-1:-1:-1;;;13550:18:1;;;13543:42;13602:18;;65737:43:0::1;13464:162:1::0;65737:43:0::1;65842:1;65832:7;:11;65824:46;;;::::0;-1:-1:-1;;;65824:46:0;;23219:2:1;65824:46:0::1;::::0;::::1;23201:21:1::0;23258:2;23238:18;;;23231:30;-1:-1:-1;;;23277:18:1;;;23270:52;23339:18;;65824:46:0::1;23191:172:1::0;65824:46:0::1;65925:26;65954:29;19562:10:::0;24443:208;:::i;65954:29::-:1;65925:58;;66064:25;66107:10:::0;66102:272:::1;66128:18;66123:2;:23;66102:272;;;66165:15;66183:43;19562:10:::0;66223:2:::1;66183:25;:43::i;:::-;66165:61;;66237:22;66262:9;:18;66272:7;66262:18;;;;;;;;;;;66237:43;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;66237:43:0;;;-1:-1:-1;;66237:43:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;66312:7;;66295:13;;66237:43;;-1:-1:-1;66295:24:0::1;66291:74;;;66334:19:::0;::::1;::::0;::::1;:::i;:::-;;;;66291:74;66102:272;;66148:4;;;;;:::i;:::-;;;;66102:272;;;-1:-1:-1::0;66418:7:0;;66408:27:::1;::::0;66427:7;66408:9:::1;:27::i;:::-;66451:9;66446:762;66470:7;66466:1;:11;66446:762;;;66495:21;:9;51454:19:::0;;51472:1;51454:19;;;51365:127;66495:21:::1;66551:44;19562:10:::0;66575:9:::1;51335:14:::0;66551:9:::1;:44::i;:::-;66609:22;66633:17:::0;66654:49:::1;66685:4;:7;;;66654:18;:49::i;:::-;66608:95;;;;66752:9;66714:14;:35;66729:19;:9;51335:14:::0;;51243:114;66729:19:::1;66714:35:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66714:35:0;:47;66851:7;;66815:81:::1;::::0;66871:14;66815:23:::1;:81::i;:::-;66774:17;:38;66792:19;:9;51335:14:::0;;51243:114;66792:19:::1;66774:38;;;;;;;;;;;:122;;;;66983:4;66950:9;:30;66960:19;:9;51335:14:::0;;51243:114;66960:19:::1;66950:30:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;66950:30:0;:37;;;;;;::::1;::::0;;;:30;;:37:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;66950:37:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;67087:15:::1;67050:13;-1:-1:-1::0;67064:19:0::1;:9;51335:14:::0;;51243:114;67064:19:::1;67050:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;67050:34:0;;;:52;;;;67183:7;;67172:19;;:10:::1;:19:::0;;;;;;:26:::1;::::0;67196:1:::1;67172:23;:26::i;:::-;67161:7:::0;;67150:19:::1;::::0;;;:10:::1;:19;::::0;;;;:48;-1:-1:-1;66479:3:0;;-1:-1:-1;66479:3:0::1;::::0;::::1;:::i;:::-;;;;66446:762;;;-1:-1:-1::0;67252:9:0::1;:13:::0;67248:91:::1;;67278:51;19562:10:::0;67319:9:::1;67278:17;:51::i;:::-;65552:1794;;;;;65595:4;;;;;:::i;:::-;;;;65552:1794;;72128:67:::0;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;72179:10:::1;:8;:10::i;:::-;72128:67::o:0;27878:185::-;28016:39;28033:4;28039:2;28043:7;28016:39;;;;;;;;;;;;:16;:39::i;36662:245::-;36780:41;19562:10;36799:12;19482:98;36780:41;36772:102;;;;-1:-1:-1;;;36772:102:0;;22802:2:1;36772:102:0;;;22784:21:1;22841:2;22821:18;;;22814:30;22880:34;22860:18;;;22853:62;-1:-1:-1;;;22931:18:1;;;22924:46;22987:19;;36772:102:0;22774:238:1;36772:102:0;36885:14;36891:7;36885:5;:14::i;:::-;36662:245;:::o;39673:233::-;39748:7;39784:30;39571:10;:17;;39483:113;39784:30;39776:5;:38;39768:95;;;;-1:-1:-1;;;39768:95:0;;22031:2:1;39768:95:0;;;22013:21:1;22070:2;22050:18;;;22043:30;22109:34;22089:18;;;22082:62;-1:-1:-1;;;22160:18:1;;;22153:42;22212:19;;39768:95:0;22003:234:1;39768:95:0;39881:10;39892:5;39881:17;;;;;;-1:-1:-1;;;39881:17:0;;;;;;;;;;;;;;;;;39874:24;;39673:233;;;:::o;69008:91::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;69074:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69008:91:::0;:::o;68329:102::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;68400:14:::1;:25:::0;;-1:-1:-1;;;;;;68400:25:0::1;-1:-1:-1::0;;;;;68400:25:0;;;::::1;::::0;;;::::1;::::0;;68329:102::o;24713:239::-;24785:7;24821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24821:16:0;24856:19;24848:73;;;;-1:-1:-1;;;24848:73:0;;18494:2:1;24848:73:0;;;18476:21:1;18533:2;18513:18;;;18506:30;18572:34;18552:18;;;18545:62;-1:-1:-1;;;18623:18:1;;;18616:39;18672:19;;24848:73:0;18466:231:1;64438:227:0;64484:13;64506:19;64539:8;;64528:20;;;;;;-1:-1:-1;;;64528:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64528:20:0;;;;;;;;;;;;;;;;-1:-1:-1;64506:42:0;-1:-1:-1;64572:1:0;64555:86;64579:8;;:12;;64590:1;64579:12;:::i;:::-;64575:1;:16;64555:86;;;64622:8;:11;64631:1;64622:11;;;;;;;;;;;64607:26;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64607:26:0;;;-1:-1:-1;;64607:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;:5;64613;64617:1;64613;:5;:::i;:::-;64607:12;;;;;;-1:-1:-1;;;64607:12:0;;;;;;;;;;;;;;:26;;;;64593:3;;;;;:::i;:::-;;;;64555:86;;;-1:-1:-1;64654:5:0;64438:227;-1:-1:-1;64438:227:0:o;60634:41::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63852:197::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;63953:19:::1;:42:::0;;;64007:36:::1;::::0;63975:20;;64007:36:::1;::::0;;;::::1;63852:197:::0;:::o;24443:208::-;24515:7;-1:-1:-1;;;;;24543:19:0;;24535:74;;;;-1:-1:-1;;;24535:74:0;;18083:2:1;24535:74:0;;;18065:21:1;18122:2;18102:18;;;18095:30;18161:34;18141:18;;;18134:62;-1:-1:-1;;;18212:18:1;;;18205:40;18262:19;;24535:74:0;18055:232:1;24535:74:0;-1:-1:-1;;;;;;24627:16:0;;;;;:9;:16;;;;;;;24443:208::o;49791:94::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;49856:21:::1;49874:1;49856:9;:21::i;72001:63::-:0;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;72050:8:::1;:6;:8::i;65074:157::-:0;65125:7;65177:1;65155:19;;:23;:70;;-1:-1:-1;65224:1:0;;65074:157::o;65155:70::-;65201:19;;65181:40;;:15;;:19;:40::i;:::-;65141:84;;65074:157;:::o;25188:104::-;25244:13;25277:7;25270:14;;;;;:::i;26871:295::-;-1:-1:-1;;;;;26974:24:0;;19562:10;26974:24;;26966:62;;;;-1:-1:-1;;;26966:62:0;;15002:2:1;26966:62:0;;;14984:21:1;15041:2;15021:18;;;15014:30;15080:27;15060:18;;;15053:55;15125:18;;26966:62:0;14974:175:1;26966:62:0;19562:10;27041:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27041:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27041:53:0;;;;;;;;;;27110:48;;11422:41:1;;;27041:42:0;;19562:10;27110:48;;11395:18:1;27110:48:0;;;;;;;26871:295;;:::o;69214:520::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;69396:17:::1;69416:12:::0;;;:8:::1;:12;::::0;;;;69509:15:::1;::::0;::::1;::::0;:20;:45;::::1;;;-1:-1:-1::0;69533:16:0::1;::::0;::::1;::::0;:21;69509:45:::1;69505:78;;;69565:8;:10:::0;;;:8:::1;:10;::::0;::::1;:::i;:::-;;;;;;69505:78;69589:16:::0;;::::1;::::0;:9:::1;::::0;::::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69612:15:0::1;::::0;::::1;:28:::0;;;;69647:16:::1;::::0;::::1;:30:::0;;;;69684:23:::1;::::0;;::::1;:44:::0;-1:-1:-1;;69214:520:0:o;68821:162::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;68900:18:::1;:33:::0;;;68945:32:::1;::::0;68921:12;;68945:32:::1;::::0;;;::::1;68821:162:::0;:::o;28134:328::-;28309:41;19562:10;28342:7;28309:18;:41::i;:::-;28301:103;;;;-1:-1:-1;;;28301:103:0;;;;;;;:::i;:::-;28415:39;28429:4;28435:2;28439:7;28448:5;28415:13;:39::i;:::-;28134:328;;;;:::o;71153:259::-;30037:4;30061:16;;;:7;:16;;;;;;71252:13;;-1:-1:-1;;;;;30061:16:0;71277:47;;;;-1:-1:-1;;;71277:47:0;;17324:2:1;71277:47:0;;;17306:21:1;17363:2;17343:18;;;17336:30;-1:-1:-1;;;17382:18:1;;;17375:47;17439:18;;71277:47:0;17296:167:1;71277:47:0;71364:10;:8;:10::i;:::-;71376:19;:8;:17;:19::i;:::-;71347:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71333:73;;71153:259;;;:::o;60587:40::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;68680:104::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;68752:11:::1;:26:::0;;-1:-1:-1;;;;;;68752:26:0::1;-1:-1:-1::0;;;;;68752:26:0;;;::::1;::::0;;;::::1;::::0;;68680:104::o;71522:132::-;71566:13;71619:10;:8;:10::i;:::-;71602:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;71588:60;;71522:132;:::o;50040:192::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;49360:23;49352:68;;;;-1:-1:-1;;;49352:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50129:22:0;::::1;50121:73;;;::::0;-1:-1:-1;;;50121:73:0;;13833:2:1;50121:73:0::1;::::0;::::1;13815:21:1::0;13872:2;13852:18;;;13845:30;13911:34;13891:18;;;13884:62;-1:-1:-1;;;13962:18:1;;;13955:36;14008:19;;50121:73:0::1;13805:228:1::0;50121:73:0::1;50205:19;50215:8;50205:9;:19::i;38843:224::-:0;38945:4;-1:-1:-1;;;;;;38969:50:0;;-1:-1:-1;;;38969:50:0;;:90;;;39023:36;39047:11;39023:23;:36::i;33954:174::-;34029:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34029:29:0;-1:-1:-1;;;;;34029:29:0;;;;;;;;:24;;34083:23;34029:24;34083:14;:23::i;:::-;-1:-1:-1;;;;;34074:46:0;;;;;;;;;;;33954:174;;:::o;70379:768::-;70461:7;70470;70489:16;70508:8;:16;70517:6;70508:16;;;;;;;;;;;70489:35;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70489:35:0;;;-1:-1:-1;;70489:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70568:9;;70624:11;;70693:15;;-1:-1:-1;;;70693:15:0;;;;70489:35;;-1:-1:-1;;;;;;70568:9:0;;;;70624:11;;;-1:-1:-1;;70669:40:0;;70568:9;;70693:13;;:15;;;;;;;;;70568:9;70693:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70689:19;;:2;:19;:::i;:::-;70669:15;;;;;:19;:40::i;:::-;70643:66;;70716:25;70744:43;70769:6;-1:-1:-1;;;;;70769:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70765:21;;:2;:21;:::i;:::-;70744:16;;;;;:20;:43::i;:::-;70819:8;;70854:9;;70819:45;;-1:-1:-1;;;70819:45:0;;-1:-1:-1;;;;;70854:9:0;;;70819:45;;;8758:51:1;70716:71:0;;-1:-1:-1;70794:22:0;;70819:8;;;:34;;8731:18:1;;70819:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70794:70;;70871:21;70895:100;70988:6;70895:80;70922:52;70958:4;-1:-1:-1;;;;;70958:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70954:19;;:2;:19;:::i;:::-;70922:27;:15;70942:6;70922:19;:27::i;:52::-;70895:14;;:26;:80::i;:100::-;70871:124;;71018:14;71041:93;71069:56;71107:6;-1:-1:-1;;;;;71107:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71103:21;;:2;:21;:::i;:::-;71069:29;:17;71091:6;71069:21;:29::i;:56::-;71041:13;;:17;:93::i;:::-;71002:139;;;;;;;;;;;70379:768;;;:::o;55372:98::-;55430:7;55457:5;55461:1;55457;:5;:::i;:::-;55450:12;55372:98;-1:-1:-1;;;55372:98:0:o;55771:::-;55829:7;55856:5;55860:1;55856;:5;:::i;30266:348::-;30359:4;30061:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30061:16:0;30376:73;;;;-1:-1:-1;;;30376:73:0;;16141:2:1;30376:73:0;;;16123:21:1;16180:2;16160:18;;;16153:30;16219:34;16199:18;;;16192:62;-1:-1:-1;;;16270:18:1;;;16263:42;16322:19;;30376:73:0;16113:234:1;30376:73:0;30460:13;30476:23;30491:7;30476:14;:23::i;:::-;30460:39;;30529:5;-1:-1:-1;;;;;30518:16:0;:7;-1:-1:-1;;;;;30518:16:0;;:51;;;;30562:7;-1:-1:-1;;;;;30538:31:0;:20;30550:7;30538:11;:20::i;:::-;-1:-1:-1;;;;;30538:31:0;;30518:51;:87;;;-1:-1:-1;;;;;;27358:25:0;;;27334:4;27358:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30573:32;30510:96;30266:348;-1:-1:-1;;;;30266:348:0:o;33258:578::-;33417:4;-1:-1:-1;;;;;33390:31:0;:23;33405:7;33390:14;:23::i;:::-;-1:-1:-1;;;;;33390:31:0;;33382:85;;;;-1:-1:-1;;;33382:85:0;;20393:2:1;33382:85:0;;;20375:21:1;20432:2;20412:18;;;20405:30;20471:34;20451:18;;;20444:62;-1:-1:-1;;;20522:18:1;;;20515:39;20571:19;;33382:85:0;20365:231:1;33382:85:0;-1:-1:-1;;;;;33486:16:0;;33478:65;;;;-1:-1:-1;;;33478:65:0;;14597:2:1;33478:65:0;;;14579:21:1;14636:2;14616:18;;;14609:30;14675:34;14655:18;;;14648:62;-1:-1:-1;;;14726:18:1;;;14719:34;14770:19;;33478:65:0;14569:226:1;33478:65:0;33556:39;33577:4;33583:2;33587:7;33556:20;:39::i;:::-;33660:29;33677:1;33681:7;33660:8;:29::i;:::-;-1:-1:-1;;;;;33702:15:0;;;;;;:9;:15;;;;;:20;;33721:1;;33702:15;:20;;33721:1;;33702:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33733:13:0;;;;;;:9;:13;;;;;:18;;33750:1;;33733:13;:18;;33750:1;;33733:18;:::i;:::-;;;;-1:-1:-1;;33762:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33762:21:0;-1:-1:-1;;;;;33762:21:0;;;;;;;;;33801:27;;33762:16;;33801:27;;;;;;;33258:578;;;:::o;67357:966::-;49186:7;49213:6;-1:-1:-1;;;;;49213:6:0;19562:10;61764:23;;:43;;-1:-1:-1;61791:16:0;;;;61764:43;61748:102;;;;-1:-1:-1;;;61748:102:0;;;;;;;:::i;:::-;67466:12:::1;49213:6:::0;-1:-1:-1;;;;;49213:6:0;19562:10;67481:23:::1;67511:36:::0;::::1;;;67533:7;69074:19;69008:91:::0;:::o;67511:36::-:1;67555:16;67574:8;:17;67583:7;67574:17;;;;;;;;;;;67555:36;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;67600:19;67637:9;;;;;;;;;-1:-1:-1::0;;;;;67637:9:0::1;67600:47;;67654:21;67693:11;;;;;;;;;-1:-1:-1::0;;;;;67693:11:0::1;67654:51;;67714:27;67744:66;67797:6;67744:40;67768:4;-1:-1:-1::0;;;;;67768:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67764:19;::::0;:2:::1;:19;:::i;:::-;67744:15;::::0;::::1;::::0;;:19:::1;:40::i;:::-;:44:::0;::::1;:66::i;:::-;67714:96;;67817:24;67844:69;67900:6;67844:43;67869:6;-1:-1:-1::0;;;;;67869:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67865:21;::::0;:2:::1;:21;:::i;:::-;67844:16;::::0;::::1;::::0;;:20:::1;:43::i;:69::-;67938:26;::::0;-1:-1:-1;;;67938:26:0;;67953:10:::1;67938:26;::::0;::::1;8758:51:1::0;67817:96:0;;-1:-1:-1;67968:19:0;;-1:-1:-1;;;;;67938:14:0;::::1;::::0;::::1;::::0;8731:18:1;;67938:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;67922:120;;;::::0;-1:-1:-1;;;67922:120:0;;23570:2:1;67922:120:0::1;::::0;::::1;23552:21:1::0;23609:2;23589:18;;;23582:30;23648:34;23628:18;;;23621:62;-1:-1:-1;;;23699:18:1;;;23692:35;23744:19;;67922:120:0::1;23542:227:1::0;67922:120:0::1;68065:28;::::0;-1:-1:-1;;;68065:28:0;;68082:10:::1;68065:28;::::0;::::1;8758:51:1::0;68097:16:0;;-1:-1:-1;;;;;68065:16:0;::::1;::::0;::::1;::::0;8731:18:1;;68065:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;68049:121;;;::::0;-1:-1:-1;;;68049:121:0;;21205:2:1;68049:121:0::1;::::0;::::1;21187:21:1::0;21244:2;21224:18;;;21217:30;21283:34;21263:18;;;21256:62;-1:-1:-1;;;21334:18:1;;;21327:37;21381:19;;68049:121:0::1;21177:229:1::0;68049:121:0::1;68209:14;::::0;68179:66:::1;::::0;-1:-1:-1;;;68179:66:0;;68197:10:::1;68179:66;::::0;::::1;9060:34:1::0;-1:-1:-1;;;;;68209:14:0;;::::1;9110:18:1::0;;;9103:43;9162:18;;;9155:34;;;68179:17:0;;::::1;::::0;::::1;::::0;8995:18:1;;68179:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;68284:14:0::1;::::0;68252:65:::1;::::0;-1:-1:-1;;;68252:65:0;;68272:10:::1;68252:65;::::0;::::1;9060:34:1::0;-1:-1:-1;;;;;68284:14:0;;::::1;9110:18:1::0;;;9103:43;9162:18;;;9155:34;;;68252:19:0;;::::1;::::0;::::1;::::0;8995:18:1;;68252:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61857:1;;;;;;67357:966:::0;;:::o;30956:110::-;31032:26;31042:2;31046:7;31032:26;;;;;;;;;;;;:9;:26::i;54634:98::-;54692:7;54719:5;54723:1;54719;:5;:::i;13060:317::-;13175:6;13150:21;:31;;13142:73;;;;-1:-1:-1;;;13142:73:0;;15783:2:1;13142:73:0;;;15765:21:1;15822:2;15802:18;;;15795:30;15861:31;15841:18;;;15834:59;15910:18;;13142:73:0;15755:179:1;13142:73:0;13229:12;13247:9;-1:-1:-1;;;;;13247:14:0;13269:6;13247:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13228:52;;;13299:7;13291:78;;;;-1:-1:-1;;;13291:78:0;;15356:2:1;13291:78:0;;;15338:21:1;15395:2;15375:18;;;15368:30;15434:34;15414:18;;;15407:62;15505:28;15485:18;;;15478:56;15551:19;;13291:78:0;15328:248:1;47126:120:0;46138:7;;;;46662:41;;;;-1:-1:-1;;;46662:41:0;;12312:2:1;46662:41:0;;;12294:21:1;12351:2;12331:18;;;12324:30;-1:-1:-1;;;12370:18:1;;;12363:50;12430:18;;46662:41:0;12284:170:1;46662:41:0;47185:7:::1;:15:::0;;-1:-1:-1;;47185:15:0::1;::::0;;47216:22:::1;19562:10:::0;47225:12:::1;47216:22;::::0;-1:-1:-1;;;;;8776:32:1;;;8758:51;;8746:2;8731:18;47216:22:0::1;;;;;;;47126:120::o:0;32561:360::-;32621:13;32637:23;32652:7;32637:14;:23::i;:::-;32621:39;;32673:48;32694:5;32709:1;32713:7;32673:20;:48::i;:::-;32762:29;32779:1;32783:7;32762:8;:29::i;:::-;-1:-1:-1;;;;;32804:16:0;;;;;;:9;:16;;;;;:21;;32824:1;;32804:16;:21;;32824:1;;32804:21;:::i;:::-;;;;-1:-1:-1;;32843:16:0;;;;:7;:16;;;;;;32836:23;;-1:-1:-1;;;;;;32836:23:0;;;32877:36;32851:7;;32843:16;-1:-1:-1;;;;;32877:36:0;;;;;32843:16;;32877:36;32561:360;;:::o;50240:173::-;50296:16;50315:6;;-1:-1:-1;;;;;50332:17:0;;;-1:-1:-1;;;;;;50332:17:0;;;;;;50365:40;;50315:6;;;;;;;50365:40;;50296:16;50365:40;50240:173;;:::o;46867:118::-;46138:7;;;;46392:9;46384:38;;;;-1:-1:-1;;;46384:38:0;;16554:2:1;46384:38:0;;;16536:21:1;16593:2;16573:18;;;16566:30;-1:-1:-1;;;16612:18:1;;;16605:46;16668:18;;46384:38:0;16526:166:1;46384:38:0;46927:7:::1;:14:::0;;-1:-1:-1;;46927:14:0::1;46937:4;46927:14;::::0;;46957:20:::1;46964:12;19562:10:::0;;19482:98;55015;55073:7;55100:5;55104:1;55100;:5;:::i;29344:315::-;29501:28;29511:4;29517:2;29521:7;29501:9;:28::i;:::-;29548:48;29571:4;29577:2;29581:7;29590:5;29548:22;:48::i;:::-;29540:111;;;;-1:-1:-1;;;29540:111:0;;;;;;;:::i;72254:99::-;72306:13;72335:12;72328:19;;;;;:::i;20013:723::-;20069:13;20290:10;20286:53;;-1:-1:-1;;20317:10:0;;;;;;;;;;;;-1:-1:-1;;;20317:10:0;;;;;20013:723::o;20286:53::-;20364:5;20349:12;20405:78;20412:9;;20405:78;;20438:8;;;;:::i;:::-;;-1:-1:-1;20461:10:0;;-1:-1:-1;20469:2:0;20461:10;;:::i;:::-;;;20405:78;;;20493:19;20525:6;20515:17;;;;;;-1:-1:-1;;;20515:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20515:17:0;;20493:39;;20543:154;20550:10;;20543:154;;20577:11;20587:1;20577:11;;:::i;:::-;;-1:-1:-1;20646:10:0;20654:2;20646:5;:10;:::i;:::-;20633:24;;:2;:24;:::i;:::-;20620:39;;20603:6;20610;20603:14;;;;;;-1:-1:-1;;;20603:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;20603:56:0;;;;;;;;-1:-1:-1;20674:11:0;20683:2;20674:11;;:::i;:::-;;;20543:154;;24074:305;24176:4;-1:-1:-1;;;;;;24213:40:0;;-1:-1:-1;;;24213:40:0;;:105;;-1:-1:-1;;;;;;;24270:48:0;;-1:-1:-1;;;24270:48:0;24213:105;:158;;;-1:-1:-1;;;;;;;;;;22683:40:0;;;24335:36;22574:157;72391:391;72612:32;;;;:22;:32;;;;;72647:15;72612:50;;72728:48;72755:5;72762:3;72635:8;72728:26;:48::i;31293:321::-;31423:18;31429:2;31433:7;31423:5;:18::i;:::-;31474:54;31505:1;31509:2;31513:7;31522:5;31474:22;:54::i;:::-;31452:154;;;;-1:-1:-1;;;31452:154:0;;;;;;;:::i;34693:803::-;34848:4;-1:-1:-1;;;;;34869:13:0;;12061:20;12109:8;34865:624;;34905:72;;-1:-1:-1;;;34905:72:0;;-1:-1:-1;;;;;34905:36:0;;;;;:72;;19562:10;;34956:4;;34962:7;;34971:5;;34905:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34905:72:0;;;;;;;;-1:-1:-1;;34905:72:0;;;;;;;;;;;;:::i;:::-;;;34901:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35151:13:0;;35147:272;;35194:60;;-1:-1:-1;;;35194:60:0;;;;;;;:::i;35147:272::-;35369:6;35363:13;35354:6;35350:2;35346:15;35339:38;34901:533;-1:-1:-1;;;;;;35028:55:0;-1:-1:-1;;;35028:55:0;;-1:-1:-1;35021:62:0;;34865:624;-1:-1:-1;35473:4:0;34693:803;;;;;;:::o;47856:275::-;48000:45;48027:4;48033:2;48037:7;48000:26;:45::i;:::-;46138:7;;;;48066:9;48058:65;;;;-1:-1:-1;;;48058:65:0;;11900:2:1;48058:65:0;;;11882:21:1;11939:2;11919:18;;;11912:30;11978:34;11958:18;;;11951:62;-1:-1:-1;;;12029:18:1;;;12022:41;12080:19;;48058:65:0;11872:233:1;31950:382:0;-1:-1:-1;;;;;32030:16:0;;32022:61;;;;-1:-1:-1;;;32022:61:0;;19258:2:1;32022:61:0;;;19240:21:1;;;19277:18;;;19270:30;19336:34;19316:18;;;19309:62;19388:18;;32022:61:0;19230:182:1;32022:61:0;30037:4;30061:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30061:16:0;:30;32094:58;;;;-1:-1:-1;;;32094:58:0;;14240:2:1;32094:58:0;;;14222:21:1;14279:2;14259:18;;;14252:30;14318;14298:18;;;14291:58;14366:18;;32094:58:0;14212:178:1;32094:58:0;32165:45;32194:1;32198:2;32202:7;32165:20;:45::i;:::-;-1:-1:-1;;;;;32223:13:0;;;;;;:9;:13;;;;;:18;;32240:1;;32223:13;:18;;32240:1;;32223:18;:::i;:::-;;;;-1:-1:-1;;32252:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32252:21:0;-1:-1:-1;;;;;32252:21:0;;;;;;;;32291:33;;32252:16;;;32291:33;;32252:16;;32291:33;31950:382;;:::o;40519:589::-;-1:-1:-1;;;;;40725:18:0;;40721:187;;40760:40;40792:7;41935:10;:17;;41908:24;;;;:15;:24;;;;;:44;;;41963:24;;;;;;;;;;;;41831:164;40760:40;40721:187;;;40830:2;-1:-1:-1;;;;;40822:10:0;:4;-1:-1:-1;;;;;40822:10:0;;40818:90;;40849:47;40882:4;40888:7;40849:32;:47::i;:::-;-1:-1:-1;;;;;40922:16:0;;40918:183;;40955:45;40992:7;40955:36;:45::i;40918:183::-;41028:4;-1:-1:-1;;;;;41022:10:0;:2;-1:-1:-1;;;;;41022:10:0;;41018:83;;41049:40;41077:2;41081:7;41049:27;:40::i;42622:988::-;42888:22;42938:1;42913:22;42930:4;42913:16;:22::i;:::-;:26;;;;:::i;:::-;42950:18;42971:26;;;:17;:26;;;;;;42888:51;;-1:-1:-1;43104:28:0;;;43100:328;;-1:-1:-1;;;;;43171:18:0;;43149:19;43171:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43222:30;;;;;;:44;;;43339:30;;:17;:30;;;;;:43;;;43100:328;-1:-1:-1;43524:26:0;;;;:17;:26;;;;;;;;43517:33;;;-1:-1:-1;;;;;43568:18:0;;;;;:12;:18;;;;;:34;;;;;;;43561:41;42622:988::o;43905:1079::-;44183:10;:17;44158:22;;44183:21;;44203:1;;44183:21;:::i;:::-;44215:18;44236:24;;;:15;:24;;;;;;44609:10;:26;;44158:46;;-1:-1:-1;44236:24:0;;44158:46;;44609:26;;;;-1:-1:-1;;;44609:26:0;;;;;;;;;;;;;;;;;44587:48;;44673:11;44648:10;44659;44648:22;;;;;;-1:-1:-1;;;44648:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;44753:28;;;:15;:28;;;;;;;:41;;;44925:24;;;;;44918:31;44960:10;:16;;;;;-1:-1:-1;;;44960:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;43905:1079;;;;:::o;41409:221::-;41494:14;41511:20;41528:2;41511:16;:20::i;:::-;-1:-1:-1;;;;;41542:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41587:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41409:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:743::-;657:5;710:3;703:4;695:6;691:17;687:27;677:2;;732:5;725;718:20;677:2;772:6;759:20;798:4;821:18;817:2;814:26;811:2;;;843:18;;:::i;:::-;889:2;886:1;882:10;912:28;936:2;932;928:11;912:28;:::i;:::-;974:15;;;1005:12;;;;1037:15;;;1071;;;1067:24;;1064:33;-1:-1:-1;1061:2:1;;;1114:5;1107;1100:20;1061:2;1140:5;1131:14;;1154:163;1168:2;1165:1;1162:9;1154:163;;;1225:17;;1213:30;;1186:1;1179:9;;;;;1263:12;;;;1295;;1154:163;;;-1:-1:-1;1335:5:1;667:679;-1:-1:-1;;;;;;;667:679:1:o;1351:229::-;1394:5;1447:3;1440:4;1432:6;1428:17;1424:27;1414:2;;1469:5;1462;1455:20;1414:2;1495:79;1570:3;1561:6;1548:20;1541:4;1533:6;1529:17;1495:79;:::i;1585:196::-;1644:6;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1746:29;1765:9;1746:29;:::i;1786:270::-;1854:6;1862;1915:2;1903:9;1894:7;1890:23;1886:32;1883:2;;;1936:6;1928;1921:22;1883:2;1964:29;1983:9;1964:29;:::i;:::-;1954:39;;2012:38;2046:2;2035:9;2031:18;2012:38;:::i;:::-;2002:48;;1873:183;;;;;:::o;2061:338::-;2138:6;2146;2154;2207:2;2195:9;2186:7;2182:23;2178:32;2175:2;;;2228:6;2220;2213:22;2175:2;2256:29;2275:9;2256:29;:::i;:::-;2246:39;;2304:38;2338:2;2327:9;2323:18;2304:38;:::i;:::-;2294:48;;2389:2;2378:9;2374:18;2361:32;2351:42;;2165:234;;;;;:::o;2404:696::-;2499:6;2507;2515;2523;2576:3;2564:9;2555:7;2551:23;2547:33;2544:2;;;2598:6;2590;2583:22;2544:2;2626:29;2645:9;2626:29;:::i;:::-;2616:39;;2674:38;2708:2;2697:9;2693:18;2674:38;:::i;:::-;2664:48;;2759:2;2748:9;2744:18;2731:32;2721:42;;2814:2;2803:9;2799:18;2786:32;2841:18;2833:6;2830:30;2827:2;;;2878:6;2870;2863:22;2827:2;2906:22;;2959:4;2951:13;;2947:27;-1:-1:-1;2937:2:1;;2993:6;2985;2978:22;2937:2;3021:73;3086:7;3081:2;3068:16;3063:2;3059;3055:11;3021:73;:::i;:::-;3011:83;;;2534:566;;;;;;;:::o;3105:325::-;3170:6;3178;3231:2;3219:9;3210:7;3206:23;3202:32;3199:2;;;3252:6;3244;3237:22;3199:2;3280:29;3299:9;3280:29;:::i;:::-;3270:39;;3359:2;3348:9;3344:18;3331:32;3372:28;3394:5;3372:28;:::i;:::-;3419:5;3409:15;;;3189:241;;;;;:::o;3435:264::-;3503:6;3511;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3585:6;3577;3570:22;3532:2;3613:29;3632:9;3613:29;:::i;:::-;3603:39;3689:2;3674:18;;;;3661:32;;-1:-1:-1;;;3522:177:1:o;3704:625::-;3822:6;3830;3883:2;3871:9;3862:7;3858:23;3854:32;3851:2;;;3904:6;3896;3889:22;3851:2;3949:9;3936:23;3978:18;4019:2;4011:6;4008:14;4005:2;;;4040:6;4032;4025:22;4005:2;4068:61;4121:7;4112:6;4101:9;4097:22;4068:61;:::i;:::-;4058:71;;4182:2;4171:9;4167:18;4154:32;4138:48;;4211:2;4201:8;4198:16;4195:2;;;4232:6;4224;4217:22;4195:2;;4260:63;4315:7;4304:8;4293:9;4289:24;4260:63;:::i;:::-;4250:73;;;3841:488;;;;;:::o;4334:255::-;4401:6;4454:2;4442:9;4433:7;4429:23;4425:32;4422:2;;;4475:6;4467;4460:22;4422:2;4512:9;4506:16;4531:28;4553:5;4531:28;:::i;4594:255::-;4652:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:2;;;4726:6;4718;4711:22;4673:2;4770:9;4757:23;4789:30;4813:5;4789:30;:::i;4854:259::-;4923:6;4976:2;4964:9;4955:7;4951:23;4947:32;4944:2;;;4997:6;4989;4982:22;4944:2;5034:9;5028:16;5053:30;5077:5;5053:30;:::i;5118:342::-;5187:6;5240:2;5228:9;5219:7;5215:23;5211:32;5208:2;;;5261:6;5253;5246:22;5208:2;5306:9;5293:23;5339:18;5331:6;5328:30;5325:2;;;5376:6;5368;5361:22;5325:2;5404:50;5446:7;5437:6;5426:9;5422:22;5404:50;:::i;5465:190::-;5524:6;5577:2;5565:9;5556:7;5552:23;5548:32;5545:2;;;5598:6;5590;5583:22;5545:2;-1:-1:-1;5626:23:1;;5535:120;-1:-1:-1;5535:120:1:o;5660:194::-;5730:6;5783:2;5771:9;5762:7;5758:23;5754:32;5751:2;;;5804:6;5796;5789:22;5751:2;-1:-1:-1;5832:16:1;;5741:113;-1:-1:-1;5741:113:1:o;5859:616::-;5964:6;5972;5980;5988;5996;6049:3;6037:9;6028:7;6024:23;6020:33;6017:2;;;6071:6;6063;6056:22;6017:2;6112:9;6099:23;6089:33;;6173:2;6162:9;6158:18;6145:32;6200:18;6192:6;6189:30;6186:2;;;6237:6;6229;6222:22;6186:2;6265:50;6307:7;6298:6;6287:9;6283:22;6265:50;:::i;:::-;6007:468;;6255:60;;-1:-1:-1;;;;6362:2:1;6347:18;;6334:32;;6413:2;6398:18;;6385:32;;6464:3;6449:19;;;6436:33;;-1:-1:-1;6007:468:1;-1:-1:-1;6007:468:1:o;6480:258::-;6548:6;6556;6609:2;6597:9;6588:7;6584:23;6580:32;6577:2;;;6630:6;6622;6615:22;6577:2;-1:-1:-1;;6658:23:1;;;6728:2;6713:18;;;6700:32;;-1:-1:-1;6567:171:1:o;6743:293::-;6811:6;6864:2;6852:9;6843:7;6839:23;6835:32;6832:2;;;6885:6;6877;6870:22;6832:2;6922:9;6916:16;6972:4;6965:5;6961:16;6954:5;6951:27;6941:2;;6997:6;6989;6982:22;7041:257;7082:3;7120:5;7114:12;7147:6;7142:3;7135:19;7163:63;7219:6;7212:4;7207:3;7203:14;7196:4;7189:5;7185:16;7163:63;:::i;:::-;7280:2;7259:15;-1:-1:-1;;7255:29:1;7246:39;;;;7287:4;7242:50;;7090:208;-1:-1:-1;;7090:208:1:o;7303:637::-;7583:3;7621:6;7615:13;7637:53;7683:6;7678:3;7671:4;7663:6;7659:17;7637:53;:::i;:::-;7753:13;;7712:16;;;;7775:57;7753:13;7712:16;7809:4;7797:17;;7775:57;:::i;:::-;-1:-1:-1;;;7854:20:1;;7883:22;;;7932:1;7921:13;;7591:349;-1:-1:-1;;;;7591:349:1:o;7945:452::-;8177:3;8215:6;8209:13;8231:53;8277:6;8272:3;8265:4;8257:6;8253:17;8231:53;:::i;:::-;-1:-1:-1;;;8306:16:1;;8331:30;;;-1:-1:-1;8388:2:1;8377:14;;8185:212;-1:-1:-1;8185:212:1:o;9200:488::-;-1:-1:-1;;;;;9469:15:1;;;9451:34;;9521:15;;9516:2;9501:18;;9494:43;9568:2;9553:18;;9546:34;;;9616:3;9611:2;9596:18;;9589:31;;;9394:4;;9637:45;;9662:19;;9654:6;9637:45;:::i;:::-;9629:53;9403:285;-1:-1:-1;;;;;;9403:285:1:o;9972:1305::-;10158:4;10187:2;10227;10216:9;10212:18;10257:2;10246:9;10239:21;10280:6;10315;10309:13;10346:6;10338;10331:22;10372:2;10362:12;;10405:2;10394:9;10390:18;10383:25;;10467:2;10457:6;10454:1;10450:14;10439:9;10435:30;10431:39;10505:2;10497:6;10493:15;10526:4;10539:709;10553:6;10550:1;10547:13;10539:709;;;10646:2;10642:7;10630:9;10622:6;10618:22;10614:36;10609:3;10602:49;10680:6;10674:13;10710:4;10748:2;10742:9;10734:6;10727:25;10799:2;10795;10791:11;10785:18;10840:2;10835;10827:6;10823:15;10816:27;10870:47;10913:2;10905:6;10901:15;10887:12;10870:47;:::i;:::-;10960:11;;;10954:18;10937:15;;;10930:43;10996:4;11043:11;;;11037:18;11020:15;;;11013:43;11079:4;11126:11;;;11120:18;11103:15;;;;11096:43;;;;-1:-1:-1;;11226:12:1;;;;11191:15;;;;10575:1;10568:9;10539:709;;;-1:-1:-1;11265:6:1;;10167:1110;-1:-1:-1;;;;;;;;10167:1110:1:o;11474:219::-;11623:2;11612:9;11605:21;11586:4;11643:44;11683:2;11672:9;11668:18;11660:6;11643:44;:::i;12871:414::-;13073:2;13055:21;;;13112:2;13092:18;;;13085:30;13151:34;13146:2;13131:18;;13124:62;-1:-1:-1;;;13217:2:1;13202:18;;13195:48;13275:3;13260:19;;13045:240::o;18702:349::-;18904:2;18886:21;;;18943:2;18923:18;;;18916:30;18982:27;18977:2;18962:18;;18955:55;19042:2;19027:18;;18876:175::o;19830:356::-;20032:2;20014:21;;;20051:18;;;20044:30;20110:34;20105:2;20090:18;;20083:62;20177:2;20162:18;;20004:182::o;21411:413::-;21613:2;21595:21;;;21652:2;21632:18;;;21625:30;21691:34;21686:2;21671:18;;21664:62;-1:-1:-1;;;21757:2:1;21742:18;;21735:47;21814:3;21799:19;;21585:239::o;24149:506::-;24410:6;24399:9;24392:25;24453:3;24448:2;24437:9;24433:18;24426:31;24373:4;24474:45;24514:3;24503:9;24499:19;24491:6;24474:45;:::i;:::-;24550:2;24535:18;;24528:34;;;;-1:-1:-1;24593:2:1;24578:18;;24571:34;;;;24636:3;24621:19;;;24614:35;24466:53;24382:273;-1:-1:-1;;24382:273:1:o;24660:275::-;24731:2;24725:9;24796:2;24777:13;;-1:-1:-1;;24773:27:1;24761:40;;24831:18;24816:34;;24852:22;;;24813:62;24810:2;;;24878:18;;:::i;:::-;24914:2;24907:22;24705:230;;-1:-1:-1;24705:230:1:o;24940:128::-;24980:3;25011:1;25007:6;25004:1;25001:13;24998:2;;;25017:18;;:::i;:::-;-1:-1:-1;25053:9:1;;24988:80::o;25073:120::-;25113:1;25139;25129:2;;25144:18;;:::i;:::-;-1:-1:-1;25178:9:1;;25119:74::o;25198:422::-;25287:1;25330:5;25287:1;25344:270;25365:7;25355:8;25352:21;25344:270;;;25424:4;25420:1;25416:6;25412:17;25406:4;25403:27;25400:2;;;25433:18;;:::i;:::-;25483:7;25473:8;25469:22;25466:2;;;25503:16;;;;25466:2;25582:22;;;;25542:15;;;;25344:270;;;25348:3;25262:358;;;;;:::o;25625:140::-;25683:5;25712:47;25753:4;25743:8;25739:19;25733:4;25819:5;25849:8;25839:2;;-1:-1:-1;25890:1:1;25904:5;;25839:2;25938:4;25928:2;;-1:-1:-1;25975:1:1;25989:5;;25928:2;26020:4;26038:1;26033:59;;;;26106:1;26101:130;;;;26013:218;;26033:59;26063:1;26054:10;;26077:5;;;26101:130;26138:3;26128:8;26125:17;26122:2;;;26145:18;;:::i;:::-;-1:-1:-1;;26201:1:1;26187:16;;26216:5;;26013:218;;26315:2;26305:8;26302:16;26296:3;26290:4;26287:13;26283:36;26277:2;26267:8;26264:16;26259:2;26253:4;26250:12;26246:35;26243:77;26240:2;;;-1:-1:-1;26352:19:1;;;26384:5;;26240:2;26431:34;26456:8;26450:4;26431:34;:::i;:::-;26501:6;26497:1;26493:6;26489:19;26480:7;26477:32;26474:2;;;26512:18;;:::i;:::-;26550:20;;25829:747;-1:-1:-1;;;25829:747:1:o;26581:168::-;26621:7;26687:1;26683;26679:6;26675:14;26672:1;26669:21;26664:1;26657:9;26650:17;26646:45;26643:2;;;26694:18;;:::i;:::-;-1:-1:-1;26734:9:1;;26633:116::o;26754:125::-;26794:4;26822:1;26819;26816:8;26813:2;;;26827:18;;:::i;:::-;-1:-1:-1;26864:9:1;;26803:76::o;26884:258::-;26956:1;26966:113;26980:6;26977:1;26974:13;26966:113;;;27056:11;;;27050:18;27037:11;;;27030:39;27002:2;26995:10;26966:113;;;27097:6;27094:1;27091:13;27088:2;;;-1:-1:-1;;27132:1:1;27114:16;;27107:27;26937:205::o;27147:380::-;27226:1;27222:12;;;;27269;;;27290:2;;27344:4;27336:6;27332:17;27322:27;;27290:2;27397;27389:6;27386:14;27366:18;27363:38;27360:2;;;27443:10;27438:3;27434:20;27431:1;27424:31;27478:4;27475:1;27468:15;27506:4;27503:1;27496:15;27532:135;27571:3;-1:-1:-1;;27592:17:1;;27589:2;;;27612:18;;:::i;:::-;-1:-1:-1;27659:1:1;27648:13;;27579:88::o;27672:112::-;27704:1;27730;27720:2;;27735:18;;:::i;:::-;-1:-1:-1;27769:9:1;;27710:74::o;27789:127::-;27850:10;27845:3;27841:20;27838:1;27831:31;27881:4;27878:1;27871:15;27905:4;27902:1;27895:15;27921:127;27982:10;27977:3;27973:20;27970:1;27963:31;28013:4;28010:1;28003:15;28037:4;28034:1;28027:15;28053:127;28114:10;28109:3;28105:20;28102:1;28095:31;28145:4;28142:1;28135:15;28169:4;28166:1;28159:15;28185:118;28271:5;28264:13;28257:21;28250:5;28247:32;28237:2;;28293:1;28290;28283:12;28308:131;-1:-1:-1;;;;;;28382:32:1;;28372:43;;28362:2;;28429:1;28426;28419:12

Swarm Source

ipfs://8bf7b9fa464783b64ef4d14d3e6966664f68558f427a79af8f2327e11682138b
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.