ETH Price: $2,472.47 (+0.73%)
 

Overview

Max Total Supply

0 RELATION

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0xtyz.eth
Balance
1 RELATION
0x10Dbfcfd43B1C9bCcA0b5D0D895E528965f1A09b
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:
TheRelationDAO

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-02-13
*/

// 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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/relationdao.sol


pragma solidity ^0.8.2;


contract TheRelationDAO is ERC721 {
    uint256 public next_user;

    mapping(uint256 => string) profile;

    mapping(uint256 => uint256) follow_sum;
    mapping(uint256 => uint256) followed_sum;
    mapping(uint256 => mapping(uint256 => bool)) follow_table;

    event FollowEvt(uint256 indexed _from, uint256 indexed _to);
    event UnFollowEvt(uint256 indexed _from, uint256 indexed _to);
    event RegisterEvt(address indexed _owner, uint256 _from, string _profile);
    event ProfileEvt(uint256 indexed _from, string _profile);

    function mint(string memory _URI) external {
        uint256 id = next_user;
        _safeMint(msg.sender, id);
        profile[id] = _URI;
        next_user++;
        emit RegisterEvt(msg.sender, id, _URI);
    }

    function update(uint256 _from, string memory _URI) external {
        require(_isApprovedOrOwner(msg.sender, _from));
        profile[_from] = _URI;
        emit ProfileEvt(_from, _URI);
    }

    function follow(uint256 _from, uint256 _to) external {
        require(_from != _to, "TheRelationDao: error");
        require(_exists(_to), "TheRelationDao: nonexistent token");
        require(_isApprovedOrOwner(msg.sender, _from));
        require(!is_follow(_from, _to), "TheRelationDao: followed");

        follow_table[_from][_to] = true;

        follow_sum[_from]++;
        followed_sum[_to]++;

        emit FollowEvt(_from, _to);
    }

    function unfollow(uint256 _from, uint256 _to) external {
        require(_from != _to, "TheRelationDao: error");
        require(_exists(_to), "TheRelationDao: nonexistent token");
        require(_isApprovedOrOwner(msg.sender, _from));
        require(is_follow(_from, _to), "TheRelationDao: unfollow");

        follow_table[_from][_to] = false;

        follow_sum[_from]--;
        followed_sum[_to]--;

        emit UnFollowEvt(_from, _to);
    }

    function is_follow(uint256 _from, uint256 _to) public view returns (bool) {
        return follow_table[_from][_to];
    }

    function query_follow_sum(uint256 _from) public view returns (uint256) {
        return follow_sum[_from];
    }

    function query_followed_sum(uint256 _from) public view returns (uint256) {
        return followed_sum[_from];
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "TheRelationDao: nonexistent token");
        return profile[_tokenId];
    }

    constructor() ERC721("TheRelationDAO", "RELATION") {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_to","type":"uint256"}],"name":"FollowEvt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":false,"internalType":"string","name":"_profile","type":"string"}],"name":"ProfileEvt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":false,"internalType":"string","name":"_profile","type":"string"}],"name":"RegisterEvt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_to","type":"uint256"}],"name":"UnFollowEvt","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"follow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"is_follow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"next_user","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"query_follow_sum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"query_followed_sum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"unfollow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"string","name":"_URI","type":"string"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f54686552656c6174696f6e44414f0000000000000000000000000000000000008152506040518060400160405280600881526020017f52454c4154494f4e000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620000b8565b508060019080519060200190620000af929190620000b8565b505050620001cd565b828054620000c69062000168565b90600052602060002090601f016020900481019282620000ea576000855562000136565b82601f106200010557805160ff191683800117855562000136565b8280016001018555821562000136579182015b828111156200013557825182559160200191906001019062000118565b5b50905062000145919062000149565b5090565b5b80821115620001645760008160009055506001016200014a565b5090565b600060028204905060018216806200018157607f821691505b602082108114156200019857620001976200019e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ed180620001dd6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063a22cb465116100b8578063c87b56dd1161007c578063c87b56dd1461035e578063d85d3d271461038e578063ddbe7795146103aa578063e985e9c5146103da578063f745630f1461040a578063fb1bf05d1461042657610137565b8063a22cb465146102a8578063a3969f5c146102c4578063b88d4fde146102f4578063c224200c14610310578063c248bb5a1461034057610137565b806342842e0e116100ff57806342842e0e146101f25780636352211e1461020e57806370a082311461023e578063821defc21461026e57806395d89b411461028a57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b61015660048036038101906101519190611ef0565b610442565b60405161016391906123b5565b60405180910390f35b610174610524565b60405161018191906123d0565b60405180910390f35b6101a4600480360381019061019f9190611f93565b6105b6565b6040516101b1919061234e565b60405180910390f35b6101d460048036038101906101cf9190611eb0565b61063b565b005b6101f060048036038101906101eb9190611d9a565b610753565b005b61020c60048036038101906102079190611d9a565b6107b3565b005b61022860048036038101906102239190611f93565b6107d3565b604051610235919061234e565b60405180910390f35b61025860048036038101906102539190611d2d565b610885565b6040516102659190612612565b60405180910390f35b6102886004803603810190610283919061201c565b61093d565b005b610292610ae6565b60405161029f91906123d0565b60405180910390f35b6102c260048036038101906102bd9190611e70565b610b78565b005b6102de60048036038101906102d99190611f93565b610b8e565b6040516102eb9190612612565b60405180910390f35b61030e60048036038101906103099190611ded565b610bab565b005b61032a60048036038101906103259190611f93565b610c0d565b6040516103379190612612565b60405180910390f35b610348610c2a565b6040516103559190612612565b60405180910390f35b61037860048036038101906103739190611f93565b610c30565b60405161038591906123d0565b60405180910390f35b6103a860048036038101906103a39190611f4a565b610d1d565b005b6103c460048036038101906103bf919061201c565b610dc2565b6040516103d191906123b5565b60405180910390f35b6103f460048036038101906103ef9190611d5a565b610dfe565b60405161040191906123b5565b60405180910390f35b610424600480360381019061041f9190611fc0565b610e92565b005b610440600480360381019061043b919061201c565b610f09565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051d575061051c826110b1565b5b9050919050565b60606000805461053390612886565b80601f016020809104026020016040519081016040528092919081815260200182805461055f90612886565b80156105ac5780601f10610581576101008083540402835291602001916105ac565b820191906000526020600020905b81548152906001019060200180831161058f57829003601f168201915b5050505050905090565b60006105c18261111b565b610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f790612552565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610646826107d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae906125b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d6611187565b73ffffffffffffffffffffffffffffffffffffffff1614806107055750610704816106ff611187565b610dfe565b5b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b906124b2565b60405180910390fd5b61074e838361118f565b505050565b61076461075e611187565b82611248565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a906125d2565b60405180910390fd5b6107ae838383611326565b505050565b6107ce83838360405180602001604052806000815250610bab565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561087c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610873906124f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ed906124d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80821415610980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097790612592565b60405180910390fd5b6109898161111b565b6109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf90612492565b60405180910390fd5b6109d23383611248565b6109db57600080fd5b6109e58282610dc2565b15610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c906125f2565b60405180910390fd5b6001600a6000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600860008381526020019081526020016000206000815480929190610a86906128e9565b9190505550600960008281526020019081526020016000206000815480929190610aaf906128e9565b919050555080827ffbb1581f4de1213b1d290039a150637d6bd112e0df314fb99ba56e693564b7ab60405160405180910390a35050565b606060018054610af590612886565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190612886565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b5050505050905090565b610b8a610b83611187565b8383611582565b5050565b600060096000838152602001908152602001600020549050919050565b610bbc610bb6611187565b83611248565b610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf2906125d2565b60405180910390fd5b610c07848484846116ef565b50505050565b600060086000838152602001908152602001600020549050919050565b60065481565b6060610c3b8261111b565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190612492565b60405180910390fd5b600760008381526020019081526020016000208054610c9890612886565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc490612886565b8015610d115780601f10610ce657610100808354040283529160200191610d11565b820191906000526020600020905b815481529060010190602001808311610cf457829003601f168201915b50505050509050919050565b60006006549050610d2e338261174b565b81600760008381526020019081526020016000209080519060200190610d55929190611b41565b5060066000815480929190610d69906128e9565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f56a385eaee0dce215a8d9af0ab9dc7ae0c975aed8b3ce3949035762ab4db03278284604051610db692919061262d565b60405180910390a25050565b6000600a6000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9c3383611248565b610ea557600080fd5b80600760008481526020019081526020016000209080519060200190610ecc929190611b41565b50817f775ac53f633bf4eed4f8bbfffddc2a9bda49c386feb26848d4fea6365dc6c4b982604051610efd91906123d0565b60405180910390a25050565b80821415610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390612592565b60405180910390fd5b610f558161111b565b610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90612492565b60405180910390fd5b610f9e3383611248565b610fa757600080fd5b610fb18282610dc2565b610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790612512565b60405180910390fd5b6000600a6000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600083815260200190815260200160002060008154809291906110519061285c565b919050555060096000828152602001908152602001600020600081548092919061107a9061285c565b919050555080827f878b6087d288db65962f263840aa02119d61f57ceb5847b902e979301e1471cb60405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611202836107d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112538261111b565b611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990612472565b60405180910390fd5b600061129d836107d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061130c57508373ffffffffffffffffffffffffffffffffffffffff166112f4846105b6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061131d575061131c8185610dfe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611346826107d3565b73ffffffffffffffffffffffffffffffffffffffff161461139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390612572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612432565b60405180910390fd5b611417838383611769565b61142260008261118f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114729190612772565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c9919061271c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890612452565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e291906123b5565b60405180910390a3505050565b6116fa848484611326565b6117068484848461176e565b611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c906123f2565b60405180910390fd5b50505050565b611765828260405180602001604052806000815250611905565b5050565b505050565b600061178f8473ffffffffffffffffffffffffffffffffffffffff16611960565b156118f8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117b8611187565b8786866040518563ffffffff1660e01b81526004016117da9493929190612369565b602060405180830381600087803b1580156117f457600080fd5b505af192505050801561182557506040513d601f19601f820116820180604052508101906118229190611f1d565b60015b6118a8573d8060008114611855576040519150601f19603f3d011682016040523d82523d6000602084013e61185a565b606091505b506000815114156118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906123f2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506118fd565b600190505b949350505050565b61190f8383611973565b61191c600084848461176e565b61195b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611952906123f2565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90612532565b60405180910390fd5b6119ec8161111b565b15611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390612412565b60405180910390fd5b611a3860008383611769565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a88919061271c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054611b4d90612886565b90600052602060002090601f016020900481019282611b6f5760008555611bb6565b82601f10611b8857805160ff1916838001178555611bb6565b82800160010185558215611bb6579182015b82811115611bb5578251825591602001919060010190611b9a565b5b509050611bc39190611bc7565b5090565b5b80821115611be0576000816000905550600101611bc8565b5090565b6000611bf7611bf284612682565b61265d565b905082815260208101848484011115611c1357611c126129c4565b5b611c1e84828561281a565b509392505050565b6000611c39611c34846126b3565b61265d565b905082815260208101848484011115611c5557611c546129c4565b5b611c6084828561281a565b509392505050565b600081359050611c7781612e3f565b92915050565b600081359050611c8c81612e56565b92915050565b600081359050611ca181612e6d565b92915050565b600081519050611cb681612e6d565b92915050565b600082601f830112611cd157611cd06129bf565b5b8135611ce1848260208601611be4565b91505092915050565b600082601f830112611cff57611cfe6129bf565b5b8135611d0f848260208601611c26565b91505092915050565b600081359050611d2781612e84565b92915050565b600060208284031215611d4357611d426129ce565b5b6000611d5184828501611c68565b91505092915050565b60008060408385031215611d7157611d706129ce565b5b6000611d7f85828601611c68565b9250506020611d9085828601611c68565b9150509250929050565b600080600060608486031215611db357611db26129ce565b5b6000611dc186828701611c68565b9350506020611dd286828701611c68565b9250506040611de386828701611d18565b9150509250925092565b60008060008060808587031215611e0757611e066129ce565b5b6000611e1587828801611c68565b9450506020611e2687828801611c68565b9350506040611e3787828801611d18565b925050606085013567ffffffffffffffff811115611e5857611e576129c9565b5b611e6487828801611cbc565b91505092959194509250565b60008060408385031215611e8757611e866129ce565b5b6000611e9585828601611c68565b9250506020611ea685828601611c7d565b9150509250929050565b60008060408385031215611ec757611ec66129ce565b5b6000611ed585828601611c68565b9250506020611ee685828601611d18565b9150509250929050565b600060208284031215611f0657611f056129ce565b5b6000611f1484828501611c92565b91505092915050565b600060208284031215611f3357611f326129ce565b5b6000611f4184828501611ca7565b91505092915050565b600060208284031215611f6057611f5f6129ce565b5b600082013567ffffffffffffffff811115611f7e57611f7d6129c9565b5b611f8a84828501611cea565b91505092915050565b600060208284031215611fa957611fa86129ce565b5b6000611fb784828501611d18565b91505092915050565b60008060408385031215611fd757611fd66129ce565b5b6000611fe585828601611d18565b925050602083013567ffffffffffffffff811115612006576120056129c9565b5b61201285828601611cea565b9150509250929050565b60008060408385031215612033576120326129ce565b5b600061204185828601611d18565b925050602061205285828601611d18565b9150509250929050565b612065816127a6565b82525050565b612074816127b8565b82525050565b6000612085826126e4565b61208f81856126fa565b935061209f818560208601612829565b6120a8816129d3565b840191505092915050565b60006120be826126ef565b6120c8818561270b565b93506120d8818560208601612829565b6120e1816129d3565b840191505092915050565b60006120f960328361270b565b9150612104826129e4565b604082019050919050565b600061211c601c8361270b565b915061212782612a33565b602082019050919050565b600061213f60248361270b565b915061214a82612a5c565b604082019050919050565b600061216260198361270b565b915061216d82612aab565b602082019050919050565b6000612185602c8361270b565b915061219082612ad4565b604082019050919050565b60006121a860218361270b565b91506121b382612b23565b604082019050919050565b60006121cb60388361270b565b91506121d682612b72565b604082019050919050565b60006121ee602a8361270b565b91506121f982612bc1565b604082019050919050565b600061221160298361270b565b915061221c82612c10565b604082019050919050565b600061223460188361270b565b915061223f82612c5f565b602082019050919050565b600061225760208361270b565b915061226282612c88565b602082019050919050565b600061227a602c8361270b565b915061228582612cb1565b604082019050919050565b600061229d60298361270b565b91506122a882612d00565b604082019050919050565b60006122c060158361270b565b91506122cb82612d4f565b602082019050919050565b60006122e360218361270b565b91506122ee82612d78565b604082019050919050565b600061230660318361270b565b915061231182612dc7565b604082019050919050565b600061232960188361270b565b915061233482612e16565b602082019050919050565b61234881612810565b82525050565b6000602082019050612363600083018461205c565b92915050565b600060808201905061237e600083018761205c565b61238b602083018661205c565b612398604083018561233f565b81810360608301526123aa818461207a565b905095945050505050565b60006020820190506123ca600083018461206b565b92915050565b600060208201905081810360008301526123ea81846120b3565b905092915050565b6000602082019050818103600083015261240b816120ec565b9050919050565b6000602082019050818103600083015261242b8161210f565b9050919050565b6000602082019050818103600083015261244b81612132565b9050919050565b6000602082019050818103600083015261246b81612155565b9050919050565b6000602082019050818103600083015261248b81612178565b9050919050565b600060208201905081810360008301526124ab8161219b565b9050919050565b600060208201905081810360008301526124cb816121be565b9050919050565b600060208201905081810360008301526124eb816121e1565b9050919050565b6000602082019050818103600083015261250b81612204565b9050919050565b6000602082019050818103600083015261252b81612227565b9050919050565b6000602082019050818103600083015261254b8161224a565b9050919050565b6000602082019050818103600083015261256b8161226d565b9050919050565b6000602082019050818103600083015261258b81612290565b9050919050565b600060208201905081810360008301526125ab816122b3565b9050919050565b600060208201905081810360008301526125cb816122d6565b9050919050565b600060208201905081810360008301526125eb816122f9565b9050919050565b6000602082019050818103600083015261260b8161231c565b9050919050565b6000602082019050612627600083018461233f565b92915050565b6000604082019050612642600083018561233f565b818103602083015261265481846120b3565b90509392505050565b6000612667612678565b905061267382826128b8565b919050565b6000604051905090565b600067ffffffffffffffff82111561269d5761269c612990565b5b6126a6826129d3565b9050602081019050919050565b600067ffffffffffffffff8211156126ce576126cd612990565b5b6126d7826129d3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061272782612810565b915061273283612810565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561276757612766612932565b5b828201905092915050565b600061277d82612810565b915061278883612810565b92508282101561279b5761279a612932565b5b828203905092915050565b60006127b1826127f0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561284757808201518184015260208101905061282c565b83811115612856576000848401525b50505050565b600061286782612810565b9150600082141561287b5761287a612932565b5b600182039050919050565b6000600282049050600182168061289e57607f821691505b602082108114156128b2576128b1612961565b5b50919050565b6128c1826129d3565b810181811067ffffffffffffffff821117156128e0576128df612990565b5b80604052505050565b60006128f482612810565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561292757612926612932565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a206e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a20756e666f6c6c6f770000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a206572726f720000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a20666f6c6c6f7765640000000000000000600082015250565b612e48816127a6565b8114612e5357600080fd5b50565b612e5f816127b8565b8114612e6a57600080fd5b50565b612e76816127c4565b8114612e8157600080fd5b50565b612e8d81612810565b8114612e9857600080fd5b5056fea264697066735822122028b5ed12ed9ddc5ca3fbdc6532b46c37ba572eddda37487785d75b202949c0cd64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063a22cb465116100b8578063c87b56dd1161007c578063c87b56dd1461035e578063d85d3d271461038e578063ddbe7795146103aa578063e985e9c5146103da578063f745630f1461040a578063fb1bf05d1461042657610137565b8063a22cb465146102a8578063a3969f5c146102c4578063b88d4fde146102f4578063c224200c14610310578063c248bb5a1461034057610137565b806342842e0e116100ff57806342842e0e146101f25780636352211e1461020e57806370a082311461023e578063821defc21461026e57806395d89b411461028a57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b61015660048036038101906101519190611ef0565b610442565b60405161016391906123b5565b60405180910390f35b610174610524565b60405161018191906123d0565b60405180910390f35b6101a4600480360381019061019f9190611f93565b6105b6565b6040516101b1919061234e565b60405180910390f35b6101d460048036038101906101cf9190611eb0565b61063b565b005b6101f060048036038101906101eb9190611d9a565b610753565b005b61020c60048036038101906102079190611d9a565b6107b3565b005b61022860048036038101906102239190611f93565b6107d3565b604051610235919061234e565b60405180910390f35b61025860048036038101906102539190611d2d565b610885565b6040516102659190612612565b60405180910390f35b6102886004803603810190610283919061201c565b61093d565b005b610292610ae6565b60405161029f91906123d0565b60405180910390f35b6102c260048036038101906102bd9190611e70565b610b78565b005b6102de60048036038101906102d99190611f93565b610b8e565b6040516102eb9190612612565b60405180910390f35b61030e60048036038101906103099190611ded565b610bab565b005b61032a60048036038101906103259190611f93565b610c0d565b6040516103379190612612565b60405180910390f35b610348610c2a565b6040516103559190612612565b60405180910390f35b61037860048036038101906103739190611f93565b610c30565b60405161038591906123d0565b60405180910390f35b6103a860048036038101906103a39190611f4a565b610d1d565b005b6103c460048036038101906103bf919061201c565b610dc2565b6040516103d191906123b5565b60405180910390f35b6103f460048036038101906103ef9190611d5a565b610dfe565b60405161040191906123b5565b60405180910390f35b610424600480360381019061041f9190611fc0565b610e92565b005b610440600480360381019061043b919061201c565b610f09565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051d575061051c826110b1565b5b9050919050565b60606000805461053390612886565b80601f016020809104026020016040519081016040528092919081815260200182805461055f90612886565b80156105ac5780601f10610581576101008083540402835291602001916105ac565b820191906000526020600020905b81548152906001019060200180831161058f57829003601f168201915b5050505050905090565b60006105c18261111b565b610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f790612552565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610646826107d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae906125b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d6611187565b73ffffffffffffffffffffffffffffffffffffffff1614806107055750610704816106ff611187565b610dfe565b5b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b906124b2565b60405180910390fd5b61074e838361118f565b505050565b61076461075e611187565b82611248565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a906125d2565b60405180910390fd5b6107ae838383611326565b505050565b6107ce83838360405180602001604052806000815250610bab565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561087c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610873906124f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ed906124d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80821415610980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097790612592565b60405180910390fd5b6109898161111b565b6109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf90612492565b60405180910390fd5b6109d23383611248565b6109db57600080fd5b6109e58282610dc2565b15610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c906125f2565b60405180910390fd5b6001600a6000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600860008381526020019081526020016000206000815480929190610a86906128e9565b9190505550600960008281526020019081526020016000206000815480929190610aaf906128e9565b919050555080827ffbb1581f4de1213b1d290039a150637d6bd112e0df314fb99ba56e693564b7ab60405160405180910390a35050565b606060018054610af590612886565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190612886565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b5050505050905090565b610b8a610b83611187565b8383611582565b5050565b600060096000838152602001908152602001600020549050919050565b610bbc610bb6611187565b83611248565b610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf2906125d2565b60405180910390fd5b610c07848484846116ef565b50505050565b600060086000838152602001908152602001600020549050919050565b60065481565b6060610c3b8261111b565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190612492565b60405180910390fd5b600760008381526020019081526020016000208054610c9890612886565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc490612886565b8015610d115780601f10610ce657610100808354040283529160200191610d11565b820191906000526020600020905b815481529060010190602001808311610cf457829003601f168201915b50505050509050919050565b60006006549050610d2e338261174b565b81600760008381526020019081526020016000209080519060200190610d55929190611b41565b5060066000815480929190610d69906128e9565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f56a385eaee0dce215a8d9af0ab9dc7ae0c975aed8b3ce3949035762ab4db03278284604051610db692919061262d565b60405180910390a25050565b6000600a6000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9c3383611248565b610ea557600080fd5b80600760008481526020019081526020016000209080519060200190610ecc929190611b41565b50817f775ac53f633bf4eed4f8bbfffddc2a9bda49c386feb26848d4fea6365dc6c4b982604051610efd91906123d0565b60405180910390a25050565b80821415610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390612592565b60405180910390fd5b610f558161111b565b610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90612492565b60405180910390fd5b610f9e3383611248565b610fa757600080fd5b610fb18282610dc2565b610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790612512565b60405180910390fd5b6000600a6000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600083815260200190815260200160002060008154809291906110519061285c565b919050555060096000828152602001908152602001600020600081548092919061107a9061285c565b919050555080827f878b6087d288db65962f263840aa02119d61f57ceb5847b902e979301e1471cb60405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611202836107d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112538261111b565b611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990612472565b60405180910390fd5b600061129d836107d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061130c57508373ffffffffffffffffffffffffffffffffffffffff166112f4846105b6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061131d575061131c8185610dfe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611346826107d3565b73ffffffffffffffffffffffffffffffffffffffff161461139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390612572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612432565b60405180910390fd5b611417838383611769565b61142260008261118f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114729190612772565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c9919061271c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890612452565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e291906123b5565b60405180910390a3505050565b6116fa848484611326565b6117068484848461176e565b611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c906123f2565b60405180910390fd5b50505050565b611765828260405180602001604052806000815250611905565b5050565b505050565b600061178f8473ffffffffffffffffffffffffffffffffffffffff16611960565b156118f8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117b8611187565b8786866040518563ffffffff1660e01b81526004016117da9493929190612369565b602060405180830381600087803b1580156117f457600080fd5b505af192505050801561182557506040513d601f19601f820116820180604052508101906118229190611f1d565b60015b6118a8573d8060008114611855576040519150601f19603f3d011682016040523d82523d6000602084013e61185a565b606091505b506000815114156118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906123f2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506118fd565b600190505b949350505050565b61190f8383611973565b61191c600084848461176e565b61195b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611952906123f2565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90612532565b60405180910390fd5b6119ec8161111b565b15611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390612412565b60405180910390fd5b611a3860008383611769565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a88919061271c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054611b4d90612886565b90600052602060002090601f016020900481019282611b6f5760008555611bb6565b82601f10611b8857805160ff1916838001178555611bb6565b82800160010185558215611bb6579182015b82811115611bb5578251825591602001919060010190611b9a565b5b509050611bc39190611bc7565b5090565b5b80821115611be0576000816000905550600101611bc8565b5090565b6000611bf7611bf284612682565b61265d565b905082815260208101848484011115611c1357611c126129c4565b5b611c1e84828561281a565b509392505050565b6000611c39611c34846126b3565b61265d565b905082815260208101848484011115611c5557611c546129c4565b5b611c6084828561281a565b509392505050565b600081359050611c7781612e3f565b92915050565b600081359050611c8c81612e56565b92915050565b600081359050611ca181612e6d565b92915050565b600081519050611cb681612e6d565b92915050565b600082601f830112611cd157611cd06129bf565b5b8135611ce1848260208601611be4565b91505092915050565b600082601f830112611cff57611cfe6129bf565b5b8135611d0f848260208601611c26565b91505092915050565b600081359050611d2781612e84565b92915050565b600060208284031215611d4357611d426129ce565b5b6000611d5184828501611c68565b91505092915050565b60008060408385031215611d7157611d706129ce565b5b6000611d7f85828601611c68565b9250506020611d9085828601611c68565b9150509250929050565b600080600060608486031215611db357611db26129ce565b5b6000611dc186828701611c68565b9350506020611dd286828701611c68565b9250506040611de386828701611d18565b9150509250925092565b60008060008060808587031215611e0757611e066129ce565b5b6000611e1587828801611c68565b9450506020611e2687828801611c68565b9350506040611e3787828801611d18565b925050606085013567ffffffffffffffff811115611e5857611e576129c9565b5b611e6487828801611cbc565b91505092959194509250565b60008060408385031215611e8757611e866129ce565b5b6000611e9585828601611c68565b9250506020611ea685828601611c7d565b9150509250929050565b60008060408385031215611ec757611ec66129ce565b5b6000611ed585828601611c68565b9250506020611ee685828601611d18565b9150509250929050565b600060208284031215611f0657611f056129ce565b5b6000611f1484828501611c92565b91505092915050565b600060208284031215611f3357611f326129ce565b5b6000611f4184828501611ca7565b91505092915050565b600060208284031215611f6057611f5f6129ce565b5b600082013567ffffffffffffffff811115611f7e57611f7d6129c9565b5b611f8a84828501611cea565b91505092915050565b600060208284031215611fa957611fa86129ce565b5b6000611fb784828501611d18565b91505092915050565b60008060408385031215611fd757611fd66129ce565b5b6000611fe585828601611d18565b925050602083013567ffffffffffffffff811115612006576120056129c9565b5b61201285828601611cea565b9150509250929050565b60008060408385031215612033576120326129ce565b5b600061204185828601611d18565b925050602061205285828601611d18565b9150509250929050565b612065816127a6565b82525050565b612074816127b8565b82525050565b6000612085826126e4565b61208f81856126fa565b935061209f818560208601612829565b6120a8816129d3565b840191505092915050565b60006120be826126ef565b6120c8818561270b565b93506120d8818560208601612829565b6120e1816129d3565b840191505092915050565b60006120f960328361270b565b9150612104826129e4565b604082019050919050565b600061211c601c8361270b565b915061212782612a33565b602082019050919050565b600061213f60248361270b565b915061214a82612a5c565b604082019050919050565b600061216260198361270b565b915061216d82612aab565b602082019050919050565b6000612185602c8361270b565b915061219082612ad4565b604082019050919050565b60006121a860218361270b565b91506121b382612b23565b604082019050919050565b60006121cb60388361270b565b91506121d682612b72565b604082019050919050565b60006121ee602a8361270b565b91506121f982612bc1565b604082019050919050565b600061221160298361270b565b915061221c82612c10565b604082019050919050565b600061223460188361270b565b915061223f82612c5f565b602082019050919050565b600061225760208361270b565b915061226282612c88565b602082019050919050565b600061227a602c8361270b565b915061228582612cb1565b604082019050919050565b600061229d60298361270b565b91506122a882612d00565b604082019050919050565b60006122c060158361270b565b91506122cb82612d4f565b602082019050919050565b60006122e360218361270b565b91506122ee82612d78565b604082019050919050565b600061230660318361270b565b915061231182612dc7565b604082019050919050565b600061232960188361270b565b915061233482612e16565b602082019050919050565b61234881612810565b82525050565b6000602082019050612363600083018461205c565b92915050565b600060808201905061237e600083018761205c565b61238b602083018661205c565b612398604083018561233f565b81810360608301526123aa818461207a565b905095945050505050565b60006020820190506123ca600083018461206b565b92915050565b600060208201905081810360008301526123ea81846120b3565b905092915050565b6000602082019050818103600083015261240b816120ec565b9050919050565b6000602082019050818103600083015261242b8161210f565b9050919050565b6000602082019050818103600083015261244b81612132565b9050919050565b6000602082019050818103600083015261246b81612155565b9050919050565b6000602082019050818103600083015261248b81612178565b9050919050565b600060208201905081810360008301526124ab8161219b565b9050919050565b600060208201905081810360008301526124cb816121be565b9050919050565b600060208201905081810360008301526124eb816121e1565b9050919050565b6000602082019050818103600083015261250b81612204565b9050919050565b6000602082019050818103600083015261252b81612227565b9050919050565b6000602082019050818103600083015261254b8161224a565b9050919050565b6000602082019050818103600083015261256b8161226d565b9050919050565b6000602082019050818103600083015261258b81612290565b9050919050565b600060208201905081810360008301526125ab816122b3565b9050919050565b600060208201905081810360008301526125cb816122d6565b9050919050565b600060208201905081810360008301526125eb816122f9565b9050919050565b6000602082019050818103600083015261260b8161231c565b9050919050565b6000602082019050612627600083018461233f565b92915050565b6000604082019050612642600083018561233f565b818103602083015261265481846120b3565b90509392505050565b6000612667612678565b905061267382826128b8565b919050565b6000604051905090565b600067ffffffffffffffff82111561269d5761269c612990565b5b6126a6826129d3565b9050602081019050919050565b600067ffffffffffffffff8211156126ce576126cd612990565b5b6126d7826129d3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061272782612810565b915061273283612810565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561276757612766612932565b5b828201905092915050565b600061277d82612810565b915061278883612810565b92508282101561279b5761279a612932565b5b828203905092915050565b60006127b1826127f0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561284757808201518184015260208101905061282c565b83811115612856576000848401525b50505050565b600061286782612810565b9150600082141561287b5761287a612932565b5b600182039050919050565b6000600282049050600182168061289e57607f821691505b602082108114156128b2576128b1612961565b5b50919050565b6128c1826129d3565b810181811067ffffffffffffffff821117156128e0576128df612990565b5b80604052505050565b60006128f482612810565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561292757612926612932565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a206e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a20756e666f6c6c6f770000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a206572726f720000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f54686552656c6174696f6e44616f3a20666f6c6c6f7765640000000000000000600082015250565b612e48816127a6565b8114612e5357600080fd5b50565b612e5f816127b8565b8114612e6a57600080fd5b50565b612e76816127c4565b8114612e8157600080fd5b50565b612e8d81612810565b8114612e9857600080fd5b5056fea264697066735822122028b5ed12ed9ddc5ca3fbdc6532b46c37ba572eddda37487785d75b202949c0cd64736f6c63430008070033

Deployed Bytecode Sourcemap

33721:2607:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21212:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22157:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23716:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23239:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24466:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24876:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21851:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21581:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34707:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22326:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24009:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35899:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25132:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35777:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33762:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36025:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34275:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35645:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24235:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34503:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35174:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21212:305;21314:4;21366:25;21351:40;;;:11;:40;;;;:105;;;;21423:33;21408:48;;;:11;:48;;;;21351:105;:158;;;;21473:36;21497:11;21473:23;:36::i;:::-;21351:158;21331:178;;21212:305;;;:::o;22157:100::-;22211:13;22244:5;22237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22157:100;:::o;23716:221::-;23792:7;23820:16;23828:7;23820;:16::i;:::-;23812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23905:15;:24;23921:7;23905:24;;;;;;;;;;;;;;;;;;;;;23898:31;;23716:221;;;:::o;23239:411::-;23320:13;23336:23;23351:7;23336:14;:23::i;:::-;23320:39;;23384:5;23378:11;;:2;:11;;;;23370:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23478:5;23462:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23487:37;23504:5;23511:12;:10;:12::i;:::-;23487:16;:37::i;:::-;23462:62;23440:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23621:21;23630:2;23634:7;23621:8;:21::i;:::-;23309:341;23239:411;;:::o;24466:339::-;24661:41;24680:12;:10;:12::i;:::-;24694:7;24661:18;:41::i;:::-;24653:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24769:28;24779:4;24785:2;24789:7;24769:9;:28::i;:::-;24466:339;;;:::o;24876:185::-;25014:39;25031:4;25037:2;25041:7;25014:39;;;;;;;;;;;;:16;:39::i;:::-;24876:185;;;:::o;21851:239::-;21923:7;21943:13;21959:7;:16;21967:7;21959:16;;;;;;;;;;;;;;;;;;;;;21943:32;;22011:1;21994:19;;:5;:19;;;;21986:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22077:5;22070:12;;;21851:239;;;:::o;21581:208::-;21653:7;21698:1;21681:19;;:5;:19;;;;21673:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21765:9;:16;21775:5;21765:16;;;;;;;;;;;;;;;;21758:23;;21581:208;;;:::o;34707:459::-;34788:3;34779:5;:12;;34771:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;34836:12;34844:3;34836:7;:12::i;:::-;34828:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34905:37;34924:10;34936:5;34905:18;:37::i;:::-;34897:46;;;;;;34963:21;34973:5;34980:3;34963:9;:21::i;:::-;34962:22;34954:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;35053:4;35026:12;:19;35039:5;35026:19;;;;;;;;;;;:24;35046:3;35026:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;35070:10;:17;35081:5;35070:17;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;35100:12;:17;35113:3;35100:17;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;35154:3;35147:5;35137:21;;;;;;;;;;34707:459;;:::o;22326:104::-;22382:13;22415:7;22408:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22326:104;:::o;24009:155::-;24104:52;24123:12;:10;:12::i;:::-;24137:8;24147;24104:18;:52::i;:::-;24009:155;;:::o;35899:118::-;35963:7;35990:12;:19;36003:5;35990:19;;;;;;;;;;;;35983:26;;35899:118;;;:::o;25132:328::-;25307:41;25326:12;:10;:12::i;:::-;25340:7;25307:18;:41::i;:::-;25299:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25413:39;25427:4;25433:2;25437:7;25446:5;25413:13;:39::i;:::-;25132:328;;;;:::o;35777:114::-;35839:7;35866:10;:17;35877:5;35866:17;;;;;;;;;;;;35859:24;;35777:114;;;:::o;33762:24::-;;;;:::o;36025:239::-;36127:13;36166:17;36174:8;36166:7;:17::i;:::-;36158:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36239:7;:17;36247:8;36239:17;;;;;;;;;;;36232:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36025:239;;;:::o;34275:220::-;34329:10;34342:9;;34329:22;;34362:25;34372:10;34384:2;34362:9;:25::i;:::-;34412:4;34398:7;:11;34406:2;34398:11;;;;;;;;;;;:18;;;;;;;;;;;;:::i;:::-;;34427:9;;:11;;;;;;;;;:::i;:::-;;;;;;34466:10;34454:33;;;34478:2;34482:4;34454:33;;;;;;;:::i;:::-;;;;;;;;34318:177;34275:220;:::o;35645:124::-;35713:4;35737:12;:19;35750:5;35737:19;;;;;;;;;;;:24;35757:3;35737:24;;;;;;;;;;;;;;;;;;;;;35730:31;;35645:124;;;;:::o;24235:164::-;24332:4;24356:18;:25;24375:5;24356:25;;;;;;;;;;;;;;;:35;24382:8;24356:35;;;;;;;;;;;;;;;;;;;;;;;;;24349:42;;24235:164;;;;:::o;34503:196::-;34582:37;34601:10;34613:5;34582:18;:37::i;:::-;34574:46;;;;;;34648:4;34631:7;:14;34639:5;34631:14;;;;;;;;;;;:21;;;;;;;;;;;;:::i;:::-;;34679:5;34668:23;34686:4;34668:23;;;;;;:::i;:::-;;;;;;;;34503:196;;:::o;35174:463::-;35257:3;35248:5;:12;;35240:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;35305:12;35313:3;35305:7;:12::i;:::-;35297:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35374:37;35393:10;35405:5;35374:18;:37::i;:::-;35366:46;;;;;;35431:21;35441:5;35448:3;35431:9;:21::i;:::-;35423:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35521:5;35494:12;:19;35507:5;35494:19;;;;;;;;;;;:24;35514:3;35494:24;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;35539:10;:17;35550:5;35539:17;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;35569:12;:17;35582:3;35569:17;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;35625:3;35618:5;35606:23;;;;;;;;;;35174:463;;:::o;13981:157::-;14066:4;14105:25;14090:40;;;:11;:40;;;;14083:47;;13981:157;;;:::o;26970:127::-;27035:4;27087:1;27059:30;;:7;:16;27067:7;27059:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27052:37;;26970:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;30952:174::-;31054:2;31027:15;:24;31043:7;31027:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31110:7;31106:2;31072:46;;31081:23;31096:7;31081:14;:23::i;:::-;31072:46;;;;;;;;;;;;30952:174;;:::o;27264:348::-;27357:4;27382:16;27390:7;27382;:16::i;:::-;27374:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27458:13;27474:23;27489:7;27474:14;:23::i;:::-;27458:39;;27527:5;27516:16;;:7;:16;;;:51;;;;27560:7;27536:31;;:20;27548:7;27536:11;:20::i;:::-;:31;;;27516:51;:87;;;;27571:32;27588:5;27595:7;27571:16;:32::i;:::-;27516:87;27508:96;;;27264:348;;;;:::o;30256:578::-;30415:4;30388:31;;:23;30403:7;30388:14;:23::i;:::-;:31;;;30380:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30498:1;30484:16;;:2;:16;;;;30476:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30554:39;30575:4;30581:2;30585:7;30554:20;:39::i;:::-;30658:29;30675:1;30679:7;30658:8;:29::i;:::-;30719:1;30700:9;:15;30710:4;30700:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30748:1;30731:9;:13;30741:2;30731:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30779:2;30760:7;:16;30768:7;30760:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30818:7;30814:2;30799:27;;30808:4;30799:27;;;;;;;;;;;;30256:578;;;:::o;31268:315::-;31423:8;31414:17;;:5;:17;;;;31406:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31510:8;31472:18;:25;31491:5;31472:25;;;;;;;;;;;;;;;:35;31498:8;31472:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31556:8;31534:41;;31549:5;31534:41;;;31566:8;31534:41;;;;;;:::i;:::-;;;;;;;;31268:315;;;:::o;26342:::-;26499:28;26509:4;26515:2;26519:7;26499:9;:28::i;:::-;26546:48;26569:4;26575:2;26579:7;26588:5;26546:22;:48::i;:::-;26538:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26342:315;;;;:::o;27954:110::-;28030:26;28040:2;28044:7;28030:26;;;;;;;;;;;;:9;:26::i;:::-;27954:110;;:::o;33519:126::-;;;;:::o;32148:799::-;32303:4;32324:15;:2;:13;;;:15::i;:::-;32320:620;;;32376:2;32360:36;;;32397:12;:10;:12::i;:::-;32411:4;32417:7;32426:5;32360:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32356:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32619:1;32602:6;:13;:18;32598:272;;;32645:60;;;;;;;;;;:::i;:::-;;;;;;;;32598:272;32820:6;32814:13;32805:6;32801:2;32797:15;32790:38;32356:529;32493:41;;;32483:51;;;:6;:51;;;;32476:58;;;;;32320:620;32924:4;32917:11;;32148:799;;;;;;;:::o;28291:321::-;28421:18;28427:2;28431:7;28421:5;:18::i;:::-;28472:54;28503:1;28507:2;28511:7;28520:5;28472:22;:54::i;:::-;28450:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28291:321;;;:::o;3837:387::-;3897:4;4105:12;4172:7;4160:20;4152:28;;4215:1;4208:4;:8;4201:15;;;3837:387;;;:::o;28948:382::-;29042:1;29028:16;;:2;:16;;;;29020:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29101:16;29109:7;29101;:16::i;:::-;29100:17;29092:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29163:45;29192:1;29196:2;29200:7;29163:20;:45::i;:::-;29238:1;29221:9;:13;29231:2;29221:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29269:2;29250:7;:16;29258:7;29250:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29314:7;29310:2;29289:33;;29306:1;29289:33;;;;;;;;;;;;28948:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:654::-;7236:6;7244;7293:2;7281:9;7272:7;7268:23;7264:32;7261:119;;;7299:79;;:::i;:::-;7261:119;7419:1;7444:53;7489:7;7480:6;7469:9;7465:22;7444:53;:::i;:::-;7434:63;;7390:117;7574:2;7563:9;7559:18;7546:32;7605:18;7597:6;7594:30;7591:117;;;7627:79;;:::i;:::-;7591:117;7732:63;7787:7;7778:6;7767:9;7763:22;7732:63;:::i;:::-;7722:73;;7517:288;7158:654;;;;;:::o;7818:474::-;7886:6;7894;7943:2;7931:9;7922:7;7918:23;7914:32;7911:119;;;7949:79;;:::i;:::-;7911:119;8069:1;8094:53;8139:7;8130:6;8119:9;8115:22;8094:53;:::i;:::-;8084:63;;8040:117;8196:2;8222:53;8267:7;8258:6;8247:9;8243:22;8222:53;:::i;:::-;8212:63;;8167:118;7818:474;;;;;:::o;8298:118::-;8385:24;8403:5;8385:24;:::i;:::-;8380:3;8373:37;8298:118;;:::o;8422:109::-;8503:21;8518:5;8503:21;:::i;:::-;8498:3;8491:34;8422:109;;:::o;8537:360::-;8623:3;8651:38;8683:5;8651:38;:::i;:::-;8705:70;8768:6;8763:3;8705:70;:::i;:::-;8698:77;;8784:52;8829:6;8824:3;8817:4;8810:5;8806:16;8784:52;:::i;:::-;8861:29;8883:6;8861:29;:::i;:::-;8856:3;8852:39;8845:46;;8627:270;8537:360;;;;:::o;8903:364::-;8991:3;9019:39;9052:5;9019:39;:::i;:::-;9074:71;9138:6;9133:3;9074:71;:::i;:::-;9067:78;;9154:52;9199:6;9194:3;9187:4;9180:5;9176:16;9154:52;:::i;:::-;9231:29;9253:6;9231:29;:::i;:::-;9226:3;9222:39;9215:46;;8995:272;8903:364;;;;:::o;9273:366::-;9415:3;9436:67;9500:2;9495:3;9436:67;:::i;:::-;9429:74;;9512:93;9601:3;9512:93;:::i;:::-;9630:2;9625:3;9621:12;9614:19;;9273:366;;;:::o;9645:::-;9787:3;9808:67;9872:2;9867:3;9808:67;:::i;:::-;9801:74;;9884:93;9973:3;9884:93;:::i;:::-;10002:2;9997:3;9993:12;9986:19;;9645:366;;;:::o;10017:::-;10159:3;10180:67;10244:2;10239:3;10180:67;:::i;:::-;10173:74;;10256:93;10345:3;10256:93;:::i;:::-;10374:2;10369:3;10365:12;10358:19;;10017:366;;;:::o;10389:::-;10531:3;10552:67;10616:2;10611:3;10552:67;:::i;:::-;10545:74;;10628:93;10717:3;10628:93;:::i;:::-;10746:2;10741:3;10737:12;10730:19;;10389:366;;;:::o;10761:::-;10903:3;10924:67;10988:2;10983:3;10924:67;:::i;:::-;10917:74;;11000:93;11089:3;11000:93;:::i;:::-;11118:2;11113:3;11109:12;11102:19;;10761:366;;;:::o;11133:::-;11275:3;11296:67;11360:2;11355:3;11296:67;:::i;:::-;11289:74;;11372:93;11461:3;11372:93;:::i;:::-;11490:2;11485:3;11481:12;11474:19;;11133:366;;;:::o;11505:::-;11647:3;11668:67;11732:2;11727:3;11668:67;:::i;:::-;11661:74;;11744:93;11833:3;11744:93;:::i;:::-;11862:2;11857:3;11853:12;11846:19;;11505:366;;;:::o;11877:::-;12019:3;12040:67;12104:2;12099:3;12040:67;:::i;:::-;12033:74;;12116:93;12205:3;12116:93;:::i;:::-;12234:2;12229:3;12225:12;12218:19;;11877:366;;;:::o;12249:::-;12391:3;12412:67;12476:2;12471:3;12412:67;:::i;:::-;12405:74;;12488:93;12577:3;12488:93;:::i;:::-;12606:2;12601:3;12597:12;12590:19;;12249:366;;;:::o;12621:::-;12763:3;12784:67;12848:2;12843:3;12784:67;:::i;:::-;12777:74;;12860:93;12949:3;12860:93;:::i;:::-;12978:2;12973:3;12969:12;12962:19;;12621:366;;;:::o;12993:::-;13135:3;13156:67;13220:2;13215:3;13156:67;:::i;:::-;13149:74;;13232:93;13321:3;13232:93;:::i;:::-;13350:2;13345:3;13341:12;13334:19;;12993:366;;;:::o;13365:::-;13507:3;13528:67;13592:2;13587:3;13528:67;:::i;:::-;13521:74;;13604:93;13693:3;13604:93;:::i;:::-;13722:2;13717:3;13713:12;13706:19;;13365:366;;;:::o;13737:::-;13879:3;13900:67;13964:2;13959:3;13900:67;:::i;:::-;13893:74;;13976:93;14065:3;13976:93;:::i;:::-;14094:2;14089:3;14085:12;14078:19;;13737:366;;;:::o;14109:::-;14251:3;14272:67;14336:2;14331:3;14272:67;:::i;:::-;14265:74;;14348:93;14437:3;14348:93;:::i;:::-;14466:2;14461:3;14457:12;14450:19;;14109:366;;;:::o;14481:::-;14623:3;14644:67;14708:2;14703:3;14644:67;:::i;:::-;14637:74;;14720:93;14809:3;14720:93;:::i;:::-;14838:2;14833:3;14829:12;14822:19;;14481:366;;;:::o;14853:::-;14995:3;15016:67;15080:2;15075:3;15016:67;:::i;:::-;15009:74;;15092:93;15181:3;15092:93;:::i;:::-;15210:2;15205:3;15201:12;15194:19;;14853:366;;;:::o;15225:::-;15367:3;15388:67;15452:2;15447:3;15388:67;:::i;:::-;15381:74;;15464:93;15553:3;15464:93;:::i;:::-;15582:2;15577:3;15573:12;15566:19;;15225:366;;;:::o;15597:118::-;15684:24;15702:5;15684:24;:::i;:::-;15679:3;15672:37;15597:118;;:::o;15721:222::-;15814:4;15852:2;15841:9;15837:18;15829:26;;15865:71;15933:1;15922:9;15918:17;15909:6;15865:71;:::i;:::-;15721:222;;;;:::o;15949:640::-;16144:4;16182:3;16171:9;16167:19;16159:27;;16196:71;16264:1;16253:9;16249:17;16240:6;16196:71;:::i;:::-;16277:72;16345:2;16334:9;16330:18;16321:6;16277:72;:::i;:::-;16359;16427:2;16416:9;16412:18;16403:6;16359:72;:::i;:::-;16478:9;16472:4;16468:20;16463:2;16452:9;16448:18;16441:48;16506:76;16577:4;16568:6;16506:76;:::i;:::-;16498:84;;15949:640;;;;;;;:::o;16595:210::-;16682:4;16720:2;16709:9;16705:18;16697:26;;16733:65;16795:1;16784:9;16780:17;16771:6;16733:65;:::i;:::-;16595:210;;;;:::o;16811:313::-;16924:4;16962:2;16951:9;16947:18;16939:26;;17011:9;17005:4;17001:20;16997:1;16986:9;16982:17;16975:47;17039:78;17112:4;17103:6;17039:78;:::i;:::-;17031:86;;16811:313;;;;:::o;17130:419::-;17296:4;17334:2;17323:9;17319:18;17311:26;;17383:9;17377:4;17373:20;17369:1;17358:9;17354:17;17347:47;17411:131;17537:4;17411:131;:::i;:::-;17403:139;;17130:419;;;:::o;17555:::-;17721:4;17759:2;17748:9;17744:18;17736:26;;17808:9;17802:4;17798:20;17794:1;17783:9;17779:17;17772:47;17836:131;17962:4;17836:131;:::i;:::-;17828:139;;17555:419;;;:::o;17980:::-;18146:4;18184:2;18173:9;18169:18;18161:26;;18233:9;18227:4;18223:20;18219:1;18208:9;18204:17;18197:47;18261:131;18387:4;18261:131;:::i;:::-;18253:139;;17980:419;;;:::o;18405:::-;18571:4;18609:2;18598:9;18594:18;18586:26;;18658:9;18652:4;18648:20;18644:1;18633:9;18629:17;18622:47;18686:131;18812:4;18686:131;:::i;:::-;18678:139;;18405:419;;;:::o;18830:::-;18996:4;19034:2;19023:9;19019:18;19011:26;;19083:9;19077:4;19073:20;19069:1;19058:9;19054:17;19047:47;19111:131;19237:4;19111:131;:::i;:::-;19103:139;;18830:419;;;:::o;19255:::-;19421:4;19459:2;19448:9;19444:18;19436:26;;19508:9;19502:4;19498:20;19494:1;19483:9;19479:17;19472:47;19536:131;19662:4;19536:131;:::i;:::-;19528:139;;19255:419;;;:::o;19680:::-;19846:4;19884:2;19873:9;19869:18;19861:26;;19933:9;19927:4;19923:20;19919:1;19908:9;19904:17;19897:47;19961:131;20087:4;19961:131;:::i;:::-;19953:139;;19680:419;;;:::o;20105:::-;20271:4;20309:2;20298:9;20294:18;20286:26;;20358:9;20352:4;20348:20;20344:1;20333:9;20329:17;20322:47;20386:131;20512:4;20386:131;:::i;:::-;20378:139;;20105:419;;;:::o;20530:::-;20696:4;20734:2;20723:9;20719:18;20711:26;;20783:9;20777:4;20773:20;20769:1;20758:9;20754:17;20747:47;20811:131;20937:4;20811:131;:::i;:::-;20803:139;;20530:419;;;:::o;20955:::-;21121:4;21159:2;21148:9;21144:18;21136:26;;21208:9;21202:4;21198:20;21194:1;21183:9;21179:17;21172:47;21236:131;21362:4;21236:131;:::i;:::-;21228:139;;20955:419;;;:::o;21380:::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21633:9;21627:4;21623:20;21619:1;21608:9;21604:17;21597:47;21661:131;21787:4;21661:131;:::i;:::-;21653:139;;21380:419;;;:::o;21805:::-;21971:4;22009:2;21998:9;21994:18;21986:26;;22058:9;22052:4;22048:20;22044:1;22033:9;22029:17;22022:47;22086:131;22212:4;22086:131;:::i;:::-;22078:139;;21805:419;;;:::o;22230:::-;22396:4;22434:2;22423:9;22419:18;22411:26;;22483:9;22477:4;22473:20;22469:1;22458:9;22454:17;22447:47;22511:131;22637:4;22511:131;:::i;:::-;22503:139;;22230:419;;;:::o;22655:::-;22821:4;22859:2;22848:9;22844:18;22836:26;;22908:9;22902:4;22898:20;22894:1;22883:9;22879:17;22872:47;22936:131;23062:4;22936:131;:::i;:::-;22928:139;;22655:419;;;:::o;23080:::-;23246:4;23284:2;23273:9;23269:18;23261:26;;23333:9;23327:4;23323:20;23319:1;23308:9;23304:17;23297:47;23361:131;23487:4;23361:131;:::i;:::-;23353:139;;23080:419;;;:::o;23505:::-;23671:4;23709:2;23698:9;23694:18;23686:26;;23758:9;23752:4;23748:20;23744:1;23733:9;23729:17;23722:47;23786:131;23912:4;23786:131;:::i;:::-;23778:139;;23505:419;;;:::o;23930:::-;24096:4;24134:2;24123:9;24119:18;24111:26;;24183:9;24177:4;24173:20;24169:1;24158:9;24154:17;24147:47;24211:131;24337:4;24211:131;:::i;:::-;24203:139;;23930:419;;;:::o;24355:222::-;24448:4;24486:2;24475:9;24471:18;24463:26;;24499:71;24567:1;24556:9;24552:17;24543:6;24499:71;:::i;:::-;24355:222;;;;:::o;24583:423::-;24724:4;24762:2;24751:9;24747:18;24739:26;;24775:71;24843:1;24832:9;24828:17;24819:6;24775:71;:::i;:::-;24893:9;24887:4;24883:20;24878:2;24867:9;24863:18;24856:48;24921:78;24994:4;24985:6;24921:78;:::i;:::-;24913:86;;24583:423;;;;;:::o;25012:129::-;25046:6;25073:20;;:::i;:::-;25063:30;;25102:33;25130:4;25122:6;25102:33;:::i;:::-;25012:129;;;:::o;25147:75::-;25180:6;25213:2;25207:9;25197:19;;25147:75;:::o;25228:307::-;25289:4;25379:18;25371:6;25368:30;25365:56;;;25401:18;;:::i;:::-;25365:56;25439:29;25461:6;25439:29;:::i;:::-;25431:37;;25523:4;25517;25513:15;25505:23;;25228:307;;;:::o;25541:308::-;25603:4;25693:18;25685:6;25682:30;25679:56;;;25715:18;;:::i;:::-;25679:56;25753:29;25775:6;25753:29;:::i;:::-;25745:37;;25837:4;25831;25827:15;25819:23;;25541:308;;;:::o;25855:98::-;25906:6;25940:5;25934:12;25924:22;;25855:98;;;:::o;25959:99::-;26011:6;26045:5;26039:12;26029:22;;25959:99;;;:::o;26064:168::-;26147:11;26181:6;26176:3;26169:19;26221:4;26216:3;26212:14;26197:29;;26064:168;;;;:::o;26238:169::-;26322:11;26356:6;26351:3;26344:19;26396:4;26391:3;26387:14;26372:29;;26238:169;;;;:::o;26413:305::-;26453:3;26472:20;26490:1;26472:20;:::i;:::-;26467:25;;26506:20;26524:1;26506:20;:::i;:::-;26501:25;;26660:1;26592:66;26588:74;26585:1;26582:81;26579:107;;;26666:18;;:::i;:::-;26579:107;26710:1;26707;26703:9;26696:16;;26413:305;;;;:::o;26724:191::-;26764:4;26784:20;26802:1;26784:20;:::i;:::-;26779:25;;26818:20;26836:1;26818:20;:::i;:::-;26813:25;;26857:1;26854;26851:8;26848:34;;;26862:18;;:::i;:::-;26848:34;26907:1;26904;26900:9;26892:17;;26724:191;;;;:::o;26921:96::-;26958:7;26987:24;27005:5;26987:24;:::i;:::-;26976:35;;26921:96;;;:::o;27023:90::-;27057:7;27100:5;27093:13;27086:21;27075:32;;27023:90;;;:::o;27119:149::-;27155:7;27195:66;27188:5;27184:78;27173:89;;27119:149;;;:::o;27274:126::-;27311:7;27351:42;27344:5;27340:54;27329:65;;27274:126;;;:::o;27406:77::-;27443:7;27472:5;27461:16;;27406:77;;;:::o;27489:154::-;27573:6;27568:3;27563;27550:30;27635:1;27626:6;27621:3;27617:16;27610:27;27489:154;;;:::o;27649:307::-;27717:1;27727:113;27741:6;27738:1;27735:13;27727:113;;;27826:1;27821:3;27817:11;27811:18;27807:1;27802:3;27798:11;27791:39;27763:2;27760:1;27756:10;27751:15;;27727:113;;;27858:6;27855:1;27852:13;27849:101;;;27938:1;27929:6;27924:3;27920:16;27913:27;27849:101;27698:258;27649:307;;;:::o;27962:171::-;28001:3;28024:24;28042:5;28024:24;:::i;:::-;28015:33;;28070:4;28063:5;28060:15;28057:41;;;28078:18;;:::i;:::-;28057:41;28125:1;28118:5;28114:13;28107:20;;27962:171;;;:::o;28139:320::-;28183:6;28220:1;28214:4;28210:12;28200:22;;28267:1;28261:4;28257:12;28288:18;28278:81;;28344:4;28336:6;28332:17;28322:27;;28278:81;28406:2;28398:6;28395:14;28375:18;28372:38;28369:84;;;28425:18;;:::i;:::-;28369:84;28190:269;28139:320;;;:::o;28465:281::-;28548:27;28570:4;28548:27;:::i;:::-;28540:6;28536:40;28678:6;28666:10;28663:22;28642:18;28630:10;28627:34;28624:62;28621:88;;;28689:18;;:::i;:::-;28621:88;28729:10;28725:2;28718:22;28508:238;28465:281;;:::o;28752:233::-;28791:3;28814:24;28832:5;28814:24;:::i;:::-;28805:33;;28860:66;28853:5;28850:77;28847:103;;;28930:18;;:::i;:::-;28847:103;28977:1;28970:5;28966:13;28959:20;;28752:233;;;:::o;28991:180::-;29039:77;29036:1;29029:88;29136:4;29133:1;29126:15;29160:4;29157:1;29150:15;29177:180;29225:77;29222:1;29215:88;29322:4;29319:1;29312:15;29346:4;29343:1;29336:15;29363:180;29411:77;29408:1;29401:88;29508:4;29505:1;29498:15;29532:4;29529:1;29522:15;29549:117;29658:1;29655;29648:12;29672:117;29781:1;29778;29771:12;29795:117;29904:1;29901;29894:12;29918:117;30027:1;30024;30017:12;30041:102;30082:6;30133:2;30129:7;30124:2;30117:5;30113:14;30109:28;30099:38;;30041:102;;;:::o;30149:237::-;30289:34;30285:1;30277:6;30273:14;30266:58;30358:20;30353:2;30345:6;30341:15;30334:45;30149:237;:::o;30392:178::-;30532:30;30528:1;30520:6;30516:14;30509:54;30392:178;:::o;30576:223::-;30716:34;30712:1;30704:6;30700:14;30693:58;30785:6;30780:2;30772:6;30768:15;30761:31;30576:223;:::o;30805:175::-;30945:27;30941:1;30933:6;30929:14;30922:51;30805:175;:::o;30986:231::-;31126:34;31122:1;31114:6;31110:14;31103:58;31195:14;31190:2;31182:6;31178:15;31171:39;30986:231;:::o;31223:220::-;31363:34;31359:1;31351:6;31347:14;31340:58;31432:3;31427:2;31419:6;31415:15;31408:28;31223:220;:::o;31449:243::-;31589:34;31585:1;31577:6;31573:14;31566:58;31658:26;31653:2;31645:6;31641:15;31634:51;31449:243;:::o;31698:229::-;31838:34;31834:1;31826:6;31822:14;31815:58;31907:12;31902:2;31894:6;31890:15;31883:37;31698:229;:::o;31933:228::-;32073:34;32069:1;32061:6;32057:14;32050:58;32142:11;32137:2;32129:6;32125:15;32118:36;31933:228;:::o;32167:174::-;32307:26;32303:1;32295:6;32291:14;32284:50;32167:174;:::o;32347:182::-;32487:34;32483:1;32475:6;32471:14;32464:58;32347:182;:::o;32535:231::-;32675:34;32671:1;32663:6;32659:14;32652:58;32744:14;32739:2;32731:6;32727:15;32720:39;32535:231;:::o;32772:228::-;32912:34;32908:1;32900:6;32896:14;32889:58;32981:11;32976:2;32968:6;32964:15;32957:36;32772:228;:::o;33006:171::-;33146:23;33142:1;33134:6;33130:14;33123:47;33006:171;:::o;33183:220::-;33323:34;33319:1;33311:6;33307:14;33300:58;33392:3;33387:2;33379:6;33375:15;33368:28;33183:220;:::o;33409:236::-;33549:34;33545:1;33537:6;33533:14;33526:58;33618:19;33613:2;33605:6;33601:15;33594:44;33409:236;:::o;33651:174::-;33791:26;33787:1;33779:6;33775:14;33768:50;33651:174;:::o;33831:122::-;33904:24;33922:5;33904:24;:::i;:::-;33897:5;33894:35;33884:63;;33943:1;33940;33933:12;33884:63;33831:122;:::o;33959:116::-;34029:21;34044:5;34029:21;:::i;:::-;34022:5;34019:32;34009:60;;34065:1;34062;34055:12;34009:60;33959:116;:::o;34081:120::-;34153:23;34170:5;34153:23;:::i;:::-;34146:5;34143:34;34133:62;;34191:1;34188;34181:12;34133:62;34081:120;:::o;34207:122::-;34280:24;34298:5;34280:24;:::i;:::-;34273:5;34270:35;34260:63;;34319:1;34316;34309:12;34260:63;34207:122;:::o

Swarm Source

ipfs://28b5ed12ed9ddc5ca3fbdc6532b46c37ba572eddda37487785d75b202949c0cd
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.