ETH Price: $3,116.07 (+1.56%)
Gas: 8 Gwei

Token

Human (HUMAN)
 

Overview

Max Total Supply

5,661,472.731828703703699587 HUMAN

Holders

714

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
hattorihanso.eth
Balance
1,504.232754629629629628 HUMAN

Value
$0.00
0x15bd815a3f6fb351b06df8b0b82e0be63a529270
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Human

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/Human.sol


pragma solidity ^0.8.0;




// @author WG <https://twitter.com/whalegoddess>   

contract Human is ERC20Burnable, Ownable{

    uint256 public EMISSION_RATE = 10 ether;
    uint256 public immutable DEFAULT_START_TIMESTAMP;
    address public nft;

    mapping(uint16 => uint256) emissionsBoost;

    mapping (uint16 => uint256) tokenToLastClaimedPassive;

    constructor() ERC20("Human", "HUMAN") {
        DEFAULT_START_TIMESTAMP = 1648317600;
        nft = 0x582b874Af6A8D0eC283febE1988fb4A67c06e050;
    }

    function claimPassiveYield(uint16[] memory _tokenIds) public {
        require(block.timestamp > DEFAULT_START_TIMESTAMP, "Too early to claim");
        uint256 rewards = 0;

        for (uint i = 0; i < _tokenIds.length; i++) {
            uint16 tokenId = _tokenIds[i];
            require(
                ERC721(nft).ownerOf(tokenId) == msg.sender,
                "You are not the owner of this token"
            );

            rewards += getPassiveRewardsForId(tokenId);
            tokenToLastClaimedPassive[tokenId] = block.timestamp;
        }
        _mint(msg.sender, rewards);
    }


    function getPassiveRewardsForId(uint16 _id) public view returns (uint) {
        return (block.timestamp - (tokenToLastClaimedPassive[_id] == 0 ? DEFAULT_START_TIMESTAMP : tokenToLastClaimedPassive[_id])) * (EMISSION_RATE + emissionsBoost[_id]) / 86400;
    }

    function addTraitBoost(uint16[] memory ids, uint256[] memory boosts) external onlyOwner {
        require(ids.length == boosts.length, "ids and boosts not equal length");
        for(uint i = 0; i < ids.length; i++) {
            emissionsBoost[ids[i]] = boosts[i];
        }
    }

    function setNFTAddress(address _address) external onlyOwner {
        nft = _address;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"ids","type":"uint16[]"},{"internalType":"uint256[]","name":"boosts","type":"uint256[]"}],"name":"addTraitBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"claimPassiveYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getPassiveRewardsForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052678ac7230489e800006006553480156200001d57600080fd5b506040518060400160405280600581526020017f48756d616e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f48554d414e0000000000000000000000000000000000000000000000000000008152508160039080519060200190620000a292919062000213565b508060049080519060200190620000bb92919062000213565b505050620000de620000d26200014560201b60201c565b6200014d60201b60201c565b63623f54a06080818152505073582b874af6a8d0ec283febe1988fb4a67c06e050600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000328565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022190620002c3565b90600052602060002090601f01602090048101928262000245576000855562000291565b82601f106200026057805160ff191683800117855562000291565b8280016001018555821562000291579182015b828111156200029057825182559160200191906001019062000273565b5b509050620002a09190620002a4565b5090565b5b80821115620002bf576000816000905550600101620002a5565b5090565b60006002820490506001821680620002dc57607f821691505b60208210811415620002f357620002f2620002f9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6080516129ac620003526000396000818161053b015281816106010152610c6e01526129ac6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806369d03738116100c357806395d89b411161007c57806395d89b411461038e578063a457c2d7146103ac578063a9059cbb146103dc578063dd62ed3e1461040c578063ee321b2c1461043c578063f2fde38b146104585761014d565b806369d03738146102e257806370a08231146102fe578063715018a61461032e57806377e8e0241461033857806379cc6790146103545780638da5cb5b146103705761014d565b806323b872dd1161011557806323b872dd146101fa578063268914d61461022a578063313ce5671461025a578063395093511461027857806342966c68146102a857806347ccca02146102c45761014d565b806301b8199a1461015257806306fdde0314610170578063095ea7b31461018e57806318160ddd146101be5780631d196c48146101dc575b600080fd5b61015a610474565b6040516101679190612106565b60405180910390f35b61017861047a565b6040516101859190611ee9565b60405180910390f35b6101a860048036038101906101a39190611ac7565b61050c565b6040516101b59190611ece565b60405180910390f35b6101c661052f565b6040516101d39190612106565b60405180910390f35b6101e4610539565b6040516101f19190612106565b60405180910390f35b610214600480360381019061020f9190611a74565b61055d565b6040516102219190611ece565b60405180910390f35b610244600480360381019061023f9190611bc8565b61058c565b6040516102519190612106565b60405180910390f35b610262610647565b60405161026f9190612121565b60405180910390f35b610292600480360381019061028d9190611ac7565b610650565b60405161029f9190611ece565b60405180910390f35b6102c260048036038101906102bd9190611bf5565b6106fa565b005b6102cc61070e565b6040516102d99190611eb3565b60405180910390f35b6102fc60048036038101906102f791906119da565b610734565b005b610318600480360381019061031391906119da565b6107f4565b6040516103259190612106565b60405180910390f35b61033661083c565b005b610352600480360381019061034d9190611b50565b6108c4565b005b61036e60048036038101906103699190611ac7565b6109fc565b005b610378610a1c565b6040516103859190611eb3565b60405180910390f35b610396610a46565b6040516103a39190611ee9565b60405180910390f35b6103c660048036038101906103c19190611ac7565b610ad8565b6040516103d39190611ece565b60405180910390f35b6103f660048036038101906103f19190611ac7565b610bc2565b6040516104039190611ece565b60405180910390f35b61042660048036038101906104219190611a34565b610be5565b6040516104339190612106565b60405180910390f35b61045660048036038101906104519190611b07565b610c6c565b005b610472600480360381019061046d91906119da565b610e6b565b005b60065481565b60606003805461048990612392565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612392565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b600080610517610f63565b9050610524818585610f6b565b600191505092915050565b6000600254905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610568610f63565b9050610575858285611136565b6105808585856111c2565b60019150509392505050565b600062015180600860008461ffff1661ffff168152602001908152602001600020546006546105bb91906121d5565b6000600960008661ffff1661ffff16815260200190815260200160002054146105ff57600960008561ffff1661ffff16815260200190815260200160002054610621565b7f00000000000000000000000000000000000000000000000000000000000000005b4261062c91906122b6565b610636919061225c565b610640919061222b565b9050919050565b60006012905090565b60008061065b610f63565b90506106ef818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106ea91906121d5565b610f6b565b600191505092915050565b61070b610705610f63565b82611443565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61073c610f63565b73ffffffffffffffffffffffffffffffffffffffff1661075a610a1c565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790611fcb565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610844610f63565b73ffffffffffffffffffffffffffffffffffffffff16610862610a1c565b73ffffffffffffffffffffffffffffffffffffffff16146108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90611fcb565b60405180910390fd5b6108c2600061161a565b565b6108cc610f63565b73ffffffffffffffffffffffffffffffffffffffff166108ea610a1c565b73ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093790611fcb565b60405180910390fd5b8051825114610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b9061200b565b60405180910390fd5b60005b82518110156109f7578181815181106109a3576109a26124cb565b5b6020026020010151600860008584815181106109c2576109c16124cb565b5b602002602001015161ffff1661ffff1681526020019081526020016000208190555080806109ef906123f5565b915050610987565b505050565b610a0e82610a08610f63565b83611136565b610a188282611443565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5590612392565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8190612392565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b600080610ae3610f63565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906120ab565b60405180910390fd5b610bb68286868403610f6b565b60019250505092915050565b600080610bcd610f63565b9050610bda8185856111c2565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f00000000000000000000000000000000000000000000000000000000000000004211610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590611feb565b60405180910390fd5b6000805b8251811015610e5c576000838281518110610cf057610cef6124cb565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d6c91906120eb565b60206040518083038186803b158015610d8457600080fd5b505afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190611a07565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e099061208b565b60405180910390fd5b610e1b8161058c565b83610e2691906121d5565b925042600960008361ffff1661ffff16815260200190815260200160002081905550508080610e54906123f5565b915050610cd2565b50610e6733826116e0565b5050565b610e73610f63565b73ffffffffffffffffffffffffffffffffffffffff16610e91610a1c565b73ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90611fcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e90611f4b565b60405180910390fd5b610f608161161a565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29061206b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290611f6b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111299190612106565b60405180910390a3505050565b60006111428484610be5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111bc57818110156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590611f8b565b60405180910390fd5b6111bb8484848403610f6b565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112299061204b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990611f0b565b60405180910390fd5b6112ad838383611840565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90611fab565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c691906121d5565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161142a9190612106565b60405180910390a361143d848484611845565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa9061202b565b60405180910390fd5b6114bf82600083611840565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90611f2b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461159c91906122b6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116019190612106565b60405180910390a361161583600084611845565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906120cb565b60405180910390fd5b61175c60008383611840565b806002600082825461176e91906121d5565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c391906121d5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118289190612106565b60405180910390a361183c60008383611845565b5050565b505050565b505050565b600061185d61185884612161565b61213c565b905080838252602082019050828560208602820111156118805761187f61252e565b5b60005b858110156118b0578161189688826119b0565b845260208401935060208301925050600181019050611883565b5050509392505050565b60006118cd6118c88461218d565b61213c565b905080838252602082019050828560208602820111156118f0576118ef61252e565b5b60005b85811015611920578161190688826119c5565b8452602084019350602083019250506001810190506118f3565b5050509392505050565b60008135905061193981612931565b92915050565b60008151905061194e81612931565b92915050565b600082601f83011261196957611968612529565b5b813561197984826020860161184a565b91505092915050565b600082601f83011261199757611996612529565b5b81356119a78482602086016118ba565b91505092915050565b6000813590506119bf81612948565b92915050565b6000813590506119d48161295f565b92915050565b6000602082840312156119f0576119ef612538565b5b60006119fe8482850161192a565b91505092915050565b600060208284031215611a1d57611a1c612538565b5b6000611a2b8482850161193f565b91505092915050565b60008060408385031215611a4b57611a4a612538565b5b6000611a598582860161192a565b9250506020611a6a8582860161192a565b9150509250929050565b600080600060608486031215611a8d57611a8c612538565b5b6000611a9b8682870161192a565b9350506020611aac8682870161192a565b9250506040611abd868287016119c5565b9150509250925092565b60008060408385031215611ade57611add612538565b5b6000611aec8582860161192a565b9250506020611afd858286016119c5565b9150509250929050565b600060208284031215611b1d57611b1c612538565b5b600082013567ffffffffffffffff811115611b3b57611b3a612533565b5b611b4784828501611954565b91505092915050565b60008060408385031215611b6757611b66612538565b5b600083013567ffffffffffffffff811115611b8557611b84612533565b5b611b9185828601611954565b925050602083013567ffffffffffffffff811115611bb257611bb1612533565b5b611bbe85828601611982565b9150509250929050565b600060208284031215611bde57611bdd612538565b5b6000611bec848285016119b0565b91505092915050565b600060208284031215611c0b57611c0a612538565b5b6000611c19848285016119c5565b91505092915050565b611c2b816122ea565b82525050565b611c3a816122fc565b82525050565b6000611c4b826121b9565b611c5581856121c4565b9350611c6581856020860161235f565b611c6e8161253d565b840191505092915050565b6000611c866023836121c4565b9150611c918261254e565b604082019050919050565b6000611ca96022836121c4565b9150611cb48261259d565b604082019050919050565b6000611ccc6026836121c4565b9150611cd7826125ec565b604082019050919050565b6000611cef6022836121c4565b9150611cfa8261263b565b604082019050919050565b6000611d12601d836121c4565b9150611d1d8261268a565b602082019050919050565b6000611d356026836121c4565b9150611d40826126b3565b604082019050919050565b6000611d586020836121c4565b9150611d6382612702565b602082019050919050565b6000611d7b6012836121c4565b9150611d868261272b565b602082019050919050565b6000611d9e601f836121c4565b9150611da982612754565b602082019050919050565b6000611dc16021836121c4565b9150611dcc8261277d565b604082019050919050565b6000611de46025836121c4565b9150611def826127cc565b604082019050919050565b6000611e076024836121c4565b9150611e128261281b565b604082019050919050565b6000611e2a6023836121c4565b9150611e358261286a565b604082019050919050565b6000611e4d6025836121c4565b9150611e58826128b9565b604082019050919050565b6000611e70601f836121c4565b9150611e7b82612908565b602082019050919050565b611e8f8161234d565b82525050565b611e9e81612336565b82525050565b611ead81612340565b82525050565b6000602082019050611ec86000830184611c22565b92915050565b6000602082019050611ee36000830184611c31565b92915050565b60006020820190508181036000830152611f038184611c40565b905092915050565b60006020820190508181036000830152611f2481611c79565b9050919050565b60006020820190508181036000830152611f4481611c9c565b9050919050565b60006020820190508181036000830152611f6481611cbf565b9050919050565b60006020820190508181036000830152611f8481611ce2565b9050919050565b60006020820190508181036000830152611fa481611d05565b9050919050565b60006020820190508181036000830152611fc481611d28565b9050919050565b60006020820190508181036000830152611fe481611d4b565b9050919050565b6000602082019050818103600083015261200481611d6e565b9050919050565b6000602082019050818103600083015261202481611d91565b9050919050565b6000602082019050818103600083015261204481611db4565b9050919050565b6000602082019050818103600083015261206481611dd7565b9050919050565b6000602082019050818103600083015261208481611dfa565b9050919050565b600060208201905081810360008301526120a481611e1d565b9050919050565b600060208201905081810360008301526120c481611e40565b9050919050565b600060208201905081810360008301526120e481611e63565b9050919050565b60006020820190506121006000830184611e86565b92915050565b600060208201905061211b6000830184611e95565b92915050565b60006020820190506121366000830184611ea4565b92915050565b6000612146612157565b905061215282826123c4565b919050565b6000604051905090565b600067ffffffffffffffff82111561217c5761217b6124fa565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156121a8576121a76124fa565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b60006121e082612336565b91506121eb83612336565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122205761221f61243e565b5b828201905092915050565b600061223682612336565b915061224183612336565b9250826122515761225061246d565b5b828204905092915050565b600061226782612336565b915061227283612336565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156122ab576122aa61243e565b5b828202905092915050565b60006122c182612336565b91506122cc83612336565b9250828210156122df576122de61243e565b5b828203905092915050565b60006122f582612316565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061235882612308565b9050919050565b60005b8381101561237d578082015181840152602081019050612362565b8381111561238c576000848401525b50505050565b600060028204905060018216806123aa57607f821691505b602082108114156123be576123bd61249c565b5b50919050565b6123cd8261253d565b810181811067ffffffffffffffff821117156123ec576123eb6124fa565b5b80604052505050565b600061240082612336565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124335761243261243e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6f206561726c7920746f20636c61696d0000000000000000000000000000600082015250565b7f69647320616e6420626f6f737473206e6f7420657175616c206c656e67746800600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61293a816122ea565b811461294557600080fd5b50565b61295181612308565b811461295c57600080fd5b50565b61296881612336565b811461297357600080fd5b5056fea2646970667358221220129e3ab26f173221681de3646f35bac48422014db42813a90edbe207446b975c64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806369d03738116100c357806395d89b411161007c57806395d89b411461038e578063a457c2d7146103ac578063a9059cbb146103dc578063dd62ed3e1461040c578063ee321b2c1461043c578063f2fde38b146104585761014d565b806369d03738146102e257806370a08231146102fe578063715018a61461032e57806377e8e0241461033857806379cc6790146103545780638da5cb5b146103705761014d565b806323b872dd1161011557806323b872dd146101fa578063268914d61461022a578063313ce5671461025a578063395093511461027857806342966c68146102a857806347ccca02146102c45761014d565b806301b8199a1461015257806306fdde0314610170578063095ea7b31461018e57806318160ddd146101be5780631d196c48146101dc575b600080fd5b61015a610474565b6040516101679190612106565b60405180910390f35b61017861047a565b6040516101859190611ee9565b60405180910390f35b6101a860048036038101906101a39190611ac7565b61050c565b6040516101b59190611ece565b60405180910390f35b6101c661052f565b6040516101d39190612106565b60405180910390f35b6101e4610539565b6040516101f19190612106565b60405180910390f35b610214600480360381019061020f9190611a74565b61055d565b6040516102219190611ece565b60405180910390f35b610244600480360381019061023f9190611bc8565b61058c565b6040516102519190612106565b60405180910390f35b610262610647565b60405161026f9190612121565b60405180910390f35b610292600480360381019061028d9190611ac7565b610650565b60405161029f9190611ece565b60405180910390f35b6102c260048036038101906102bd9190611bf5565b6106fa565b005b6102cc61070e565b6040516102d99190611eb3565b60405180910390f35b6102fc60048036038101906102f791906119da565b610734565b005b610318600480360381019061031391906119da565b6107f4565b6040516103259190612106565b60405180910390f35b61033661083c565b005b610352600480360381019061034d9190611b50565b6108c4565b005b61036e60048036038101906103699190611ac7565b6109fc565b005b610378610a1c565b6040516103859190611eb3565b60405180910390f35b610396610a46565b6040516103a39190611ee9565b60405180910390f35b6103c660048036038101906103c19190611ac7565b610ad8565b6040516103d39190611ece565b60405180910390f35b6103f660048036038101906103f19190611ac7565b610bc2565b6040516104039190611ece565b60405180910390f35b61042660048036038101906104219190611a34565b610be5565b6040516104339190612106565b60405180910390f35b61045660048036038101906104519190611b07565b610c6c565b005b610472600480360381019061046d91906119da565b610e6b565b005b60065481565b60606003805461048990612392565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612392565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b600080610517610f63565b9050610524818585610f6b565b600191505092915050565b6000600254905090565b7f00000000000000000000000000000000000000000000000000000000623f54a081565b600080610568610f63565b9050610575858285611136565b6105808585856111c2565b60019150509392505050565b600062015180600860008461ffff1661ffff168152602001908152602001600020546006546105bb91906121d5565b6000600960008661ffff1661ffff16815260200190815260200160002054146105ff57600960008561ffff1661ffff16815260200190815260200160002054610621565b7f00000000000000000000000000000000000000000000000000000000623f54a05b4261062c91906122b6565b610636919061225c565b610640919061222b565b9050919050565b60006012905090565b60008061065b610f63565b90506106ef818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106ea91906121d5565b610f6b565b600191505092915050565b61070b610705610f63565b82611443565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61073c610f63565b73ffffffffffffffffffffffffffffffffffffffff1661075a610a1c565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790611fcb565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610844610f63565b73ffffffffffffffffffffffffffffffffffffffff16610862610a1c565b73ffffffffffffffffffffffffffffffffffffffff16146108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90611fcb565b60405180910390fd5b6108c2600061161a565b565b6108cc610f63565b73ffffffffffffffffffffffffffffffffffffffff166108ea610a1c565b73ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093790611fcb565b60405180910390fd5b8051825114610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b9061200b565b60405180910390fd5b60005b82518110156109f7578181815181106109a3576109a26124cb565b5b6020026020010151600860008584815181106109c2576109c16124cb565b5b602002602001015161ffff1661ffff1681526020019081526020016000208190555080806109ef906123f5565b915050610987565b505050565b610a0e82610a08610f63565b83611136565b610a188282611443565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5590612392565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8190612392565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b600080610ae3610f63565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906120ab565b60405180910390fd5b610bb68286868403610f6b565b60019250505092915050565b600080610bcd610f63565b9050610bda8185856111c2565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f00000000000000000000000000000000000000000000000000000000623f54a04211610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590611feb565b60405180910390fd5b6000805b8251811015610e5c576000838281518110610cf057610cef6124cb565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d6c91906120eb565b60206040518083038186803b158015610d8457600080fd5b505afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190611a07565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e099061208b565b60405180910390fd5b610e1b8161058c565b83610e2691906121d5565b925042600960008361ffff1661ffff16815260200190815260200160002081905550508080610e54906123f5565b915050610cd2565b50610e6733826116e0565b5050565b610e73610f63565b73ffffffffffffffffffffffffffffffffffffffff16610e91610a1c565b73ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90611fcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e90611f4b565b60405180910390fd5b610f608161161a565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29061206b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290611f6b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111299190612106565b60405180910390a3505050565b60006111428484610be5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111bc57818110156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590611f8b565b60405180910390fd5b6111bb8484848403610f6b565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112299061204b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990611f0b565b60405180910390fd5b6112ad838383611840565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90611fab565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c691906121d5565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161142a9190612106565b60405180910390a361143d848484611845565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa9061202b565b60405180910390fd5b6114bf82600083611840565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90611f2b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461159c91906122b6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116019190612106565b60405180910390a361161583600084611845565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906120cb565b60405180910390fd5b61175c60008383611840565b806002600082825461176e91906121d5565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c391906121d5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118289190612106565b60405180910390a361183c60008383611845565b5050565b505050565b505050565b600061185d61185884612161565b61213c565b905080838252602082019050828560208602820111156118805761187f61252e565b5b60005b858110156118b0578161189688826119b0565b845260208401935060208301925050600181019050611883565b5050509392505050565b60006118cd6118c88461218d565b61213c565b905080838252602082019050828560208602820111156118f0576118ef61252e565b5b60005b85811015611920578161190688826119c5565b8452602084019350602083019250506001810190506118f3565b5050509392505050565b60008135905061193981612931565b92915050565b60008151905061194e81612931565b92915050565b600082601f83011261196957611968612529565b5b813561197984826020860161184a565b91505092915050565b600082601f83011261199757611996612529565b5b81356119a78482602086016118ba565b91505092915050565b6000813590506119bf81612948565b92915050565b6000813590506119d48161295f565b92915050565b6000602082840312156119f0576119ef612538565b5b60006119fe8482850161192a565b91505092915050565b600060208284031215611a1d57611a1c612538565b5b6000611a2b8482850161193f565b91505092915050565b60008060408385031215611a4b57611a4a612538565b5b6000611a598582860161192a565b9250506020611a6a8582860161192a565b9150509250929050565b600080600060608486031215611a8d57611a8c612538565b5b6000611a9b8682870161192a565b9350506020611aac8682870161192a565b9250506040611abd868287016119c5565b9150509250925092565b60008060408385031215611ade57611add612538565b5b6000611aec8582860161192a565b9250506020611afd858286016119c5565b9150509250929050565b600060208284031215611b1d57611b1c612538565b5b600082013567ffffffffffffffff811115611b3b57611b3a612533565b5b611b4784828501611954565b91505092915050565b60008060408385031215611b6757611b66612538565b5b600083013567ffffffffffffffff811115611b8557611b84612533565b5b611b9185828601611954565b925050602083013567ffffffffffffffff811115611bb257611bb1612533565b5b611bbe85828601611982565b9150509250929050565b600060208284031215611bde57611bdd612538565b5b6000611bec848285016119b0565b91505092915050565b600060208284031215611c0b57611c0a612538565b5b6000611c19848285016119c5565b91505092915050565b611c2b816122ea565b82525050565b611c3a816122fc565b82525050565b6000611c4b826121b9565b611c5581856121c4565b9350611c6581856020860161235f565b611c6e8161253d565b840191505092915050565b6000611c866023836121c4565b9150611c918261254e565b604082019050919050565b6000611ca96022836121c4565b9150611cb48261259d565b604082019050919050565b6000611ccc6026836121c4565b9150611cd7826125ec565b604082019050919050565b6000611cef6022836121c4565b9150611cfa8261263b565b604082019050919050565b6000611d12601d836121c4565b9150611d1d8261268a565b602082019050919050565b6000611d356026836121c4565b9150611d40826126b3565b604082019050919050565b6000611d586020836121c4565b9150611d6382612702565b602082019050919050565b6000611d7b6012836121c4565b9150611d868261272b565b602082019050919050565b6000611d9e601f836121c4565b9150611da982612754565b602082019050919050565b6000611dc16021836121c4565b9150611dcc8261277d565b604082019050919050565b6000611de46025836121c4565b9150611def826127cc565b604082019050919050565b6000611e076024836121c4565b9150611e128261281b565b604082019050919050565b6000611e2a6023836121c4565b9150611e358261286a565b604082019050919050565b6000611e4d6025836121c4565b9150611e58826128b9565b604082019050919050565b6000611e70601f836121c4565b9150611e7b82612908565b602082019050919050565b611e8f8161234d565b82525050565b611e9e81612336565b82525050565b611ead81612340565b82525050565b6000602082019050611ec86000830184611c22565b92915050565b6000602082019050611ee36000830184611c31565b92915050565b60006020820190508181036000830152611f038184611c40565b905092915050565b60006020820190508181036000830152611f2481611c79565b9050919050565b60006020820190508181036000830152611f4481611c9c565b9050919050565b60006020820190508181036000830152611f6481611cbf565b9050919050565b60006020820190508181036000830152611f8481611ce2565b9050919050565b60006020820190508181036000830152611fa481611d05565b9050919050565b60006020820190508181036000830152611fc481611d28565b9050919050565b60006020820190508181036000830152611fe481611d4b565b9050919050565b6000602082019050818103600083015261200481611d6e565b9050919050565b6000602082019050818103600083015261202481611d91565b9050919050565b6000602082019050818103600083015261204481611db4565b9050919050565b6000602082019050818103600083015261206481611dd7565b9050919050565b6000602082019050818103600083015261208481611dfa565b9050919050565b600060208201905081810360008301526120a481611e1d565b9050919050565b600060208201905081810360008301526120c481611e40565b9050919050565b600060208201905081810360008301526120e481611e63565b9050919050565b60006020820190506121006000830184611e86565b92915050565b600060208201905061211b6000830184611e95565b92915050565b60006020820190506121366000830184611ea4565b92915050565b6000612146612157565b905061215282826123c4565b919050565b6000604051905090565b600067ffffffffffffffff82111561217c5761217b6124fa565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156121a8576121a76124fa565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b60006121e082612336565b91506121eb83612336565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122205761221f61243e565b5b828201905092915050565b600061223682612336565b915061224183612336565b9250826122515761225061246d565b5b828204905092915050565b600061226782612336565b915061227283612336565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156122ab576122aa61243e565b5b828202905092915050565b60006122c182612336565b91506122cc83612336565b9250828210156122df576122de61243e565b5b828203905092915050565b60006122f582612316565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061235882612308565b9050919050565b60005b8381101561237d578082015181840152602081019050612362565b8381111561238c576000848401525b50505050565b600060028204905060018216806123aa57607f821691505b602082108114156123be576123bd61249c565b5b50919050565b6123cd8261253d565b810181811067ffffffffffffffff821117156123ec576123eb6124fa565b5b80604052505050565b600061240082612336565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124335761243261243e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6f206561726c7920746f20636c61696d0000000000000000000000000000600082015250565b7f69647320616e6420626f6f737473206e6f7420657175616c206c656e67746800600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61293a816122ea565b811461294557600080fd5b50565b61295181612308565b811461295c57600080fd5b50565b61296881612336565b811461297357600080fd5b5056fea2646970667358221220129e3ab26f173221681de3646f35bac48422014db42813a90edbe207446b975c64736f6c63430008070033

Deployed Bytecode Sourcemap

55064:1729:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55113:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42983:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45334:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44103:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55159:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46115:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56134:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43945:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46819:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54361:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55214:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56697:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44274:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36406:103;;;:::i;:::-;;56403:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54771:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35755:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43202:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47562:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44607:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55513:611;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36664:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55113:39;;;;:::o;42983:100::-;43037:13;43070:5;43063:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42983:100;:::o;45334:201::-;45417:4;45434:13;45450:12;:10;:12::i;:::-;45434:28;;45473:32;45482:5;45489:7;45498:6;45473:8;:32::i;:::-;45523:4;45516:11;;;45334:201;;;;:::o;44103:108::-;44164:7;44191:12;;44184:19;;44103:108;:::o;55159:48::-;;;:::o;46115:295::-;46246:4;46263:15;46281:12;:10;:12::i;:::-;46263:30;;46304:38;46320:4;46326:7;46335:6;46304:15;:38::i;:::-;46353:27;46363:4;46369:2;46373:6;46353:9;:27::i;:::-;46398:4;46391:11;;;46115:295;;;;;:::o;56134:261::-;56199:4;56382:5;56359:14;:19;56374:3;56359:19;;;;;;;;;;;;;;;;56343:13;;:35;;;;:::i;:::-;56277:1;56243:25;:30;56269:3;56243:30;;;;;;;;;;;;;;;;:35;:94;;56307:25;:30;56333:3;56307:30;;;;;;;;;;;;;;;;56243:94;;;56281:23;56243:94;56224:15;:114;;;;:::i;:::-;56223:156;;;;:::i;:::-;:164;;;;:::i;:::-;56216:171;;56134:261;;;:::o;43945:93::-;44003:5;44028:2;44021:9;;43945:93;:::o;46819:240::-;46907:4;46924:13;46940:12;:10;:12::i;:::-;46924:28;;46963:66;46972:5;46979:7;47018:10;46988:11;:18;47000:5;46988:18;;;;;;;;;;;;;;;:27;47007:7;46988:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;46963:8;:66::i;:::-;47047:4;47040:11;;;46819:240;;;;:::o;54361:91::-;54417:27;54423:12;:10;:12::i;:::-;54437:6;54417:5;:27::i;:::-;54361:91;:::o;55214:18::-;;;;;;;;;;;;;:::o;56697:93::-;35986:12;:10;:12::i;:::-;35975:23;;:7;:5;:7::i;:::-;:23;;;35967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56774:8:::1;56768:3;;:14;;;;;;;;;;;;;;;;;;56697:93:::0;:::o;44274:127::-;44348:7;44375:9;:18;44385:7;44375:18;;;;;;;;;;;;;;;;44368:25;;44274:127;;;:::o;36406:103::-;35986:12;:10;:12::i;:::-;35975:23;;:7;:5;:7::i;:::-;:23;;;35967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36471:30:::1;36498:1;36471:18;:30::i;:::-;36406:103::o:0;56403:286::-;35986:12;:10;:12::i;:::-;35975:23;;:7;:5;:7::i;:::-;:23;;;35967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56524:6:::1;:13;56510:3;:10;:27;56502:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56588:6;56584:98;56604:3;:10;56600:1;:14;56584:98;;;56661:6;56668:1;56661:9;;;;;;;;:::i;:::-;;;;;;;;56636:14;:22;56651:3;56655:1;56651:6;;;;;;;;:::i;:::-;;;;;;;;56636:22;;;;;;;;;;;;;;;:34;;;;56616:3;;;;;:::i;:::-;;;;56584:98;;;;56403:286:::0;;:::o;54771:164::-;54848:46;54864:7;54873:12;:10;:12::i;:::-;54887:6;54848:15;:46::i;:::-;54905:22;54911:7;54920:6;54905:5;:22::i;:::-;54771:164;;:::o;35755:87::-;35801:7;35828:6;;;;;;;;;;;35821:13;;35755:87;:::o;43202:104::-;43258:13;43291:7;43284:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43202:104;:::o;47562:438::-;47655:4;47672:13;47688:12;:10;:12::i;:::-;47672:28;;47711:24;47738:11;:18;47750:5;47738:18;;;;;;;;;;;;;;;:27;47757:7;47738:27;;;;;;;;;;;;;;;;47711:54;;47804:15;47784:16;:35;;47776:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;47897:60;47906:5;47913:7;47941:15;47922:16;:34;47897:8;:60::i;:::-;47988:4;47981:11;;;;47562:438;;;;:::o;44607:193::-;44686:4;44703:13;44719:12;:10;:12::i;:::-;44703:28;;44742;44752:5;44759:2;44763:6;44742:9;:28::i;:::-;44788:4;44781:11;;;44607:193;;;;:::o;44863:151::-;44952:7;44979:11;:18;44991:5;44979:18;;;;;;;;;;;;;;;:27;44998:7;44979:27;;;;;;;;;;;;;;;;44972:34;;44863:151;;;;:::o;55513:611::-;55611:23;55593:15;:41;55585:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;55668:15;55705:6;55700:380;55721:9;:16;55717:1;:20;55700:380;;;55759:14;55776:9;55786:1;55776:12;;;;;;;;:::i;:::-;;;;;;;;55759:29;;55861:10;55829:42;;55836:3;;;;;;;;;;;55829:19;;;55849:7;55829:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;55803:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;55970:31;55993:7;55970:22;:31::i;:::-;55959:42;;;;;:::i;:::-;;;56053:15;56016:25;:34;56042:7;56016:34;;;;;;;;;;;;;;;:52;;;;55744:336;55739:3;;;;;:::i;:::-;;;;55700:380;;;;56090:26;56096:10;56108:7;56090:5;:26::i;:::-;55574:550;55513:611;:::o;36664:201::-;35986:12;:10;:12::i;:::-;35975:23;;:7;:5;:7::i;:::-;:23;;;35967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36773:1:::1;36753:22;;:8;:22;;;;36745:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36829:28;36848:8;36829:18;:28::i;:::-;36664:201:::0;:::o;19958:98::-;20011:7;20038:10;20031:17;;19958:98;:::o;51198:380::-;51351:1;51334:19;;:5;:19;;;;51326:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51432:1;51413:21;;:7;:21;;;;51405:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51516:6;51486:11;:18;51498:5;51486:18;;;;;;;;;;;;;;;:27;51505:7;51486:27;;;;;;;;;;;;;;;:36;;;;51554:7;51538:32;;51547:5;51538:32;;;51563:6;51538:32;;;;;;:::i;:::-;;;;;;;;51198:380;;;:::o;51865:453::-;52000:24;52027:25;52037:5;52044:7;52027:9;:25::i;:::-;52000:52;;52087:17;52067:16;:37;52063:248;;52149:6;52129:16;:26;;52121:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52233:51;52242:5;52249:7;52277:6;52258:16;:25;52233:8;:51::i;:::-;52063:248;51989:329;51865:453;;;:::o;48479:671::-;48626:1;48610:18;;:4;:18;;;;48602:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48703:1;48689:16;;:2;:16;;;;48681:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48758:38;48779:4;48785:2;48789:6;48758:20;:38::i;:::-;48809:19;48831:9;:15;48841:4;48831:15;;;;;;;;;;;;;;;;48809:37;;48880:6;48865:11;:21;;48857:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48997:6;48983:11;:20;48965:9;:15;48975:4;48965:15;;;;;;;;;;;;;;;:38;;;;49042:6;49025:9;:13;49035:2;49025:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;49081:2;49066:26;;49075:4;49066:26;;;49085:6;49066:26;;;;;;:::i;:::-;;;;;;;;49105:37;49125:4;49131:2;49135:6;49105:19;:37::i;:::-;48591:559;48479:671;;;:::o;50169:591::-;50272:1;50253:21;;:7;:21;;;;50245:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50325:49;50346:7;50363:1;50367:6;50325:20;:49::i;:::-;50387:22;50412:9;:18;50422:7;50412:18;;;;;;;;;;;;;;;;50387:43;;50467:6;50449:14;:24;;50441:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50586:6;50569:14;:23;50548:9;:18;50558:7;50548:18;;;;;;;;;;;;;;;:44;;;;50630:6;50614:12;;:22;;;;;;;:::i;:::-;;;;;;;;50680:1;50654:37;;50663:7;50654:37;;;50684:6;50654:37;;;;;;:::i;:::-;;;;;;;;50704:48;50724:7;50741:1;50745:6;50704:19;:48::i;:::-;50234:526;50169:591;;:::o;37025:191::-;37099:16;37118:6;;;;;;;;;;;37099:25;;37144:8;37135:6;;:17;;;;;;;;;;;;;;;;;;37199:8;37168:40;;37189:8;37168:40;;;;;;;;;;;;37088:128;37025:191;:::o;49437:399::-;49540:1;49521:21;;:7;:21;;;;49513:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49591:49;49620:1;49624:7;49633:6;49591:20;:49::i;:::-;49669:6;49653:12;;:22;;;;;;;:::i;:::-;;;;;;;;49708:6;49686:9;:18;49696:7;49686:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;49751:7;49730:37;;49747:1;49730:37;;;49760:6;49730:37;;;;;;:::i;:::-;;;;;;;;49780:48;49808:1;49812:7;49821:6;49780:19;:48::i;:::-;49437:399;;:::o;52918:125::-;;;;:::o;53647:124::-;;;;:::o;23:719:1:-;118:5;143:80;159:63;215:6;159:63;:::i;:::-;143:80;:::i;:::-;134:89;;243:5;272:6;265:5;258:21;306:4;299:5;295:16;288:23;;332:6;382:3;374:4;366:6;362:17;357:3;353:27;350:36;347:143;;;401:79;;:::i;:::-;347:143;514:1;499:237;524:6;521:1;518:13;499:237;;;592:3;621:36;653:3;641:10;621:36;:::i;:::-;616:3;609:49;687:4;682:3;678:14;671:21;;721:4;716:3;712:14;705:21;;559:177;546:1;543;539:9;534:14;;499:237;;;503:14;124:618;;23:719;;;;;:::o;765:722::-;861:5;886:81;902:64;959:6;902:64;:::i;:::-;886:81;:::i;:::-;877:90;;987:5;1016:6;1009:5;1002:21;1050:4;1043:5;1039:16;1032:23;;1076:6;1126:3;1118:4;1110:6;1106:17;1101:3;1097:27;1094:36;1091:143;;;1145:79;;:::i;:::-;1091:143;1258:1;1243:238;1268:6;1265:1;1262:13;1243:238;;;1336:3;1365:37;1398:3;1386:10;1365:37;:::i;:::-;1360:3;1353:50;1432:4;1427:3;1423:14;1416:21;;1466:4;1461:3;1457:14;1450:21;;1303:178;1290:1;1287;1283:9;1278:14;;1243:238;;;1247:14;867:620;;765:722;;;;;:::o;1493:139::-;1539:5;1577:6;1564:20;1555:29;;1593:33;1620:5;1593:33;:::i;:::-;1493:139;;;;:::o;1638:143::-;1695:5;1726:6;1720:13;1711:22;;1742:33;1769:5;1742:33;:::i;:::-;1638:143;;;;:::o;1803:368::-;1873:5;1922:3;1915:4;1907:6;1903:17;1899:27;1889:122;;1930:79;;:::i;:::-;1889:122;2047:6;2034:20;2072:93;2161:3;2153:6;2146:4;2138:6;2134:17;2072:93;:::i;:::-;2063:102;;1879:292;1803:368;;;;:::o;2194:370::-;2265:5;2314:3;2307:4;2299:6;2295:17;2291:27;2281:122;;2322:79;;:::i;:::-;2281:122;2439:6;2426:20;2464:94;2554:3;2546:6;2539:4;2531:6;2527:17;2464:94;:::i;:::-;2455:103;;2271:293;2194:370;;;;:::o;2570:137::-;2615:5;2653:6;2640:20;2631:29;;2669:32;2695:5;2669:32;:::i;:::-;2570:137;;;;:::o;2713:139::-;2759:5;2797:6;2784:20;2775:29;;2813:33;2840:5;2813:33;:::i;:::-;2713:139;;;;:::o;2858:329::-;2917:6;2966:2;2954:9;2945:7;2941:23;2937:32;2934:119;;;2972:79;;:::i;:::-;2934:119;3092:1;3117:53;3162:7;3153:6;3142:9;3138:22;3117:53;:::i;:::-;3107:63;;3063:117;2858:329;;;;:::o;3193:351::-;3263:6;3312:2;3300:9;3291:7;3287:23;3283:32;3280:119;;;3318:79;;:::i;:::-;3280:119;3438:1;3463:64;3519:7;3510:6;3499:9;3495:22;3463:64;:::i;:::-;3453:74;;3409:128;3193:351;;;;:::o;3550:474::-;3618:6;3626;3675:2;3663:9;3654:7;3650:23;3646:32;3643:119;;;3681:79;;:::i;:::-;3643:119;3801:1;3826:53;3871:7;3862:6;3851:9;3847:22;3826:53;:::i;:::-;3816:63;;3772:117;3928:2;3954:53;3999:7;3990:6;3979:9;3975:22;3954:53;:::i;:::-;3944:63;;3899:118;3550:474;;;;;:::o;4030:619::-;4107:6;4115;4123;4172:2;4160:9;4151:7;4147:23;4143:32;4140:119;;;4178:79;;:::i;:::-;4140:119;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4030:619;;;;;:::o;4655:474::-;4723:6;4731;4780:2;4768:9;4759:7;4755:23;4751:32;4748:119;;;4786:79;;:::i;:::-;4748:119;4906:1;4931:53;4976:7;4967:6;4956:9;4952:22;4931:53;:::i;:::-;4921:63;;4877:117;5033:2;5059:53;5104:7;5095:6;5084:9;5080:22;5059:53;:::i;:::-;5049:63;;5004:118;4655:474;;;;;:::o;5135:537::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:119;;;5273:79;;:::i;:::-;5235:119;5421:1;5410:9;5406:17;5393:31;5451:18;5443:6;5440:30;5437:117;;;5473:79;;:::i;:::-;5437:117;5578:77;5647:7;5638:6;5627:9;5623:22;5578:77;:::i;:::-;5568:87;;5364:301;5135:537;;;;:::o;5678:892::-;5795:6;5803;5852:2;5840:9;5831:7;5827:23;5823:32;5820:119;;;5858:79;;:::i;:::-;5820:119;6006:1;5995:9;5991:17;5978:31;6036:18;6028:6;6025:30;6022:117;;;6058:79;;:::i;:::-;6022:117;6163:77;6232:7;6223:6;6212:9;6208:22;6163:77;:::i;:::-;6153:87;;5949:301;6317:2;6306:9;6302:18;6289:32;6348:18;6340:6;6337:30;6334:117;;;6370:79;;:::i;:::-;6334:117;6475:78;6545:7;6536:6;6525:9;6521:22;6475:78;:::i;:::-;6465:88;;6260:303;5678:892;;;;;:::o;6576:327::-;6634:6;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:52;6878:7;6869:6;6858:9;6854:22;6834:52;:::i;:::-;6824:62;;6780:116;6576:327;;;;:::o;6909:329::-;6968:6;7017:2;7005:9;6996:7;6992:23;6988:32;6985:119;;;7023:79;;:::i;:::-;6985:119;7143:1;7168:53;7213:7;7204:6;7193:9;7189:22;7168:53;:::i;:::-;7158:63;;7114:117;6909:329;;;;:::o;7244:118::-;7331:24;7349:5;7331:24;:::i;:::-;7326:3;7319:37;7244:118;;:::o;7368:109::-;7449:21;7464:5;7449:21;:::i;:::-;7444:3;7437:34;7368:109;;:::o;7483:364::-;7571:3;7599:39;7632:5;7599:39;:::i;:::-;7654:71;7718:6;7713:3;7654:71;:::i;:::-;7647:78;;7734:52;7779:6;7774:3;7767:4;7760:5;7756:16;7734:52;:::i;:::-;7811:29;7833:6;7811:29;:::i;:::-;7806:3;7802:39;7795:46;;7575:272;7483:364;;;;:::o;7853:366::-;7995:3;8016:67;8080:2;8075:3;8016:67;:::i;:::-;8009:74;;8092:93;8181:3;8092:93;:::i;:::-;8210:2;8205:3;8201:12;8194:19;;7853:366;;;:::o;8225:::-;8367:3;8388:67;8452:2;8447:3;8388:67;:::i;:::-;8381:74;;8464:93;8553:3;8464:93;:::i;:::-;8582:2;8577:3;8573:12;8566:19;;8225:366;;;:::o;8597:::-;8739:3;8760:67;8824:2;8819:3;8760:67;:::i;:::-;8753:74;;8836:93;8925:3;8836:93;:::i;:::-;8954:2;8949:3;8945:12;8938:19;;8597:366;;;:::o;8969:::-;9111:3;9132:67;9196:2;9191:3;9132:67;:::i;:::-;9125:74;;9208:93;9297:3;9208:93;:::i;:::-;9326:2;9321:3;9317:12;9310:19;;8969:366;;;:::o;9341:::-;9483:3;9504:67;9568:2;9563:3;9504:67;:::i;:::-;9497:74;;9580:93;9669:3;9580:93;:::i;:::-;9698:2;9693:3;9689:12;9682:19;;9341:366;;;:::o;9713:::-;9855:3;9876:67;9940:2;9935:3;9876:67;:::i;:::-;9869:74;;9952:93;10041:3;9952:93;:::i;:::-;10070:2;10065:3;10061:12;10054:19;;9713:366;;;:::o;10085:::-;10227:3;10248:67;10312:2;10307:3;10248:67;:::i;:::-;10241:74;;10324:93;10413:3;10324:93;:::i;:::-;10442:2;10437:3;10433:12;10426:19;;10085:366;;;:::o;10457:::-;10599:3;10620:67;10684:2;10679:3;10620:67;:::i;:::-;10613:74;;10696:93;10785:3;10696:93;:::i;:::-;10814:2;10809:3;10805:12;10798:19;;10457:366;;;:::o;10829:::-;10971:3;10992:67;11056:2;11051:3;10992:67;:::i;:::-;10985:74;;11068:93;11157:3;11068:93;:::i;:::-;11186:2;11181:3;11177:12;11170:19;;10829:366;;;:::o;11201:::-;11343:3;11364:67;11428:2;11423:3;11364:67;:::i;:::-;11357:74;;11440:93;11529:3;11440:93;:::i;:::-;11558:2;11553:3;11549:12;11542:19;;11201:366;;;:::o;11573:::-;11715:3;11736:67;11800:2;11795:3;11736:67;:::i;:::-;11729:74;;11812:93;11901:3;11812:93;:::i;:::-;11930:2;11925:3;11921:12;11914:19;;11573:366;;;:::o;11945:::-;12087:3;12108:67;12172:2;12167:3;12108:67;:::i;:::-;12101:74;;12184:93;12273:3;12184:93;:::i;:::-;12302:2;12297:3;12293:12;12286:19;;11945:366;;;:::o;12317:::-;12459:3;12480:67;12544:2;12539:3;12480:67;:::i;:::-;12473:74;;12556:93;12645:3;12556:93;:::i;:::-;12674:2;12669:3;12665:12;12658:19;;12317:366;;;:::o;12689:::-;12831:3;12852:67;12916:2;12911:3;12852:67;:::i;:::-;12845:74;;12928:93;13017:3;12928:93;:::i;:::-;13046:2;13041:3;13037:12;13030:19;;12689:366;;;:::o;13061:::-;13203:3;13224:67;13288:2;13283:3;13224:67;:::i;:::-;13217:74;;13300:93;13389:3;13300:93;:::i;:::-;13418:2;13413:3;13409:12;13402:19;;13061:366;;;:::o;13433:129::-;13519:36;13549:5;13519:36;:::i;:::-;13514:3;13507:49;13433:129;;:::o;13568:118::-;13655:24;13673:5;13655:24;:::i;:::-;13650:3;13643:37;13568:118;;:::o;13692:112::-;13775:22;13791:5;13775:22;:::i;:::-;13770:3;13763:35;13692:112;;:::o;13810:222::-;13903:4;13941:2;13930:9;13926:18;13918:26;;13954:71;14022:1;14011:9;14007:17;13998:6;13954:71;:::i;:::-;13810:222;;;;:::o;14038:210::-;14125:4;14163:2;14152:9;14148:18;14140:26;;14176:65;14238:1;14227:9;14223:17;14214:6;14176:65;:::i;:::-;14038:210;;;;:::o;14254:313::-;14367:4;14405:2;14394:9;14390:18;14382:26;;14454:9;14448:4;14444:20;14440:1;14429:9;14425:17;14418:47;14482:78;14555:4;14546:6;14482:78;:::i;:::-;14474:86;;14254:313;;;;:::o;14573:419::-;14739:4;14777:2;14766:9;14762:18;14754:26;;14826:9;14820:4;14816:20;14812:1;14801:9;14797:17;14790:47;14854:131;14980:4;14854:131;:::i;:::-;14846:139;;14573:419;;;:::o;14998:::-;15164:4;15202:2;15191:9;15187:18;15179:26;;15251:9;15245:4;15241:20;15237:1;15226:9;15222:17;15215:47;15279:131;15405:4;15279:131;:::i;:::-;15271:139;;14998:419;;;:::o;15423:::-;15589:4;15627:2;15616:9;15612:18;15604:26;;15676:9;15670:4;15666:20;15662:1;15651:9;15647:17;15640:47;15704:131;15830:4;15704:131;:::i;:::-;15696:139;;15423:419;;;:::o;15848:::-;16014:4;16052:2;16041:9;16037:18;16029:26;;16101:9;16095:4;16091:20;16087:1;16076:9;16072:17;16065:47;16129:131;16255:4;16129:131;:::i;:::-;16121:139;;15848:419;;;:::o;16273:::-;16439:4;16477:2;16466:9;16462:18;16454:26;;16526:9;16520:4;16516:20;16512:1;16501:9;16497:17;16490:47;16554:131;16680:4;16554:131;:::i;:::-;16546:139;;16273:419;;;:::o;16698:::-;16864:4;16902:2;16891:9;16887:18;16879:26;;16951:9;16945:4;16941:20;16937:1;16926:9;16922:17;16915:47;16979:131;17105:4;16979:131;:::i;:::-;16971:139;;16698:419;;;:::o;17123:::-;17289:4;17327:2;17316:9;17312:18;17304:26;;17376:9;17370:4;17366:20;17362:1;17351:9;17347:17;17340:47;17404:131;17530:4;17404:131;:::i;:::-;17396:139;;17123:419;;;:::o;17548:::-;17714:4;17752:2;17741:9;17737:18;17729:26;;17801:9;17795:4;17791:20;17787:1;17776:9;17772:17;17765:47;17829:131;17955:4;17829:131;:::i;:::-;17821:139;;17548:419;;;:::o;17973:::-;18139:4;18177:2;18166:9;18162:18;18154:26;;18226:9;18220:4;18216:20;18212:1;18201:9;18197:17;18190:47;18254:131;18380:4;18254:131;:::i;:::-;18246:139;;17973:419;;;:::o;18398:::-;18564:4;18602:2;18591:9;18587:18;18579:26;;18651:9;18645:4;18641:20;18637:1;18626:9;18622:17;18615:47;18679:131;18805:4;18679:131;:::i;:::-;18671:139;;18398:419;;;:::o;18823:::-;18989:4;19027:2;19016:9;19012:18;19004:26;;19076:9;19070:4;19066:20;19062:1;19051:9;19047:17;19040:47;19104:131;19230:4;19104:131;:::i;:::-;19096:139;;18823:419;;;:::o;19248:::-;19414:4;19452:2;19441:9;19437:18;19429:26;;19501:9;19495:4;19491:20;19487:1;19476:9;19472:17;19465:47;19529:131;19655:4;19529:131;:::i;:::-;19521:139;;19248:419;;;:::o;19673:::-;19839:4;19877:2;19866:9;19862:18;19854:26;;19926:9;19920:4;19916:20;19912:1;19901:9;19897:17;19890:47;19954:131;20080:4;19954:131;:::i;:::-;19946:139;;19673:419;;;:::o;20098:::-;20264:4;20302:2;20291:9;20287:18;20279:26;;20351:9;20345:4;20341:20;20337:1;20326:9;20322:17;20315:47;20379:131;20505:4;20379:131;:::i;:::-;20371:139;;20098:419;;;:::o;20523:::-;20689:4;20727:2;20716:9;20712:18;20704:26;;20776:9;20770:4;20766:20;20762:1;20751:9;20747:17;20740:47;20804:131;20930:4;20804:131;:::i;:::-;20796:139;;20523:419;;;:::o;20948:220::-;21040:4;21078:2;21067:9;21063:18;21055:26;;21091:70;21158:1;21147:9;21143:17;21134:6;21091:70;:::i;:::-;20948:220;;;;:::o;21174:222::-;21267:4;21305:2;21294:9;21290:18;21282:26;;21318:71;21386:1;21375:9;21371:17;21362:6;21318:71;:::i;:::-;21174:222;;;;:::o;21402:214::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21542:67;21606:1;21595:9;21591:17;21582:6;21542:67;:::i;:::-;21402:214;;;;:::o;21622:129::-;21656:6;21683:20;;:::i;:::-;21673:30;;21712:33;21740:4;21732:6;21712:33;:::i;:::-;21622:129;;;:::o;21757:75::-;21790:6;21823:2;21817:9;21807:19;;21757:75;:::o;21838:310::-;21914:4;22004:18;21996:6;21993:30;21990:56;;;22026:18;;:::i;:::-;21990:56;22076:4;22068:6;22064:17;22056:25;;22136:4;22130;22126:15;22118:23;;21838:310;;;:::o;22154:311::-;22231:4;22321:18;22313:6;22310:30;22307:56;;;22343:18;;:::i;:::-;22307:56;22393:4;22385:6;22381:17;22373:25;;22453:4;22447;22443:15;22435:23;;22154:311;;;:::o;22471:99::-;22523:6;22557:5;22551:12;22541:22;;22471:99;;;:::o;22576:169::-;22660:11;22694:6;22689:3;22682:19;22734:4;22729:3;22725:14;22710:29;;22576:169;;;;:::o;22751:305::-;22791:3;22810:20;22828:1;22810:20;:::i;:::-;22805:25;;22844:20;22862:1;22844:20;:::i;:::-;22839:25;;22998:1;22930:66;22926:74;22923:1;22920:81;22917:107;;;23004:18;;:::i;:::-;22917:107;23048:1;23045;23041:9;23034:16;;22751:305;;;;:::o;23062:185::-;23102:1;23119:20;23137:1;23119:20;:::i;:::-;23114:25;;23153:20;23171:1;23153:20;:::i;:::-;23148:25;;23192:1;23182:35;;23197:18;;:::i;:::-;23182:35;23239:1;23236;23232:9;23227:14;;23062:185;;;;:::o;23253:348::-;23293:7;23316:20;23334:1;23316:20;:::i;:::-;23311:25;;23350:20;23368:1;23350:20;:::i;:::-;23345:25;;23538:1;23470:66;23466:74;23463:1;23460:81;23455:1;23448:9;23441:17;23437:105;23434:131;;;23545:18;;:::i;:::-;23434:131;23593:1;23590;23586:9;23575:20;;23253:348;;;;:::o;23607:191::-;23647:4;23667:20;23685:1;23667:20;:::i;:::-;23662:25;;23701:20;23719:1;23701:20;:::i;:::-;23696:25;;23740:1;23737;23734:8;23731:34;;;23745:18;;:::i;:::-;23731:34;23790:1;23787;23783:9;23775:17;;23607:191;;;;:::o;23804:96::-;23841:7;23870:24;23888:5;23870:24;:::i;:::-;23859:35;;23804:96;;;:::o;23906:90::-;23940:7;23983:5;23976:13;23969:21;23958:32;;23906:90;;;:::o;24002:89::-;24038:7;24078:6;24071:5;24067:18;24056:29;;24002:89;;;:::o;24097:126::-;24134:7;24174:42;24167:5;24163:54;24152:65;;24097:126;;;:::o;24229:77::-;24266:7;24295:5;24284:16;;24229:77;;;:::o;24312:86::-;24347:7;24387:4;24380:5;24376:16;24365:27;;24312:86;;;:::o;24404:111::-;24453:9;24486:23;24503:5;24486:23;:::i;:::-;24473:36;;24404:111;;;:::o;24521:307::-;24589:1;24599:113;24613:6;24610:1;24607:13;24599:113;;;24698:1;24693:3;24689:11;24683:18;24679:1;24674:3;24670:11;24663:39;24635:2;24632:1;24628:10;24623:15;;24599:113;;;24730:6;24727:1;24724:13;24721:101;;;24810:1;24801:6;24796:3;24792:16;24785:27;24721:101;24570:258;24521:307;;;:::o;24834:320::-;24878:6;24915:1;24909:4;24905:12;24895:22;;24962:1;24956:4;24952:12;24983:18;24973:81;;25039:4;25031:6;25027:17;25017:27;;24973:81;25101:2;25093:6;25090:14;25070:18;25067:38;25064:84;;;25120:18;;:::i;:::-;25064:84;24885:269;24834:320;;;:::o;25160:281::-;25243:27;25265:4;25243:27;:::i;:::-;25235:6;25231:40;25373:6;25361:10;25358:22;25337:18;25325:10;25322:34;25319:62;25316:88;;;25384:18;;:::i;:::-;25316:88;25424:10;25420:2;25413:22;25203:238;25160:281;;:::o;25447:233::-;25486:3;25509:24;25527:5;25509:24;:::i;:::-;25500:33;;25555:66;25548:5;25545:77;25542:103;;;25625:18;;:::i;:::-;25542:103;25672:1;25665:5;25661:13;25654:20;;25447:233;;;:::o;25686:180::-;25734:77;25731:1;25724:88;25831:4;25828:1;25821:15;25855:4;25852:1;25845:15;25872:180;25920:77;25917:1;25910:88;26017:4;26014:1;26007:15;26041:4;26038:1;26031:15;26058:180;26106:77;26103:1;26096:88;26203:4;26200:1;26193:15;26227:4;26224:1;26217:15;26244:180;26292:77;26289:1;26282:88;26389:4;26386:1;26379:15;26413:4;26410:1;26403:15;26430:180;26478:77;26475:1;26468:88;26575:4;26572:1;26565:15;26599:4;26596:1;26589:15;26616:117;26725:1;26722;26715:12;26739:117;26848:1;26845;26838:12;26862:117;26971:1;26968;26961:12;26985:117;27094:1;27091;27084:12;27108:102;27149:6;27200:2;27196:7;27191:2;27184:5;27180:14;27176:28;27166:38;;27108:102;;;:::o;27216:222::-;27356:34;27352:1;27344:6;27340:14;27333:58;27425:5;27420:2;27412:6;27408:15;27401:30;27216:222;:::o;27444:221::-;27584:34;27580:1;27572:6;27568:14;27561:58;27653:4;27648:2;27640:6;27636:15;27629:29;27444:221;:::o;27671:225::-;27811:34;27807:1;27799:6;27795:14;27788:58;27880:8;27875:2;27867:6;27863:15;27856:33;27671:225;:::o;27902:221::-;28042:34;28038:1;28030:6;28026:14;28019:58;28111:4;28106:2;28098:6;28094:15;28087:29;27902:221;:::o;28129:179::-;28269:31;28265:1;28257:6;28253:14;28246:55;28129:179;:::o;28314:225::-;28454:34;28450:1;28442:6;28438:14;28431:58;28523:8;28518:2;28510:6;28506:15;28499:33;28314:225;:::o;28545:182::-;28685:34;28681:1;28673:6;28669:14;28662:58;28545:182;:::o;28733:168::-;28873:20;28869:1;28861:6;28857:14;28850:44;28733:168;:::o;28907:181::-;29047:33;29043:1;29035:6;29031:14;29024:57;28907:181;:::o;29094:220::-;29234:34;29230:1;29222:6;29218:14;29211:58;29303:3;29298:2;29290:6;29286:15;29279:28;29094:220;:::o;29320:224::-;29460:34;29456:1;29448:6;29444:14;29437:58;29529:7;29524:2;29516:6;29512:15;29505:32;29320:224;:::o;29550:223::-;29690:34;29686:1;29678:6;29674:14;29667:58;29759:6;29754:2;29746:6;29742:15;29735:31;29550:223;:::o;29779:222::-;29919:34;29915:1;29907:6;29903:14;29896:58;29988:5;29983:2;29975:6;29971:15;29964:30;29779:222;:::o;30007:224::-;30147:34;30143:1;30135:6;30131:14;30124:58;30216:7;30211:2;30203:6;30199:15;30192:32;30007:224;:::o;30237:181::-;30377:33;30373:1;30365:6;30361:14;30354:57;30237:181;:::o;30424:122::-;30497:24;30515:5;30497:24;:::i;:::-;30490:5;30487:35;30477:63;;30536:1;30533;30526:12;30477:63;30424:122;:::o;30552:120::-;30624:23;30641:5;30624:23;:::i;:::-;30617:5;30614:34;30604:62;;30662:1;30659;30652:12;30604:62;30552:120;:::o;30678:122::-;30751:24;30769:5;30751:24;:::i;:::-;30744:5;30741:35;30731:63;;30790:1;30787;30780:12;30731:63;30678:122;:::o

Swarm Source

ipfs://129e3ab26f173221681de3646f35bac48422014db42813a90edbe207446b975c
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.