ETH Price: $3,088.51 (-1.12%)
Gas: 2 Gwei

Ethereum Fear and Greed Index (EFGI)
 

Overview

TokenID

54

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
EthereumFear

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-07
*/

pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File base64-sol/[email protected]


pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}



pragma solidity ^0.8.0;



contract EthereumFear is ERC721Enumerable, ReentrancyGuard, Ownable {
  uint256 public constant PRICE = 69000000000000000; // 0.069 ETH

  constructor() ERC721("Ethereum Fear and Greed Index", "EFGI") Ownable() {}

  function mint(uint256 tokenId) external payable nonReentrant {
    require(tokenId > 0 && tokenId < 101, "Token ID invalid");
    require(PRICE <= msg.value, "Ether value sent is not correct. 0.069 ETH minumum.");
    _safeMint(_msgSender(), tokenId);
  }

  function tokenURI(uint256 tokenId)
    public
    pure
    override
    returns (string memory)
  {
    require(tokenId > 0 && tokenId < 101, "Token ID invalid");
    string memory color = getColor(tokenId);
    string memory textValue = getTextValue(tokenId);
    string memory degree = Strings.toString(getRotateDeg(tokenId));

    string[16] memory parts;
    parts[
      0
    ] = '<svg width="640" height="570" viewBox="0 0 640 570" xmlns="http://www.w3.org/2000/svg"><style>text{font-family:Lato,"Trebuchet MS",Arial,sans-serif;font-size:28px;}</style><rect width="640" height="570" rx="1" fill="white"/><circle cx="48" cy="48" r="25" fill="#627EEA"/><path d="M51.0852 29.7503L50.6973 30.5473L46.6051 54.8778L46.8106 55.1656L59.2271 50.3893L51.0852 29.7503Z" fill="#C0CBF6"/><path d="M51.0851 29.7503L36.6393 46.5903L46.8105 55.1656L48.7967 43.3563L51.0851 29.7503Z" fill="white"/><path d="M46.4505 57.3049L46.2829 57.4512L44.8252 66.118L44.896 66.5476L58.8734 52.5332L46.4505 57.3049Z" fill="#C0CBF6"/><path d="M44.8961 66.5476L46.4507 57.3049L36.2789 48.733L44.8961 66.5476Z" fill="white"/><path d="M46.8105 55.1652L59.227 50.3889L48.7967 43.3558L46.8105 55.1652Z" fill="#8197EE"/><path d="M36.6393 46.5899L46.8105 55.1652L48.7967 43.3559L36.6393 46.5899Z" fill="#C0CBF6"/><text x="84" y="68" style="font-size:45px; font-weight:bold;" fill="black">Fear &amp; Greed Index</text><text x="20" y="101" style="font-size:21px;" fill="#aaa">Multifactorial Ethereum Market Sentiment Analysis</text><line x1="20" y1="117" x2="620" y2="117" stroke="#bbb"/><text x="20" y="161" style="font-weight:bold;" fill="#000">Now:</text><text x="20" y="196" style="font-weight:bold;" fill="';
    parts[1] = color;
    parts[2] = '">';
    parts[3] = textValue;
    parts[4] = "</text>";
    parts[
      5
    ] = '<g transform="translate(125,210)"><path clip-rule="evenodd" d="m15.415 271.815 25.4999-11.328c-46.5001-129.672 50.2492-230.283 153.5001-230.491 104.306-.2101 202 99.819 154.5 230.319l26.5 11.5c60-141-59.89-273.53227-181-271.7981686-127.8207 1.8301786-235.5002 131.2981686-179 271.7981686z" fill="url(#a)" fill-rule="evenodd" style="filter:drop-shadow(0px 4px 5px rgba(0,0,0,0.3))"/><path transform="translate(-10,-4)" d="M50.0565 264.487C3.29813 134.815 100.585 34.204 204.409 33.996C309.295 33.7859 407.532 133.815 359.768 264.315" stroke="url(#d)" stroke-opacity="0.2" stroke-width="2" fill="none"/><path transform="translate(-10,-5)" d="M50.0565 266.487C3.29813 136.815 100.585 36.204 204.409 35.996C309.295 35.7859 407.532 135.815 359.768 266.315" stroke="white" stroke-opacity="0.6" fill="none"/><path transform="translate(-9,-5)" d="M51 266L25.415 277.815C-31.0852 137.315 76.5943 7.84701 204.415 6.01683C325.525 4.28273 445.415 136.815 385.415 277.815L358.5 266" stroke="url(#c)" stroke-opacity="0.5" stroke-width="2" fill="none"/></g>';
    parts[6] = '<g x="0" y="395" transform="translate(320,395) rotate(';
    parts[7] = degree;
    parts[8] = ' 0 10)"><circle cx="247" cy="10" r="31" fill="';
    parts[9] = color;
    parts[
      10
    ] = '"/><text fill="white" dominant-baseline="middle" text-anchor="middle" transform="translate(247,14) rotate(-';
    parts[11] = degree;
    parts[12] = ' 0 -3)">';
    parts[13] = Strings.toString(tokenId);
    parts[
      14
    ] = '</text><path d="M185.5 6.94696L185.5 13.053C185.5 13.8658 184.853 14.5307 184.04 14.5525L2.04031 19.445C1.19641 19.4677 0.499999 18.7897 0.499999 17.9455L0.5 2.05448C0.5 1.21026 1.19641 0.532334 2.04031 0.55502L184.04 5.4475C184.853 5.46934 185.5 6.13423 185.5 6.94696Z" fill="url(#b)" stroke="#777" filter="drop-shadow(1px 0px 5px rgba(0,0,0,0.2))"/><line x1="185" x2="185" y1="6" y2="14" stroke="white"/></g>';
    parts[
      15
    ] = '<linearGradient id="a"><stop stop-color="#d87357"/><stop offset=".5" stop-color="#ebdd6d"/><stop offset="1" stop-color="#7ad75d"/></linearGradient><linearGradient id="b" x1="186" y1="10" x2="-4.37114e-07" y2="9.99999" gradientUnits="userSpaceOnUse"><stop stop-color="#BBBABF"/><stop offset="1" stop-color="#ADADAD"/></linearGradient><linearGradient id="d" x1="205" y1="24" x2="205" y2="258" gradientUnits="userSpaceOnUse"><stop/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="205.688" y1="6" x2="205.688" y2="277.815" gradientUnits="userSpaceOnUse"><stop stop-color="white"/><stop offset="0.458333" stop-color="#797979"/><stop offset="1" stop-color="#515151" stop-opacity="0.33"/></linearGradient></svg>';

    string memory output = string(
      abi.encodePacked(
        parts[0],
        parts[1],
        parts[2],
        parts[3],
        parts[4],
        parts[5],
        parts[6],
        parts[7],
        parts[8]
      )
    );

    output = string(
      abi.encodePacked(
        output,
        parts[9],
        parts[10],
        parts[11],
        parts[12],
        parts[13],
        parts[14],
        parts[15]
      )
    );

    string memory json = Base64.encode(
      bytes(
        string(
          // prettier-ignore
          abi.encodePacked(
            '{"name": "Ethereum Fear and Greed Index: ',
            Strings.toString(tokenId),
            '", "description": "Multifactorial Ethereum Market Sentiment Analysis",',
            '"attributes": [',
              '{"trait_type": "Index", "value": ', Strings.toString(tokenId), '},',
              '{"trait_type": "Sentiment", "value": "', textValue, '"}',
            '],',
            '"image": "data:image/svg+xml;base64,',
            Base64.encode(bytes(output)),
            '"}'
          )
        )
      )
    );
    output = string(abi.encodePacked("data:application/json;base64,", json));

    return output;
  }

  function getTextValue(uint256 value) public pure returns (string memory) {
    if (value <= 23) {
      return "Extreme Fear";
    } else if (value >= 24 && value <= 37) {
      return "Fear";
    } else if (value >= 38 && value <= 54) {
      return "Neutral";
    } else if (value >= 55 && value <= 75) {
      return "Greed";
    } else if (value >= 76) {
      return "Extreme Greed";
    } else {
      return "Extreme Greed";
    }
  }

  function getRotateDeg(uint256 value) public pure returns (uint256) {
    return 180 - 21 + (220 * value) / 100;
  }

  function getColor(uint256 value) public pure returns (string memory) {
    return interpolateColor([216, 115, 87], [122, 215, 93], value);
  }

  function interpolateColor(
    uint8[3] memory color1,
    uint8[3] memory color2,
    uint256 factor
  ) private pure returns (string memory) {
    uint256[3] memory result;
    // prettier-ignore
    result[0] = color1[0] + factor * color2[0] / 100 - factor * color1[0] / 100;
    // prettier-ignore
    result[1] = color1[1] + factor * color2[1] / 100 - factor * color1[1] / 100;
    // prettier-ignore
    result[2] = color1[2] + factor * color2[2] / 100 - factor * color1[2] / 100;
    return
      string(
        abi.encodePacked(
          "rgb(",
          Strings.toString(result[0]),
          ", ",
          Strings.toString(result[1]),
          ", ",
          Strings.toString(result[2]),
          ")"
        )
      );
  }

  function withdrawAll() external payable onlyOwner {
    uint256 balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }
}

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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getRotateDeg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getTextValue","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252601d81527f457468657265756d204665617220616e6420477265656420496e6465780000006020808301918252835180850190945260048452634546474960e01b908401528151919291620000739160009162000101565b5080516200008990600190602084019062000101565b50506001600a5550620000a56200009f620000ab565b620000af565b620001e4565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600281046001821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b6137db80620001f46000396000f3fe6080604052600436106101665760003560e01c806370a08231116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde146103e3578063c87b56dd14610403578063e985e9c514610423578063f2fde38b1461044357610166565b806395d89b411461039b578063a0712d68146103b0578063a22cb465146103c357610166565b806370a0823114610314578063715018a61461033457806380057b9a14610349578063853828b6146103695780638d859f3e146103715780638da5cb5b1461038657610166565b80632f745c59116101235780632f745c591461025457806342842e0e146102745780634f6ccce7146102945780635db06986146102b457806360d7d8d2146102d45780636352211e146102f457610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806318160ddd1461021257806323b872dd14610234575b600080fd5b34801561017757600080fd5b5061018b610186366004611d3f565b610463565b6040516101989190612227565b60405180910390f35b3480156101ad57600080fd5b506101b6610490565b6040516101989190612232565b3480156101cf57600080fd5b506101e36101de366004611d77565b610522565b60405161019891906121d6565b3480156101fc57600080fd5b5061021061020b366004611d16565b61056e565b005b34801561021e57600080fd5b50610227610606565b60405161019891906127a7565b34801561024057600080fd5b5061021061024f366004611bd5565b61060c565b34801561026057600080fd5b5061022761026f366004611d16565b610644565b34801561028057600080fd5b5061021061028f366004611bd5565b610696565b3480156102a057600080fd5b506102276102af366004611d77565b6106b1565b3480156102c057600080fd5b506102276102cf366004611d77565b61070c565b3480156102e057600080fd5b506101b66102ef366004611d77565b610730565b34801561030057600080fd5b506101e361030f366004611d77565b61086b565b34801561032057600080fd5b5061022761032f366004611b82565b6108a0565b34801561034057600080fd5b506102106108e4565b34801561035557600080fd5b506101b6610364366004611d77565b61092f565b610210610978565b34801561037d57600080fd5b506102276109ea565b34801561039257600080fd5b506101e36109f5565b3480156103a757600080fd5b506101b6610a04565b6102106103be366004611d77565b610a13565b3480156103cf57600080fd5b506102106103de366004611cdc565b610aa6565b3480156103ef57600080fd5b506102106103fe366004611c10565b610b74565b34801561040f57600080fd5b506101b661041e366004611d77565b610bb3565b34801561042f57600080fd5b5061018b61043e366004611ba3565b610e96565b34801561044f57600080fd5b5061021061045e366004611b82565b610ec4565b60006001600160e01b0319821663780e9d6360e01b1480610488575061048882610f35565b90505b919050565b60606000805461049f9061283e565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb9061283e565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b5050505050905090565b600061052d82610f75565b6105525760405162461bcd60e51b81526004016105499061254b565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105798261086b565b9050806001600160a01b0316836001600160a01b031614156105ad5760405162461bcd60e51b81526004016105499061263f565b806001600160a01b03166105bf610f92565b6001600160a01b031614806105db57506105db8161043e610f92565b6105f75760405162461bcd60e51b815260040161054990612426565b6106018383610f96565b505050565b60085490565b61061d610617610f92565b82611004565b6106395760405162461bcd60e51b8152600401610549906126d3565b610601838383611089565b600061064f836108a0565b821061066d5760405162461bcd60e51b815260040161054990612245565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61060183838360405180602001604052806000815250610b74565b60006106bb610606565b82106106d95760405162461bcd60e51b815260040161054990612724565b600882815481106106fa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000606461071b8360dc6127dc565b61072591906127c8565b61048890609f6127b0565b606060178211610763575060408051808201909152600c81526b22bc3a3932b6b2902332b0b960a11b602082015261048b565b60188210158015610775575060258211155b1561079b57506040805180820190915260048152632332b0b960e11b602082015261048b565b602682101580156107ad575060368211155b156107d6575060408051808201909152600781526613995d5d1c985b60ca1b602082015261048b565b603782101580156107e85750604b8211155b1561080f575060408051808201909152600581526411dc99595960da1b602082015261048b565b604c8210610841575060408051808201909152600d81526c115e1d1c995b594811dc995959609a1b602082015261048b565b5060408051808201909152600d81526c115e1d1c995b594811dc995959609a1b602082015261048b565b6000818152600260205260408120546001600160a01b0316806104885760405162461bcd60e51b8152600401610549906124cd565b60006001600160a01b0382166108c85760405162461bcd60e51b815260040161054990612483565b506001600160a01b031660009081526003602052604090205490565b6108ec610f92565b6001600160a01b03166108fd6109f5565b6001600160a01b0316146109235760405162461bcd60e51b815260040161054990612597565b61092d60006111b6565b565b604080516060818101835260d88252607360208084019190915260578385015283518083018552607a815260d791810191909152605d9381019390935291610488919084611208565b610980610f92565b6001600160a01b03166109916109f5565b6001600160a01b0316146109b75760405162461bcd60e51b815260040161054990612597565b6040514790339082156108fc029083906000818181858888f193505050501580156109e6573d6000803e3d6000fd5b5050565b66f523226980800081565b600b546001600160a01b031690565b60606001805461049f9061283e565b6002600a541415610a365760405162461bcd60e51b815260040161054990612770565b6002600a558015801590610a4a5750606581105b610a665760405162461bcd60e51b8152600401610549906125cc565b3466f52322698080001115610a8d5760405162461bcd60e51b815260040161054990612680565b610a9e610a98610f92565b82611375565b506001600a55565b610aae610f92565b6001600160a01b0316826001600160a01b03161415610adf5760405162461bcd60e51b8152600401610549906123a3565b8060056000610aec610f92565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b30610f92565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b689190612227565b60405180910390a35050565b610b85610b7f610f92565b83611004565b610ba15760405162461bcd60e51b8152600401610549906126d3565b610bad8484848461138f565b50505050565b6060600082118015610bc55750606582105b610be15760405162461bcd60e51b8152600401610549906125cc565b6000610bec8361092f565b90506000610bf984610730565b90506000610c0e610c098661070c565b6113c2565b9050610c18611b25565b60405180610540016040528061050b815260200161323761050b9139815260208082018590526040805180820182526002815261111f60f11b8184015281840152606083018590528051808201825260078152661e17ba32bc3a1f60c91b818401526080840152805161044081019091526104128082529091612be09083013960a082015260408051606081019091526036808252613742602083013960c082015260e081018290526040805160608101909152602e808252613778602083013961010082015261012081018490526040805160a08101909152606b80825261318c60208301396101408201526101608101829052604080518082019091526008815267101810169994911f60c11b6020820152610180820152610d3b866113c2565b6101a0820152604080516101c0810190915261019a808252612ff260208301396101c08201526040805161030081019091526102df80825261290160208301396101e082015280516020808301516040808501516060860151608087015160a088015160c089015160e08a01516101008b0151965160009a610dc19a9099989101611f14565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a0151969850610e0e97899790602001611e6f565b60405160208183030381529060405290506000610e67610e2d896113c2565b610e368a6113c2565b87610e40866114dd565b604051602001610e539493929190612092565b6040516020818303038152906040526114dd565b905080604051602001610e7a919061204d565b60408051808303601f1901815291905298975050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610ecc610f92565b6001600160a01b0316610edd6109f5565b6001600160a01b031614610f035760405162461bcd60e51b815260040161054990612597565b6001600160a01b038116610f295760405162461bcd60e51b8152600401610549906122e2565b610f32816111b6565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f6657506001600160e01b03198216635b5e139f60e01b145b80610488575061048882611652565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fcb8261086b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061100f82610f75565b61102b5760405162461bcd60e51b8152600401610549906123da565b60006110368361086b565b9050806001600160a01b0316846001600160a01b031614806110715750836001600160a01b031661106684610522565b6001600160a01b0316145b8061108157506110818185610e96565b949350505050565b826001600160a01b031661109c8261086b565b6001600160a01b0316146110c25760405162461bcd60e51b8152600401610549906125f6565b6001600160a01b0382166110e85760405162461bcd60e51b81526004016105499061235f565b6110f383838361166b565b6110fe600082610f96565b6001600160a01b03831660009081526003602052604081208054600192906111279084906127fb565b90915550506001600160a01b03821660009081526003602052604081208054600192906111559084906127b0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060611212611b4d565b84516064906112249060ff16856127dc565b61122e91906127c8565b84516064906112409060ff16866127dc565b61124a91906127c8565b8651611259919060ff166127b0565b61126391906127fb565b8152602085015160649061127a9060ff16856127dc565b61128491906127c8565b60208501516064906112999060ff16866127dc565b6112a391906127c8565b60208701516112b5919060ff166127b0565b6112bf91906127fb565b602082015260408501516064906112d99060ff16856127dc565b6112e391906127c8565b60408501516064906112f89060ff16866127dc565b61130291906127c8565b6040870151611314919060ff166127b0565b61131e91906127fb565b60408201526113348160005b60200201516113c2565b61133f82600161132a565b61134a83600261132a565b60405160200161135c93929190611fd4565b6040516020818303038152906040529150509392505050565b6109e68282604051806020016040528060008152506116f4565b61139a848484611089565b6113a684848484611727565b610bad5760405162461bcd60e51b815260040161054990612290565b6060816113e757506040805180820190915260018152600360fc1b602082015261048b565b8160005b811561141157806113fb81612879565b915061140a9050600a836127c8565b91506113eb565b60008167ffffffffffffffff81111561143a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611464576020820181803683370190505b5090505b8415611081576114796001836127fb565b9150611486600a86612894565b6114919060306127b0565b60f81b8183815181106114b457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506114d6600a866127c8565b9450611468565b60608151600014156114fe575060408051602081019091526000815261048b565b60006040518060600160405280604081526020016131f7604091399050600060038451600261152d91906127b0565b61153791906127c8565b6115429060046127dc565b905060006115518260206127b0565b67ffffffffffffffff81111561157757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115a1576020820181803683370190505b509050818152600183018586518101602084015b8183101561160d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253506001016115b5565b600389510660018114611627576002811461163857611644565b613d3d60f01b600119830152611644565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b611676838383610601565b6001600160a01b0383166116925761168d81611842565b6116b5565b816001600160a01b0316836001600160a01b0316146116b5576116b58382611886565b6001600160a01b0382166116d1576116cc81611923565b610601565b826001600160a01b0316826001600160a01b0316146106015761060182826119fc565b6116fe8383611a40565b61170b6000848484611727565b6106015760405162461bcd60e51b815260040161054990612290565b600061173b846001600160a01b0316611b1f565b1561183757836001600160a01b031663150b7a02611757610f92565b8786866040518563ffffffff1660e01b815260040161177994939291906121ea565b602060405180830381600087803b15801561179357600080fd5b505af19250505080156117c3575060408051601f3d908101601f191682019092526117c091810190611d5b565b60015b61181d573d8080156117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b5080516118155760405162461bcd60e51b815260040161054990612290565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611081565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611893846108a0565b61189d91906127fb565b6000838152600760205260409020549091508082146118f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611935906001906127fb565b6000838152600960205260408120546008805493945090928490811061196b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061199a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806119e057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611a07836108a0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611a665760405162461bcd60e51b815260040161054990612516565b611a6f81610f75565b15611a8c5760405162461bcd60e51b815260040161054990612328565b611a986000838361166b565b6001600160a01b0382166000908152600360205260408120805460019290611ac19084906127b0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061020001604052806010905b6060815260200190600190039081611b355790505090565b60405180606001604052806003906020820280368337509192915050565b80356001600160a01b038116811461048b57600080fd5b600060208284031215611b93578081fd5b611b9c82611b6b565b9392505050565b60008060408385031215611bb5578081fd5b611bbe83611b6b565b9150611bcc60208401611b6b565b90509250929050565b600080600060608486031215611be9578081fd5b611bf284611b6b565b9250611c0060208501611b6b565b9150604084013590509250925092565b60008060008060808587031215611c25578081fd5b611c2e85611b6b565b93506020611c3d818701611b6b565b935060408601359250606086013567ffffffffffffffff80821115611c60578384fd5b818801915088601f830112611c73578384fd5b813581811115611c8557611c856128d4565b604051601f8201601f1916810185018381118282101715611ca857611ca86128d4565b60405281815283820185018b1015611cbe578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215611cee578182fd5b611cf783611b6b565b915060208301358015158114611d0b578182fd5b809150509250929050565b60008060408385031215611d28578182fd5b611d3183611b6b565b946020939093013593505050565b600060208284031215611d50578081fd5b8135611b9c816128ea565b600060208284031215611d6c578081fd5b8151611b9c816128ea565b600060208284031215611d88578081fd5b5035919050565b60008151808452611da7816020860160208601612812565b601f01601f19169290920160200192915050565b60008151611dcd818560208601612812565b9290920192915050565b611f4b60f21b815260020190565b7f7b2274726169745f74797065223a202253656e74696d656e74222c202276616c8152653ab2911d101160d11b602082015260260190565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b61174b60f21b815260020190565b600089516020611e828285838f01612812565b8a5191840191611e958184848f01612812565b8a51920191611ea78184848e01612812565b8951920191611eb98184848d01612812565b8851920191611ecb8184848c01612812565b8751920191611edd8184848b01612812565b8651920191611eef8184848a01612812565b8551920191611f018184848901612812565b919091019b9a5050505050505050505050565b60008a51611f26818460208f01612812565b8a5190830190611f3a818360208f01612812565b8a51611f4c8183850160208f01612812565b8a51929091010190611f62818360208d01612812565b8851910190611f75818360208c01612812565b8751611f878183850160208c01612812565b8751929091010190611f9d818360208a01612812565b8551910190611fb0818360208901612812565b8451611fc28183850160208901612812565b9101019b9a5050505050505050505050565b6000630e4cec4560e31b82528451611ff3816004850160208901612812565b808301905061016160f51b8060048301528551612017816006850160208a01612812565b60069201918201528351612032816008840160208801612812565b602960f81b6008929091019182015260090195945050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161208581601d850160208701612812565b91909101601d0192915050565b60007f7b226e616d65223a2022457468657265756d204665617220616e6420477265658252680321024b73232bc1d160bd1b602083015285516120dc816029850160208a01612812565b7f222c20226465736372697074696f6e223a20224d756c7469666163746f7269616029918401918201527f6c20457468657265756d204d61726b65742053656e74696d656e7420416e616c6049820152651e5cda5cc88b60d21b60698201526e2261747472696275746573223a205b60881b606f8201527f7b2274726169745f74797065223a2022496e646578222c202276616c7565223a607e820152600160fd1b609e8201526121cb6121b66121c56121c06121bb836121b06121ab6121a6609f8a018f611dbb565b611dd7565b611de5565b8b611dbb565b611e53565b611e61565b611e1d565b86611dbb565b979650505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221d90830184611d8f565b9695505050505050565b901515815260200190565b600060208252611b9c6020830184611d8f565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526033908201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e604082015272101817181b1c9022aa241036b4b73ab6bab69760691b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b600082198211156127c3576127c36128a8565b500190565b6000826127d7576127d76128be565b500490565b60008160001904831182151516156127f6576127f66128a8565b500290565b60008282101561280d5761280d6128a8565b500390565b60005b8381101561282d578181015183820152602001612815565b83811115610bad5750506000910152565b60028104600182168061285257607f821691505b6020821081141561287357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561288d5761288d6128a8565b5060010190565b6000826128a3576128a36128be565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3257600080fdfe3c6c696e6561724772616469656e742069643d2261223e3c73746f702073746f702d636f6c6f723d2223643837333537222f3e3c73746f70206f66667365743d222e35222073746f702d636f6c6f723d2223656264643664222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223376164373564222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2262222078313d22313836222079313d223130222078323d222d342e3337313134652d3037222079323d22392e393939393922206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702073746f702d636f6c6f723d2223424242414246222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223414441444144222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2264222078313d22323035222079313d223234222078323d22323035222079323d2232353822206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702f3e3c73746f70206f66667365743d2231222073746f702d6f7061636974793d2230222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2263222078313d223230352e363838222079313d2236222078323d223230352e363838222079323d223237372e38313522206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702073746f702d636f6c6f723d227768697465222f3e3c73746f70206f66667365743d22302e343538333333222073746f702d636f6c6f723d2223373937393739222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223353135313531222073746f702d6f7061636974793d22302e3333222f3e3c2f6c696e6561724772616469656e743e3c2f7376673e3c67207472616e73666f726d3d227472616e736c617465283132352c32313029223e3c7061746820636c69702d72756c653d226576656e6f64642220643d226d31352e343135203237312e3831352032352e343939392d31312e333238632d34362e353030312d3132392e3637322035302e323439322d3233302e323833203135332e353030312d3233302e343931203130342e3330362d2e32313031203230322039392e383139203135342e35203233302e3331396c32362e352031312e356336302d3134312d35392e38392d3237332e35333232372d3138312d3237312e373938313638362d3132372e3832303720312e383330313738362d3233352e35303032203133312e323938313638362d313739203237312e373938313638367a222066696c6c3d2275726c28236129222066696c6c2d72756c653d226576656e6f646422207374796c653d2266696c7465723a64726f702d736861646f77283070782034707820357078207267626128302c302c302c302e332929222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d31302c2d34292220643d224d35302e30353635203236342e34383743332e3239383133203133342e383135203130302e3538352033342e323034203230342e3430392033332e393936433330392e3239352033332e37383539203430372e353332203133332e383135203335392e373638203236342e33313522207374726f6b653d2275726c2823642922207374726f6b652d6f7061636974793d22302e3222207374726f6b652d77696474683d2232222066696c6c3d226e6f6e65222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d31302c2d35292220643d224d35302e30353635203236362e34383743332e3239383133203133362e383135203130302e3538352033362e323034203230342e3430392033352e393936433330392e3239352033352e37383539203430372e353332203133352e383135203335392e373638203236362e33313522207374726f6b653d22776869746522207374726f6b652d6f7061636974793d22302e36222066696c6c3d226e6f6e65222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d392c2d35292220643d224d3531203236364c32352e343135203237372e383135432d33312e30383532203133372e3331352037362e3539343320372e3834373031203230342e34313520362e3031363833433332352e35323520342e3238323733203434352e343135203133362e383135203338352e343135203237372e3831354c3335382e352032363622207374726f6b653d2275726c2823632922207374726f6b652d6f7061636974793d22302e3522207374726f6b652d77696474683d2232222066696c6c3d226e6f6e65222f3e3c2f673e3c2f746578743e3c7061746820643d224d3138352e3520362e39343639364c3138352e352031332e303533433138352e352031332e38363538203138342e3835332031342e35333037203138342e30342031342e353532354c322e30343033312031392e34343543312e31393634312031392e3436373720302e3439393939392031382e3738393720302e3439393939392031372e393435354c302e3520322e303534343843302e3520312e323130323620312e313936343120302e35333233333420322e303430333120302e35353530324c3138342e303420352e34343735433138342e38353320352e3436393334203138352e3520362e3133343233203138352e3520362e39343639365a222066696c6c3d2275726c2823622922207374726f6b653d2223373737222066696c7465723d2264726f702d736861646f77283170782030707820357078207267626128302c302c302c302e322929222f3e3c6c696e652078313d22313835222078323d22313835222079313d2236222079323d22313422207374726f6b653d227768697465222f3e3c2f673e222f3e3c746578742066696c6c3d2277686974652220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207472616e73666f726d3d227472616e736c617465283234372c31342920726f74617465282d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d2236343022206865696768743d22353730222076696577426f783d2230203020363430203537302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c7374796c653e746578747b666f6e742d66616d696c793a4c61746f2c22547265627563686574204d53222c417269616c2c73616e732d73657269663b666f6e742d73697a653a323870783b7d3c2f7374796c653e3c726563742077696474683d2236343022206865696768743d22353730222072783d2231222066696c6c3d227768697465222f3e3c636972636c652063783d223438222063793d2234382220723d223235222066696c6c3d2223363237454541222f3e3c7061746820643d224d35312e303835322032392e373530334c35302e363937332033302e353437334c34362e363035312035342e383737384c34362e383130362035352e313635364c35392e323237312035302e333839334c35312e303835322032392e373530335a222066696c6c3d2223433043424636222f3e3c7061746820643d224d35312e303835312032392e373530334c33362e363339332034362e353930334c34362e383130352035352e313635364c34382e373936372034332e333536334c35312e303835312032392e373530335a222066696c6c3d227768697465222f3e3c7061746820643d224d34362e343530352035372e333034394c34362e323832392035372e343531324c34342e383235322036362e3131384c34342e3839362036362e353437364c35382e383733342035322e353333324c34362e343530352035372e333034395a222066696c6c3d2223433043424636222f3e3c7061746820643d224d34342e383936312036362e353437364c34362e343530372035372e333034394c33362e323738392034382e3733334c34342e383936312036362e353437365a222066696c6c3d227768697465222f3e3c7061746820643d224d34362e383130352035352e313635324c35392e3232372035302e333838394c34382e373936372034332e333535384c34362e383130352035352e313635325a222066696c6c3d2223383139374545222f3e3c7061746820643d224d33362e363339332034362e353839394c34362e383130352035352e313635324c34382e373936372034332e333535394c33362e363339332034362e353839395a222066696c6c3d2223433043424636222f3e3c7465787420783d2238342220793d22363822207374796c653d22666f6e742d73697a653a343570783b20666f6e742d7765696768743a626f6c643b222066696c6c3d22626c61636b223e466561722026616d703b20477265656420496e6465783c2f746578743e3c7465787420783d2232302220793d2231303122207374796c653d22666f6e742d73697a653a323170783b222066696c6c3d2223616161223e4d756c7469666163746f7269616c20457468657265756d204d61726b65742053656e74696d656e7420416e616c797369733c2f746578743e3c6c696e652078313d223230222079313d22313137222078323d22363230222079323d2231313722207374726f6b653d2223626262222f3e3c7465787420783d2232302220793d2231363122207374796c653d22666f6e742d7765696768743a626f6c643b222066696c6c3d2223303030223e4e6f773a3c2f746578743e3c7465787420783d2232302220793d2231393622207374796c653d22666f6e742d7765696768743a626f6c643b222066696c6c3d223c6720783d22302220793d2233393522207472616e73666f726d3d227472616e736c617465283332302c3339352920726f7461746528203020313029223e3c636972636c652063783d22323437222063793d2231302220723d223331222066696c6c3d22a264697066735822122036c344c84968f3818a08cfcdb2a3ea9c08da93d8e3c9ac1f24239712d6ba304964736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101665760003560e01c806370a08231116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde146103e3578063c87b56dd14610403578063e985e9c514610423578063f2fde38b1461044357610166565b806395d89b411461039b578063a0712d68146103b0578063a22cb465146103c357610166565b806370a0823114610314578063715018a61461033457806380057b9a14610349578063853828b6146103695780638d859f3e146103715780638da5cb5b1461038657610166565b80632f745c59116101235780632f745c591461025457806342842e0e146102745780634f6ccce7146102945780635db06986146102b457806360d7d8d2146102d45780636352211e146102f457610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806318160ddd1461021257806323b872dd14610234575b600080fd5b34801561017757600080fd5b5061018b610186366004611d3f565b610463565b6040516101989190612227565b60405180910390f35b3480156101ad57600080fd5b506101b6610490565b6040516101989190612232565b3480156101cf57600080fd5b506101e36101de366004611d77565b610522565b60405161019891906121d6565b3480156101fc57600080fd5b5061021061020b366004611d16565b61056e565b005b34801561021e57600080fd5b50610227610606565b60405161019891906127a7565b34801561024057600080fd5b5061021061024f366004611bd5565b61060c565b34801561026057600080fd5b5061022761026f366004611d16565b610644565b34801561028057600080fd5b5061021061028f366004611bd5565b610696565b3480156102a057600080fd5b506102276102af366004611d77565b6106b1565b3480156102c057600080fd5b506102276102cf366004611d77565b61070c565b3480156102e057600080fd5b506101b66102ef366004611d77565b610730565b34801561030057600080fd5b506101e361030f366004611d77565b61086b565b34801561032057600080fd5b5061022761032f366004611b82565b6108a0565b34801561034057600080fd5b506102106108e4565b34801561035557600080fd5b506101b6610364366004611d77565b61092f565b610210610978565b34801561037d57600080fd5b506102276109ea565b34801561039257600080fd5b506101e36109f5565b3480156103a757600080fd5b506101b6610a04565b6102106103be366004611d77565b610a13565b3480156103cf57600080fd5b506102106103de366004611cdc565b610aa6565b3480156103ef57600080fd5b506102106103fe366004611c10565b610b74565b34801561040f57600080fd5b506101b661041e366004611d77565b610bb3565b34801561042f57600080fd5b5061018b61043e366004611ba3565b610e96565b34801561044f57600080fd5b5061021061045e366004611b82565b610ec4565b60006001600160e01b0319821663780e9d6360e01b1480610488575061048882610f35565b90505b919050565b60606000805461049f9061283e565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb9061283e565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b5050505050905090565b600061052d82610f75565b6105525760405162461bcd60e51b81526004016105499061254b565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105798261086b565b9050806001600160a01b0316836001600160a01b031614156105ad5760405162461bcd60e51b81526004016105499061263f565b806001600160a01b03166105bf610f92565b6001600160a01b031614806105db57506105db8161043e610f92565b6105f75760405162461bcd60e51b815260040161054990612426565b6106018383610f96565b505050565b60085490565b61061d610617610f92565b82611004565b6106395760405162461bcd60e51b8152600401610549906126d3565b610601838383611089565b600061064f836108a0565b821061066d5760405162461bcd60e51b815260040161054990612245565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61060183838360405180602001604052806000815250610b74565b60006106bb610606565b82106106d95760405162461bcd60e51b815260040161054990612724565b600882815481106106fa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000606461071b8360dc6127dc565b61072591906127c8565b61048890609f6127b0565b606060178211610763575060408051808201909152600c81526b22bc3a3932b6b2902332b0b960a11b602082015261048b565b60188210158015610775575060258211155b1561079b57506040805180820190915260048152632332b0b960e11b602082015261048b565b602682101580156107ad575060368211155b156107d6575060408051808201909152600781526613995d5d1c985b60ca1b602082015261048b565b603782101580156107e85750604b8211155b1561080f575060408051808201909152600581526411dc99595960da1b602082015261048b565b604c8210610841575060408051808201909152600d81526c115e1d1c995b594811dc995959609a1b602082015261048b565b5060408051808201909152600d81526c115e1d1c995b594811dc995959609a1b602082015261048b565b6000818152600260205260408120546001600160a01b0316806104885760405162461bcd60e51b8152600401610549906124cd565b60006001600160a01b0382166108c85760405162461bcd60e51b815260040161054990612483565b506001600160a01b031660009081526003602052604090205490565b6108ec610f92565b6001600160a01b03166108fd6109f5565b6001600160a01b0316146109235760405162461bcd60e51b815260040161054990612597565b61092d60006111b6565b565b604080516060818101835260d88252607360208084019190915260578385015283518083018552607a815260d791810191909152605d9381019390935291610488919084611208565b610980610f92565b6001600160a01b03166109916109f5565b6001600160a01b0316146109b75760405162461bcd60e51b815260040161054990612597565b6040514790339082156108fc029083906000818181858888f193505050501580156109e6573d6000803e3d6000fd5b5050565b66f523226980800081565b600b546001600160a01b031690565b60606001805461049f9061283e565b6002600a541415610a365760405162461bcd60e51b815260040161054990612770565b6002600a558015801590610a4a5750606581105b610a665760405162461bcd60e51b8152600401610549906125cc565b3466f52322698080001115610a8d5760405162461bcd60e51b815260040161054990612680565b610a9e610a98610f92565b82611375565b506001600a55565b610aae610f92565b6001600160a01b0316826001600160a01b03161415610adf5760405162461bcd60e51b8152600401610549906123a3565b8060056000610aec610f92565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b30610f92565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b689190612227565b60405180910390a35050565b610b85610b7f610f92565b83611004565b610ba15760405162461bcd60e51b8152600401610549906126d3565b610bad8484848461138f565b50505050565b6060600082118015610bc55750606582105b610be15760405162461bcd60e51b8152600401610549906125cc565b6000610bec8361092f565b90506000610bf984610730565b90506000610c0e610c098661070c565b6113c2565b9050610c18611b25565b60405180610540016040528061050b815260200161323761050b9139815260208082018590526040805180820182526002815261111f60f11b8184015281840152606083018590528051808201825260078152661e17ba32bc3a1f60c91b818401526080840152805161044081019091526104128082529091612be09083013960a082015260408051606081019091526036808252613742602083013960c082015260e081018290526040805160608101909152602e808252613778602083013961010082015261012081018490526040805160a08101909152606b80825261318c60208301396101408201526101608101829052604080518082019091526008815267101810169994911f60c11b6020820152610180820152610d3b866113c2565b6101a0820152604080516101c0810190915261019a808252612ff260208301396101c08201526040805161030081019091526102df80825261290160208301396101e082015280516020808301516040808501516060860151608087015160a088015160c089015160e08a01516101008b0151965160009a610dc19a9099989101611f14565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a0151969850610e0e97899790602001611e6f565b60405160208183030381529060405290506000610e67610e2d896113c2565b610e368a6113c2565b87610e40866114dd565b604051602001610e539493929190612092565b6040516020818303038152906040526114dd565b905080604051602001610e7a919061204d565b60408051808303601f1901815291905298975050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610ecc610f92565b6001600160a01b0316610edd6109f5565b6001600160a01b031614610f035760405162461bcd60e51b815260040161054990612597565b6001600160a01b038116610f295760405162461bcd60e51b8152600401610549906122e2565b610f32816111b6565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f6657506001600160e01b03198216635b5e139f60e01b145b80610488575061048882611652565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fcb8261086b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061100f82610f75565b61102b5760405162461bcd60e51b8152600401610549906123da565b60006110368361086b565b9050806001600160a01b0316846001600160a01b031614806110715750836001600160a01b031661106684610522565b6001600160a01b0316145b8061108157506110818185610e96565b949350505050565b826001600160a01b031661109c8261086b565b6001600160a01b0316146110c25760405162461bcd60e51b8152600401610549906125f6565b6001600160a01b0382166110e85760405162461bcd60e51b81526004016105499061235f565b6110f383838361166b565b6110fe600082610f96565b6001600160a01b03831660009081526003602052604081208054600192906111279084906127fb565b90915550506001600160a01b03821660009081526003602052604081208054600192906111559084906127b0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060611212611b4d565b84516064906112249060ff16856127dc565b61122e91906127c8565b84516064906112409060ff16866127dc565b61124a91906127c8565b8651611259919060ff166127b0565b61126391906127fb565b8152602085015160649061127a9060ff16856127dc565b61128491906127c8565b60208501516064906112999060ff16866127dc565b6112a391906127c8565b60208701516112b5919060ff166127b0565b6112bf91906127fb565b602082015260408501516064906112d99060ff16856127dc565b6112e391906127c8565b60408501516064906112f89060ff16866127dc565b61130291906127c8565b6040870151611314919060ff166127b0565b61131e91906127fb565b60408201526113348160005b60200201516113c2565b61133f82600161132a565b61134a83600261132a565b60405160200161135c93929190611fd4565b6040516020818303038152906040529150509392505050565b6109e68282604051806020016040528060008152506116f4565b61139a848484611089565b6113a684848484611727565b610bad5760405162461bcd60e51b815260040161054990612290565b6060816113e757506040805180820190915260018152600360fc1b602082015261048b565b8160005b811561141157806113fb81612879565b915061140a9050600a836127c8565b91506113eb565b60008167ffffffffffffffff81111561143a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611464576020820181803683370190505b5090505b8415611081576114796001836127fb565b9150611486600a86612894565b6114919060306127b0565b60f81b8183815181106114b457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506114d6600a866127c8565b9450611468565b60608151600014156114fe575060408051602081019091526000815261048b565b60006040518060600160405280604081526020016131f7604091399050600060038451600261152d91906127b0565b61153791906127c8565b6115429060046127dc565b905060006115518260206127b0565b67ffffffffffffffff81111561157757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115a1576020820181803683370190505b509050818152600183018586518101602084015b8183101561160d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253506001016115b5565b600389510660018114611627576002811461163857611644565b613d3d60f01b600119830152611644565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b611676838383610601565b6001600160a01b0383166116925761168d81611842565b6116b5565b816001600160a01b0316836001600160a01b0316146116b5576116b58382611886565b6001600160a01b0382166116d1576116cc81611923565b610601565b826001600160a01b0316826001600160a01b0316146106015761060182826119fc565b6116fe8383611a40565b61170b6000848484611727565b6106015760405162461bcd60e51b815260040161054990612290565b600061173b846001600160a01b0316611b1f565b1561183757836001600160a01b031663150b7a02611757610f92565b8786866040518563ffffffff1660e01b815260040161177994939291906121ea565b602060405180830381600087803b15801561179357600080fd5b505af19250505080156117c3575060408051601f3d908101601f191682019092526117c091810190611d5b565b60015b61181d573d8080156117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b5080516118155760405162461bcd60e51b815260040161054990612290565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611081565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611893846108a0565b61189d91906127fb565b6000838152600760205260409020549091508082146118f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611935906001906127fb565b6000838152600960205260408120546008805493945090928490811061196b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061199a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806119e057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611a07836108a0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611a665760405162461bcd60e51b815260040161054990612516565b611a6f81610f75565b15611a8c5760405162461bcd60e51b815260040161054990612328565b611a986000838361166b565b6001600160a01b0382166000908152600360205260408120805460019290611ac19084906127b0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061020001604052806010905b6060815260200190600190039081611b355790505090565b60405180606001604052806003906020820280368337509192915050565b80356001600160a01b038116811461048b57600080fd5b600060208284031215611b93578081fd5b611b9c82611b6b565b9392505050565b60008060408385031215611bb5578081fd5b611bbe83611b6b565b9150611bcc60208401611b6b565b90509250929050565b600080600060608486031215611be9578081fd5b611bf284611b6b565b9250611c0060208501611b6b565b9150604084013590509250925092565b60008060008060808587031215611c25578081fd5b611c2e85611b6b565b93506020611c3d818701611b6b565b935060408601359250606086013567ffffffffffffffff80821115611c60578384fd5b818801915088601f830112611c73578384fd5b813581811115611c8557611c856128d4565b604051601f8201601f1916810185018381118282101715611ca857611ca86128d4565b60405281815283820185018b1015611cbe578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215611cee578182fd5b611cf783611b6b565b915060208301358015158114611d0b578182fd5b809150509250929050565b60008060408385031215611d28578182fd5b611d3183611b6b565b946020939093013593505050565b600060208284031215611d50578081fd5b8135611b9c816128ea565b600060208284031215611d6c578081fd5b8151611b9c816128ea565b600060208284031215611d88578081fd5b5035919050565b60008151808452611da7816020860160208601612812565b601f01601f19169290920160200192915050565b60008151611dcd818560208601612812565b9290920192915050565b611f4b60f21b815260020190565b7f7b2274726169745f74797065223a202253656e74696d656e74222c202276616c8152653ab2911d101160d11b602082015260260190565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b61174b60f21b815260020190565b600089516020611e828285838f01612812565b8a5191840191611e958184848f01612812565b8a51920191611ea78184848e01612812565b8951920191611eb98184848d01612812565b8851920191611ecb8184848c01612812565b8751920191611edd8184848b01612812565b8651920191611eef8184848a01612812565b8551920191611f018184848901612812565b919091019b9a5050505050505050505050565b60008a51611f26818460208f01612812565b8a5190830190611f3a818360208f01612812565b8a51611f4c8183850160208f01612812565b8a51929091010190611f62818360208d01612812565b8851910190611f75818360208c01612812565b8751611f878183850160208c01612812565b8751929091010190611f9d818360208a01612812565b8551910190611fb0818360208901612812565b8451611fc28183850160208901612812565b9101019b9a5050505050505050505050565b6000630e4cec4560e31b82528451611ff3816004850160208901612812565b808301905061016160f51b8060048301528551612017816006850160208a01612812565b60069201918201528351612032816008840160208801612812565b602960f81b6008929091019182015260090195945050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161208581601d850160208701612812565b91909101601d0192915050565b60007f7b226e616d65223a2022457468657265756d204665617220616e6420477265658252680321024b73232bc1d160bd1b602083015285516120dc816029850160208a01612812565b7f222c20226465736372697074696f6e223a20224d756c7469666163746f7269616029918401918201527f6c20457468657265756d204d61726b65742053656e74696d656e7420416e616c6049820152651e5cda5cc88b60d21b60698201526e2261747472696275746573223a205b60881b606f8201527f7b2274726169745f74797065223a2022496e646578222c202276616c7565223a607e820152600160fd1b609e8201526121cb6121b66121c56121c06121bb836121b06121ab6121a6609f8a018f611dbb565b611dd7565b611de5565b8b611dbb565b611e53565b611e61565b611e1d565b86611dbb565b979650505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221d90830184611d8f565b9695505050505050565b901515815260200190565b600060208252611b9c6020830184611d8f565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526033908201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e604082015272101817181b1c9022aa241036b4b73ab6bab69760691b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b600082198211156127c3576127c36128a8565b500190565b6000826127d7576127d76128be565b500490565b60008160001904831182151516156127f6576127f66128a8565b500290565b60008282101561280d5761280d6128a8565b500390565b60005b8381101561282d578181015183820152602001612815565b83811115610bad5750506000910152565b60028104600182168061285257607f821691505b6020821081141561287357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561288d5761288d6128a8565b5060010190565b6000826128a3576128a36128be565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3257600080fdfe3c6c696e6561724772616469656e742069643d2261223e3c73746f702073746f702d636f6c6f723d2223643837333537222f3e3c73746f70206f66667365743d222e35222073746f702d636f6c6f723d2223656264643664222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223376164373564222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2262222078313d22313836222079313d223130222078323d222d342e3337313134652d3037222079323d22392e393939393922206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702073746f702d636f6c6f723d2223424242414246222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223414441444144222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2264222078313d22323035222079313d223234222078323d22323035222079323d2232353822206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702f3e3c73746f70206f66667365743d2231222073746f702d6f7061636974793d2230222f3e3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e742069643d2263222078313d223230352e363838222079313d2236222078323d223230352e363838222079323d223237372e38313522206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702073746f702d636f6c6f723d227768697465222f3e3c73746f70206f66667365743d22302e343538333333222073746f702d636f6c6f723d2223373937393739222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223353135313531222073746f702d6f7061636974793d22302e3333222f3e3c2f6c696e6561724772616469656e743e3c2f7376673e3c67207472616e73666f726d3d227472616e736c617465283132352c32313029223e3c7061746820636c69702d72756c653d226576656e6f64642220643d226d31352e343135203237312e3831352032352e343939392d31312e333238632d34362e353030312d3132392e3637322035302e323439322d3233302e323833203135332e353030312d3233302e343931203130342e3330362d2e32313031203230322039392e383139203135342e35203233302e3331396c32362e352031312e356336302d3134312d35392e38392d3237332e35333232372d3138312d3237312e373938313638362d3132372e3832303720312e383330313738362d3233352e35303032203133312e323938313638362d313739203237312e373938313638367a222066696c6c3d2275726c28236129222066696c6c2d72756c653d226576656e6f646422207374796c653d2266696c7465723a64726f702d736861646f77283070782034707820357078207267626128302c302c302c302e332929222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d31302c2d34292220643d224d35302e30353635203236342e34383743332e3239383133203133342e383135203130302e3538352033342e323034203230342e3430392033332e393936433330392e3239352033332e37383539203430372e353332203133332e383135203335392e373638203236342e33313522207374726f6b653d2275726c2823642922207374726f6b652d6f7061636974793d22302e3222207374726f6b652d77696474683d2232222066696c6c3d226e6f6e65222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d31302c2d35292220643d224d35302e30353635203236362e34383743332e3239383133203133362e383135203130302e3538352033362e323034203230342e3430392033352e393936433330392e3239352033352e37383539203430372e353332203133352e383135203335392e373638203236362e33313522207374726f6b653d22776869746522207374726f6b652d6f7061636974793d22302e36222066696c6c3d226e6f6e65222f3e3c70617468207472616e73666f726d3d227472616e736c617465282d392c2d35292220643d224d3531203236364c32352e343135203237372e383135432d33312e30383532203133372e3331352037362e3539343320372e3834373031203230342e34313520362e3031363833433332352e35323520342e3238323733203434352e343135203133362e383135203338352e343135203237372e3831354c3335382e352032363622207374726f6b653d2275726c2823632922207374726f6b652d6f7061636974793d22302e3522207374726f6b652d77696474683d2232222066696c6c3d226e6f6e65222f3e3c2f673e3c2f746578743e3c7061746820643d224d3138352e3520362e39343639364c3138352e352031332e303533433138352e352031332e38363538203138342e3835332031342e35333037203138342e30342031342e353532354c322e30343033312031392e34343543312e31393634312031392e3436373720302e3439393939392031382e3738393720302e3439393939392031372e393435354c302e3520322e303534343843302e3520312e323130323620312e313936343120302e35333233333420322e303430333120302e35353530324c3138342e303420352e34343735433138342e38353320352e3436393334203138352e3520362e3133343233203138352e3520362e39343639365a222066696c6c3d2275726c2823622922207374726f6b653d2223373737222066696c7465723d2264726f702d736861646f77283170782030707820357078207267626128302c302c302c302e322929222f3e3c6c696e652078313d22313835222078323d22313835222079313d2236222079323d22313422207374726f6b653d227768697465222f3e3c2f673e222f3e3c746578742066696c6c3d2277686974652220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207472616e73666f726d3d227472616e736c617465283234372c31342920726f74617465282d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d2236343022206865696768743d22353730222076696577426f783d2230203020363430203537302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c7374796c653e746578747b666f6e742d66616d696c793a4c61746f2c22547265627563686574204d53222c417269616c2c73616e732d73657269663b666f6e742d73697a653a323870783b7d3c2f7374796c653e3c726563742077696474683d2236343022206865696768743d22353730222072783d2231222066696c6c3d227768697465222f3e3c636972636c652063783d223438222063793d2234382220723d223235222066696c6c3d2223363237454541222f3e3c7061746820643d224d35312e303835322032392e373530334c35302e363937332033302e353437334c34362e363035312035342e383737384c34362e383130362035352e313635364c35392e323237312035302e333839334c35312e303835322032392e373530335a222066696c6c3d2223433043424636222f3e3c7061746820643d224d35312e303835312032392e373530334c33362e363339332034362e353930334c34362e383130352035352e313635364c34382e373936372034332e333536334c35312e303835312032392e373530335a222066696c6c3d227768697465222f3e3c7061746820643d224d34362e343530352035372e333034394c34362e323832392035372e343531324c34342e383235322036362e3131384c34342e3839362036362e353437364c35382e383733342035322e353333324c34362e343530352035372e333034395a222066696c6c3d2223433043424636222f3e3c7061746820643d224d34342e383936312036362e353437364c34362e343530372035372e333034394c33362e323738392034382e3733334c34342e383936312036362e353437365a222066696c6c3d227768697465222f3e3c7061746820643d224d34362e383130352035352e313635324c35392e3232372035302e333838394c34382e373936372034332e333535384c34362e383130352035352e313635325a222066696c6c3d2223383139374545222f3e3c7061746820643d224d33362e363339332034362e353839394c34362e383130352035352e313635324c34382e373936372034332e333535394c33362e363339332034362e353839395a222066696c6c3d2223433043424636222f3e3c7465787420783d2238342220793d22363822207374796c653d22666f6e742d73697a653a343570783b20666f6e742d7765696768743a626f6c643b222066696c6c3d22626c61636b223e466561722026616d703b20477265656420496e6465783c2f746578743e3c7465787420783d2232302220793d2231303122207374796c653d22666f6e742d73697a653a323170783b222066696c6c3d2223616161223e4d756c7469666163746f7269616c20457468657265756d204d61726b65742053656e74696d656e7420416e616c797369733c2f746578743e3c6c696e652078313d223230222079313d22313137222078323d22363230222079323d2231313722207374726f6b653d2223626262222f3e3c7465787420783d2232302220793d2231363122207374796c653d22666f6e742d7765696768743a626f6c643b222066696c6c3d2223303030223e4e6f773a3c2f746578743e3c7465787420783d2232302220793d2231393622207374796c653d22666f6e742d7765696768743a626f6c643b222066696c6c3d223c6720783d22302220793d2233393522207472616e73666f726d3d227472616e736c617465283332302c3339352920726f7461746528203020313029223e3c636972636c652063783d22323437222063793d2231302220723d223331222066696c6c3d22a264697066735822122036c344c84968f3818a08cfcdb2a3ea9c08da93d8e3c9ac1f24239712d6ba304964736f6c63430008000033

Deployed Bytecode Sourcemap

50794:7918:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34665:224;;;;;;;;;;-1:-1:-1;34665:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21558:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23117:221::-;;;;;;;;;;-1:-1:-1;23117:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22640:411::-;;;;;;;;;;-1:-1:-1;22640:411:0;;;;;:::i;:::-;;:::i;:::-;;35305:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24007:339::-;;;;;;;;;;-1:-1:-1;24007:339:0;;;;;:::i;:::-;;:::i;34973:256::-;;;;;;;;;;-1:-1:-1;34973:256:0;;;;;:::i;:::-;;:::i;24417:185::-;;;;;;;;;;-1:-1:-1;24417:185:0;;;;;:::i;:::-;;:::i;35495:233::-;;;;;;;;;;-1:-1:-1;35495:233:0;;;;;:::i;:::-;;:::i;57519:117::-;;;;;;;;;;-1:-1:-1;57519:117:0;;;;;:::i;:::-;;:::i;57058:455::-;;;;;;;;;;-1:-1:-1;57058:455:0;;;;;:::i;:::-;;:::i;21252:239::-;;;;;;;;;;-1:-1:-1;21252:239:0;;;;;:::i;:::-;;:::i;20982:208::-;;;;;;;;;;-1:-1:-1;20982:208:0;;;;;:::i;:::-;;:::i;45164:94::-;;;;;;;;;;;;;:::i;57642:144::-;;;;;;;;;;-1:-1:-1;57642:144:0;;;;;:::i;:::-;;:::i;58563:146::-;;;:::i;50867:49::-;;;;;;;;;;;;;:::i;44513:87::-;;;;;;;;;;;;;:::i;21727:104::-;;;;;;;;;;;;;:::i;51016:259::-;;;;;;:::i;:::-;;:::i;23410:295::-;;;;;;;;;;-1:-1:-1;23410:295:0;;;;;:::i;:::-;;:::i;24673:328::-;;;;;;;;;;-1:-1:-1;24673:328:0;;;;;:::i;:::-;;:::i;51281:5771::-;;;;;;;;;;-1:-1:-1;51281:5771:0;;;;;:::i;:::-;;:::i;23776:164::-;;;;;;;;;;-1:-1:-1;23776:164:0;;;;;:::i;:::-;;:::i;45413:192::-;;;;;;;;;;-1:-1:-1;45413:192:0;;;;;:::i;:::-;;:::i;34665:224::-;34767:4;-1:-1:-1;;;;;;34791:50:0;;-1:-1:-1;;;34791:50:0;;:90;;;34845:36;34869:11;34845:23;:36::i;:::-;34784:97;;34665:224;;;;:::o;21558:100::-;21612:13;21645:5;21638:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21558:100;:::o;23117:221::-;23193:7;23221:16;23229:7;23221;:16::i;:::-;23213:73;;;;-1:-1:-1;;;23213:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23306:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23306:24:0;;23117:221::o;22640:411::-;22721:13;22737:23;22752:7;22737:14;:23::i;:::-;22721:39;;22785:5;-1:-1:-1;;;;;22779:11:0;:2;-1:-1:-1;;;;;22779:11:0;;;22771:57;;;;-1:-1:-1;;;22771:57:0;;;;;;;:::i;:::-;22879:5;-1:-1:-1;;;;;22863:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22863:21:0;;:62;;;;22888:37;22905:5;22912:12;:10;:12::i;22888:37::-;22841:168;;;;-1:-1:-1;;;22841:168:0;;;;;;;:::i;:::-;23022:21;23031:2;23035:7;23022:8;:21::i;:::-;22640:411;;;:::o;35305:113::-;35393:10;:17;35305:113;:::o;24007:339::-;24202:41;24221:12;:10;:12::i;:::-;24235:7;24202:18;:41::i;:::-;24194:103;;;;-1:-1:-1;;;24194:103:0;;;;;;;:::i;:::-;24310:28;24320:4;24326:2;24330:7;24310:9;:28::i;34973:256::-;35070:7;35106:23;35123:5;35106:16;:23::i;:::-;35098:5;:31;35090:87;;;;-1:-1:-1;;;35090:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;35195:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34973:256::o;24417:185::-;24555:39;24572:4;24578:2;24582:7;24555:39;;;;;;;;;;;;:16;:39::i;35495:233::-;35570:7;35606:30;:28;:30::i;:::-;35598:5;:38;35590:95;;;;-1:-1:-1;;;35590:95:0;;;;;;;:::i;:::-;35703:10;35714:5;35703:17;;;;;;-1:-1:-1;;;35703:17:0;;;;;;;;;;;;;;;;;35696:24;;35495:233;;;:::o;57519:117::-;57577:7;57627:3;57612:11;57618:5;57612:3;:11;:::i;:::-;57611:19;;;;:::i;:::-;57600:30;;:8;:30;:::i;57058:455::-;57116:13;57151:2;57142:5;:11;57138:370;;-1:-1:-1;57164:21:0;;;;;;;;;;;;-1:-1:-1;;;57164:21:0;;;;;;57138:370;57212:2;57203:5;:11;;:26;;;;;57227:2;57218:5;:11;;57203:26;57199:309;;;-1:-1:-1;57240:13:0;;;;;;;;;;;;-1:-1:-1;;;57240:13:0;;;;;;57199:309;57280:2;57271:5;:11;;:26;;;;;57295:2;57286:5;:11;;57271:26;57267:241;;;-1:-1:-1;57308:16:0;;;;;;;;;;;;-1:-1:-1;;;57308:16:0;;;;;;57267:241;57351:2;57342:5;:11;;:26;;;;;57366:2;57357:5;:11;;57342:26;57338:170;;;-1:-1:-1;57379:14:0;;;;;;;;;;;;-1:-1:-1;;;57379:14:0;;;;;;57338:170;57420:2;57411:5;:11;57407:101;;-1:-1:-1;57433:22:0;;;;;;;;;;;;-1:-1:-1;;;57433:22:0;;;;;;57407:101;-1:-1:-1;57478:22:0;;;;;;;;;;;;-1:-1:-1;;;57478:22:0;;;;;;21252:239;21324:7;21360:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21360:16:0;21395:19;21387:73;;;;-1:-1:-1;;;21387:73:0;;;;;;;:::i;20982:208::-;21054:7;-1:-1:-1;;;;;21082:19:0;;21074:74;;;;-1:-1:-1;;;21074:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21166:16:0;;;;;:9;:16;;;;;;;20982:208::o;45164:94::-;44744:12;:10;:12::i;:::-;-1:-1:-1;;;;;44733:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;44733:23:0;;44725:68;;;;-1:-1:-1;;;44725:68:0;;;;;;;:::i;:::-;45229:21:::1;45247:1;45229:9;:21::i;:::-;45164:94::o:0;57642:144::-;57725:55;;;57696:13;57725:55;;;;;57743:3;57725:55;;57748:3;57725:55;;;;;;;;57753:2;57725:55;;;;;;;;;;;57759:3;57725:55;;57764:3;57725:55;;;;;;;57769:2;57725:55;;;;;;;57696:13;57725:55;;;57774:5;57725:16;:55::i;58563:146::-;44744:12;:10;:12::i;:::-;-1:-1:-1;;;;;44733:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;44733:23:0;;44725:68;;;;-1:-1:-1;;;44725:68:0;;;;;;;:::i;:::-;58666:37:::1;::::0;58638:21:::1;::::0;58674:10:::1;::::0;58666:37;::::1;;;::::0;58638:21;;58620:15:::1;58666:37:::0;58620:15;58666:37;58638:21;58674:10;58666:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;44804:1;58563:146::o:0;50867:49::-;50899:17;50867:49;:::o;44513:87::-;44586:6;;-1:-1:-1;;;;;44586:6:0;44513:87;:::o;21727:104::-;21783:13;21816:7;21809:14;;;;;:::i;51016:259::-;42566:1;43162:7;;:19;;43154:63;;;;-1:-1:-1;;;43154:63:0;;;;;;;:::i;:::-;42566:1;43295:7;:18;51092:11;;;;;:28:::1;;;51117:3;51107:7;:13;51092:28;51084:57;;;;-1:-1:-1::0;;;51084:57:0::1;;;;;;;:::i;:::-;51165:9;50899:17;51156:18;;51148:82;;;;-1:-1:-1::0;;;51148:82:0::1;;;;;;;:::i;:::-;51237:32;51247:12;:10;:12::i;:::-;51261:7;51237:9;:32::i;:::-;-1:-1:-1::0;42522:1:0;43474:7;:22;51016:259::o;23410:295::-;23525:12;:10;:12::i;:::-;-1:-1:-1;;;;;23513:24:0;:8;-1:-1:-1;;;;;23513:24:0;;;23505:62;;;;-1:-1:-1;;;23505:62:0;;;;;;;:::i;:::-;23625:8;23580:18;:32;23599:12;:10;:12::i;:::-;-1:-1:-1;;;;;23580:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23580:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23580:53:0;;;;;;;;;;;23664:12;:10;:12::i;:::-;-1:-1:-1;;;;;23649:48:0;;23688:8;23649:48;;;;;;:::i;:::-;;;;;;;;23410:295;;:::o;24673:328::-;24848:41;24867:12;:10;:12::i;:::-;24881:7;24848:18;:41::i;:::-;24840:103;;;;-1:-1:-1;;;24840:103:0;;;;;;;:::i;:::-;24954:39;24968:4;24974:2;24978:7;24987:5;24954:13;:39::i;:::-;24673:328;;;;:::o;51281:5771::-;51366:13;51409:1;51399:7;:11;:28;;;;;51424:3;51414:7;:13;51399:28;51391:57;;;;-1:-1:-1;;;51391:57:0;;;;;;;:::i;:::-;51455:19;51477:17;51486:7;51477:8;:17::i;:::-;51455:39;;51501:23;51527:21;51540:7;51527:12;:21::i;:::-;51501:47;;51555:20;51578:39;51595:21;51608:7;51595:12;:21::i;:::-;51578:16;:39::i;:::-;51555:62;;51626:23;;:::i;:::-;51656:1318;;;;;;;;;;;;;;;;;;;:22;52981:8;;;:16;;;53004:15;;;;;;;;;;;-1:-1:-1;;;53004:15:0;;;;:8;;;:15;53026:8;;;:20;;;53053;;;;;;;;;;-1:-1:-1;;;53053:20:0;;;;:8;;;:20;53080:1069;;;;;;;;;;;;;;;;;;;:22;;;:1069;54156:67;;;;;;;;;;;;;;53080:22;54156:67;;;:8;;;:67;54230:8;;;:17;;;54254:59;;;;;;;;;;;;;;54156:8;54254:59;;;:8;;;:59;54320:8;;;:16;;;54343:135;;;;;;;;;;;;;;54254:8;54343:135;;;:23;;;:135;54485:9;;;:18;;;54510:22;;;;;;;;;;;;-1:-1:-1;;;54343:23:0;54510:22;;;:9;;;:22;54551:25;54568:7;54551:16;:25::i;:::-;54539:9;;;:37;54583:438;;;;;;;;;;;;;;54539:9;54583:438;;;:23;;;:438;55028:763;;;;;;;;;;;;;;54583:23;55028:763;;;:23;;;:763;55865:8;;55028:23;55884:8;;;;55903;;;;;55922;;;;55941;;;;55960;;;;55979;;;;55998;;;;56017;;;;55838:196;;55800:20;;55838:196;;55865:8;;55884;56017;55838:196;;:::i;:::-;;;;;;;-1:-1:-1;;55838:196:0;;;;;;;56118:8;;;;56137:9;;;;56157;;;;56177;;;;56197;;;;56217;;;;56237;;;;55838:196;;-1:-1:-1;56074:181:0;;55838:196;;56237:9;56118:8;56074:181;;:::i;:::-;;;;;;;;;;;;;56050:212;;56271:18;56292:653;56468:25;56485:7;56468:16;:25::i;:::-;56666;56683:7;56666:16;:25::i;:::-;56756:9;56858:28;56878:6;56858:13;:28::i;:::-;56379:539;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56292:13;:653::i;:::-;56271:674;;57018:4;56968:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56968:55:0;;;;;;;51281:5771;-1:-1:-1;;;;;;;;51281:5771:0:o;23776:164::-;-1:-1:-1;;;;;23897:25:0;;;23873:4;23897:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23776:164::o;45413:192::-;44744:12;:10;:12::i;:::-;-1:-1:-1;;;;;44733:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;44733:23:0;;44725:68;;;;-1:-1:-1;;;44725:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45502:22:0;::::1;45494:73;;;;-1:-1:-1::0;;;45494:73:0::1;;;;;;;:::i;:::-;45578:19;45588:8;45578:9;:19::i;:::-;45413:192:::0;:::o;20613:305::-;20715:4;-1:-1:-1;;;;;;20752:40:0;;-1:-1:-1;;;20752:40:0;;:105;;-1:-1:-1;;;;;;;20809:48:0;;-1:-1:-1;;;20809:48:0;20752:105;:158;;;;20874:36;20898:11;20874:23;:36::i;26511:127::-;26576:4;26600:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26600:16:0;:30;;;26511:127::o;16021:98::-;16101:10;16021:98;:::o;30493:174::-;30568:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30568:29:0;-1:-1:-1;;;;;30568:29:0;;;;;;;;:24;;30622:23;30568:24;30622:14;:23::i;:::-;-1:-1:-1;;;;;30613:46:0;;;;;;;;;;;30493:174;;:::o;26805:348::-;26898:4;26923:16;26931:7;26923;:16::i;:::-;26915:73;;;;-1:-1:-1;;;26915:73:0;;;;;;;:::i;:::-;26999:13;27015:23;27030:7;27015:14;:23::i;:::-;26999:39;;27068:5;-1:-1:-1;;;;;27057:16:0;:7;-1:-1:-1;;;;;27057:16:0;;:51;;;;27101:7;-1:-1:-1;;;;;27077:31:0;:20;27089:7;27077:11;:20::i;:::-;-1:-1:-1;;;;;27077:31:0;;27057:51;:87;;;;27112:32;27129:5;27136:7;27112:16;:32::i;:::-;27049:96;26805:348;-1:-1:-1;;;;26805:348:0:o;29797:578::-;29956:4;-1:-1:-1;;;;;29929:31:0;:23;29944:7;29929:14;:23::i;:::-;-1:-1:-1;;;;;29929:31:0;;29921:85;;;;-1:-1:-1;;;29921:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30025:16:0;;30017:65;;;;-1:-1:-1;;;30017:65:0;;;;;;;:::i;:::-;30095:39;30116:4;30122:2;30126:7;30095:20;:39::i;:::-;30199:29;30216:1;30220:7;30199:8;:29::i;:::-;-1:-1:-1;;;;;30241:15:0;;;;;;:9;:15;;;;;:20;;30260:1;;30241:15;:20;;30260:1;;30241:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30272:13:0;;;;;;:9;:13;;;;;:18;;30289:1;;30272:13;:18;;30289:1;;30272:18;:::i;:::-;;;;-1:-1:-1;;30301:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30301:21:0;-1:-1:-1;;;;;30301:21:0;;;;;;;;;30340:27;;30301:16;;30340:27;;;;;;;29797:578;;;:::o;45613:173::-;45688:6;;;-1:-1:-1;;;;;45705:17:0;;;-1:-1:-1;;;;;;45705:17:0;;;;;;;45738:40;;45688:6;;;45705:17;45688:6;;45738:40;;45669:16;;45738:40;45613:173;;:::o;57792:765::-;57924:13;57946:24;;:::i;:::-;58061:9;;58073:3;;58052:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58034:9;;58046:3;;58025:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58013:9;;:36;;;;;;:::i;:::-;:63;;;;:::i;:::-;58001:75;;:9;58167;;;58179:3;;58158:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58140:9;;;;58152:3;;58131:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58119:9;;;;:36;;;;;;:::i;:::-;:63;;;;:::i;:::-;58107:9;;;:75;58273:9;;;;58285:3;;58264:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58246:9;;;;58258:3;;58237:18;;;;:6;:18;:::i;:::-;:24;;;;:::i;:::-;58225:9;;;;:36;;;;;;:::i;:::-;:63;;;;:::i;:::-;58213:9;;;:75;58374:27;58213:6;58398:1;58391:9;;;;;58374:16;:27::i;:::-;58431;58448:6;58455:1;58448:9;;58431:27;58488;58505:6;58512:1;58505:9;;58488:27;58326:216;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58295:256;;;57792:765;;;;;:::o;27495:110::-;27571:26;27581:2;27585:7;27571:26;;;;;;;;;;;;:9;:26::i;25883:315::-;26040:28;26050:4;26056:2;26060:7;26040:9;:28::i;:::-;26087:48;26110:4;26116:2;26120:7;26129:5;26087:22;:48::i;:::-;26079:111;;;;-1:-1:-1;;;26079:111:0;;;;;;;:::i;16552:723::-;16608:13;16829:10;16825:53;;-1:-1:-1;16856:10:0;;;;;;;;;;;;-1:-1:-1;;;16856:10:0;;;;;;16825:53;16903:5;16888:12;16944:78;16951:9;;16944:78;;16977:8;;;;:::i;:::-;;-1:-1:-1;17000:10:0;;-1:-1:-1;17008:2:0;17000:10;;:::i;:::-;;;16944:78;;;17032:19;17064:6;17054:17;;;;;;-1:-1:-1;;;17054:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17054:17:0;;17032:39;;17082:154;17089:10;;17082:154;;17116:11;17126:1;17116:11;;:::i;:::-;;-1:-1:-1;17185:10:0;17193:2;17185:5;:10;:::i;:::-;17172:24;;:2;:24;:::i;:::-;17159:39;;17142:6;17149;17142:14;;;;;;-1:-1:-1;;;17142:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17142:56:0;;;;;;;;-1:-1:-1;17213:11:0;17222:2;17213:11;;:::i;:::-;;;17082:154;;46593:1912;46651:13;46681:4;:11;46696:1;46681:16;46677:31;;;-1:-1:-1;46699:9:0;;;;;;;;;-1:-1:-1;46699:9:0;;;;46677:31;46760:19;46782:12;;;;;;;;;;;;;;;;;46760:34;;46846:18;46892:1;46873:4;:11;46887:1;46873:15;;;;:::i;:::-;46872:21;;;;:::i;:::-;46867:27;;:1;:27;:::i;:::-;46846:48;-1:-1:-1;46977:20:0;47011:15;46846:48;47024:2;47011:15;:::i;:::-;47000:27;;;;;;-1:-1:-1;;;47000:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47000:27:0;;46977:50;;47124:10;47116:6;47109:26;47219:1;47212:5;47208:13;47278:4;47329;47323:11;47314:7;47310:25;47425:2;47417:6;47413:15;47498:754;47517:6;47508:7;47505:19;47498:754;;;47617:1;47608:7;47604:15;47593:26;;47656:7;47650:14;47782:4;47774:5;47770:2;47766:14;47762:25;47752:8;47748:40;47742:47;47731:9;47723:67;47836:1;47825:9;47821:17;47808:30;;47915:4;47907:5;47903:2;47899:14;47895:25;47885:8;47881:40;47875:47;47864:9;47856:67;47969:1;47958:9;47954:17;47941:30;;48048:4;48040:5;48037:1;48032:14;48028:25;48018:8;48014:40;48008:47;47997:9;47989:67;48102:1;48091:9;48087:17;48074:30;;48181:4;48173:5;48161:25;48151:8;48147:40;48141:47;48130:9;48122:67;-1:-1:-1;48235:1:0;48220:17;47498:754;;;48325:1;48318:4;48312:11;48308:19;48346:1;48341:54;;;;48414:1;48409:52;;;;48301:160;;48341:54;-1:-1:-1;;;;;48357:17:0;;48350:43;48341:54;;48409:52;-1:-1:-1;;;;;48425:17:0;;48418:41;48301:160;-1:-1:-1;48491:6:0;;46593:1912;-1:-1:-1;;;;;;;;46593:1912:0:o;19113:157::-;-1:-1:-1;;;;;;19222:40:0;;-1:-1:-1;;;19222:40:0;19113:157;;;:::o;36341:589::-;36485:45;36512:4;36518:2;36522:7;36485:26;:45::i;:::-;-1:-1:-1;;;;;36547:18:0;;36543:187;;36582:40;36614:7;36582:31;:40::i;:::-;36543:187;;;36652:2;-1:-1:-1;;;;;36644:10:0;:4;-1:-1:-1;;;;;36644:10:0;;36640:90;;36671:47;36704:4;36710:7;36671:32;:47::i;:::-;-1:-1:-1;;;;;36744:16:0;;36740:183;;36777:45;36814:7;36777:36;:45::i;:::-;36740:183;;;36850:4;-1:-1:-1;;;;;36844:10:0;:2;-1:-1:-1;;;;;36844:10:0;;36840:83;;36871:40;36899:2;36903:7;36871:27;:40::i;27832:321::-;27962:18;27968:2;27972:7;27962:5;:18::i;:::-;28013:54;28044:1;28048:2;28052:7;28061:5;28013:22;:54::i;:::-;27991:154;;;;-1:-1:-1;;;27991:154:0;;;;;;;:::i;31232:799::-;31387:4;31408:15;:2;-1:-1:-1;;;;;31408:13:0;;:15::i;:::-;31404:620;;;31460:2;-1:-1:-1;;;;;31444:36:0;;31481:12;:10;:12::i;:::-;31495:4;31501:7;31510:5;31444:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31444:72:0;;;;;;;;-1:-1:-1;;31444:72:0;;;;;;;;;;;;:::i;:::-;;;31440:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31686:13:0;;31682:272;;31729:60;;-1:-1:-1;;;31729:60:0;;;;;;;:::i;31682:272::-;31904:6;31898:13;31889:6;31885:2;31881:15;31874:38;31440:529;-1:-1:-1;;;;;;31567:51:0;-1:-1:-1;;;31567:51:0;;-1:-1:-1;31560:58:0;;31404:620;-1:-1:-1;32008:4:0;31232:799;;;;;;:::o;37653:164::-;37757:10;:17;;37730:24;;;;:15;:24;;;;;:44;;;37785:24;;;;;;;;;;;;37653:164::o;38444:988::-;38710:22;38760:1;38735:22;38752:4;38735:16;:22::i;:::-;:26;;;;:::i;:::-;38772:18;38793:26;;;:17;:26;;;;;;38710:51;;-1:-1:-1;38926:28:0;;;38922:328;;-1:-1:-1;;;;;38993:18:0;;38971:19;38993:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39044:30;;;;;;:44;;;39161:30;;:17;:30;;;;;:43;;;38922:328;-1:-1:-1;39346:26:0;;;;:17;:26;;;;;;;;39339:33;;;-1:-1:-1;;;;;39390:18:0;;;;;:12;:18;;;;;:34;;;;;;;39383:41;38444:988::o;39727:1079::-;40005:10;:17;39980:22;;40005:21;;40025:1;;40005:21;:::i;:::-;40037:18;40058:24;;;:15;:24;;;;;;40431:10;:26;;39980:46;;-1:-1:-1;40058:24:0;;39980:46;;40431:26;;;;-1:-1:-1;;;40431:26:0;;;;;;;;;;;;;;;;;40409:48;;40495:11;40470:10;40481;40470:22;;;;;;-1:-1:-1;;;40470:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40575:28;;;:15;:28;;;;;;;:41;;;40747:24;;;;;40740:31;40782:10;:16;;;;;-1:-1:-1;;;40782:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39727:1079;;;;:::o;37231:221::-;37316:14;37333:20;37350:2;37333:16;:20::i;:::-;-1:-1:-1;;;;;37364:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37409:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37231:221:0:o;28489:382::-;-1:-1:-1;;;;;28569:16:0;;28561:61;;;;-1:-1:-1;;;28561:61:0;;;;;;;:::i;:::-;28642:16;28650:7;28642;:16::i;:::-;28641:17;28633:58;;;;-1:-1:-1;;;28633:58:0;;;;;;;:::i;:::-;28704:45;28733:1;28737:2;28741:7;28704:20;:45::i;:::-;-1:-1:-1;;;;;28762:13:0;;;;;;:9;:13;;;;;:18;;28779:1;;28762:13;:18;;28779:1;;28762:18;:::i;:::-;;;;-1:-1:-1;;28791:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28791:21:0;-1:-1:-1;;;;;28791:21:0;;;;;;;;28830:33;;28791:16;;;28830:33;;28791:16;;28830:33;28489:382;;:::o;8059:387::-;8382:20;8430:8;;;8059:387::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;:::-;345:41;264:128;-1:-1:-1;;;264:128:1:o;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:1178::-;;;;;1195:3;1183:9;1174:7;1170:23;1166:33;1163:2;;;1217:6;1209;1202:22;1163:2;1245:31;1266:9;1245:31;:::i;:::-;1235:41;;1295:2;1316:40;1352:2;1341:9;1337:18;1316:40;:::i;:::-;1306:50;;1403:2;1392:9;1388:18;1375:32;1365:42;;1458:2;1447:9;1443:18;1430:32;1481:18;1522:2;1514:6;1511:14;1508:2;;;1543:6;1535;1528:22;1508:2;1586:6;1575:9;1571:22;1561:32;;1631:7;1624:4;1620:2;1616:13;1612:27;1602:2;;1658:6;1650;1643:22;1602:2;1699;1686:16;1721:2;1717;1714:10;1711:2;;;1727:18;;:::i;:::-;1776:2;1770:9;1845:2;1826:13;;-1:-1:-1;;1822:27:1;1810:40;;1806:49;;1870:18;;;1890:22;;;1867:46;1864:2;;;1916:18;;:::i;:::-;1952:2;1945:22;1976:18;;;2013:11;;;2009:20;;2006:33;-1:-1:-1;2003:2:1;;;2057:6;2049;2042:22;2003:2;2118;2113;2109;2105:11;2100:2;2092:6;2088:15;2075:46;2141:15;;;2137:24;;;2130:40;;;;-1:-1:-1;1153:1048:1;;;;-1:-1:-1;1153:1048:1;;-1:-1:-1;;1153:1048:1:o;2206:369::-;;;2332:2;2320:9;2311:7;2307:23;2303:32;2300:2;;;2353:6;2345;2338:22;2300:2;2381:31;2402:9;2381:31;:::i;:::-;2371:41;;2462:2;2451:9;2447:18;2434:32;2509:5;2502:13;2495:21;2488:5;2485:32;2475:2;;2536:6;2528;2521:22;2475:2;2564:5;2554:15;;;2290:285;;;;;:::o;2580:266::-;;;2709:2;2697:9;2688:7;2684:23;2680:32;2677:2;;;2730:6;2722;2715:22;2677:2;2758:31;2779:9;2758:31;:::i;:::-;2748:41;2836:2;2821:18;;;;2808:32;;-1:-1:-1;;;2667:179:1:o;2851:257::-;;2962:2;2950:9;2941:7;2937:23;2933:32;2930:2;;;2983:6;2975;2968:22;2930:2;3027:9;3014:23;3046:32;3072:5;3046:32;:::i;3113:261::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3256:6;3248;3241:22;3203:2;3293:9;3287:16;3312:32;3338:5;3312:32;:::i;3379:190::-;;3491:2;3479:9;3470:7;3466:23;3462:32;3459:2;;;3512:6;3504;3497:22;3459:2;-1:-1:-1;3540:23:1;;3449:120;-1:-1:-1;3449:120:1:o;3574:259::-;;3655:5;3649:12;3682:6;3677:3;3670:19;3698:63;3754:6;3747:4;3742:3;3738:14;3731:4;3724:5;3720:16;3698:63;:::i;:::-;3815:2;3794:15;-1:-1:-1;;3790:29:1;3781:39;;;;3822:4;3777:50;;3625:208;-1:-1:-1;;3625:208:1:o;3838:187::-;;3920:5;3914:12;3935:52;3980:6;3975:3;3968:4;3961:5;3957:16;3935:52;:::i;:::-;4003:16;;;;;3890:135;-1:-1:-1;;3890:135:1:o;4030:117::-;-1:-1:-1;;;4097:17:1;;4139:1;4130:11;;4087:60::o;4152:235::-;4231:66;4219:79;;-1:-1:-1;;;4323:2:1;4314:12;;4307:46;4378:2;4369:12;;4209:178::o;4392:217::-;4471:66;4459:79;;-1:-1:-1;;;4563:2:1;4554:12;;4547:28;4600:2;4591:12;;4449:160::o;4614:127::-;-1:-1:-1;;;4681:27:1;;4733:1;4724:11;;4671:70::o;4746:117::-;-1:-1:-1;;;4813:17:1;;4855:1;4846:11;;4803:60::o;4868:1641::-;;5373:6;5367:13;5399:4;5412:51;5456:6;5451:3;5446:2;5438:6;5434:15;5412:51;:::i;:::-;5526:13;;5485:16;;;;5548:55;5526:13;5485:16;5570:15;;;5548:55;:::i;:::-;5670:13;;5625:20;;;5692:55;5670:13;5625:20;5714:15;;;5692:55;:::i;:::-;5814:13;;5769:20;;;5836:55;5814:13;5769:20;5858:15;;;5836:55;:::i;:::-;5958:13;;5913:20;;;5980:55;5958:13;5913:20;6002:15;;;5980:55;:::i;:::-;6102:13;;6057:20;;;6124:55;6102:13;6057:20;6146:15;;;6124:55;:::i;:::-;6246:13;;6201:20;;;6268:55;6246:13;6201:20;6290:15;;;6268:55;:::i;:::-;6390:13;;6345:20;;;6412:55;6390:13;6345:20;6434:15;;;6412:55;:::i;:::-;6483:20;;;;;5343:1166;-1:-1:-1;;;;;;;;;;;5343:1166:1:o;6514:1792::-;;7067:6;7061:13;7083:53;7129:6;7124:3;7117:4;7109:6;7105:17;7083:53;:::i;:::-;7199:13;;7158:16;;;;7221:57;7199:13;7158:16;7255:4;7243:17;;7221:57;:::i;:::-;7309:6;7303:13;7325:72;7388:8;7377;7370:5;7366:20;7359:4;7351:6;7347:17;7325:72;:::i;:::-;7479:13;;7423:20;;;;7419:35;;7501:57;7479:13;7419:35;7535:4;7523:17;;7501:57;:::i;:::-;7625:13;;7580:20;;;7647:57;7625:13;7580:20;7681:4;7669:17;;7647:57;:::i;:::-;7735:6;7729:13;7751:72;7814:8;7803;7796:5;7792:20;7785:4;7777:6;7773:17;7751:72;:::i;:::-;7905:13;;7849:20;;;;7845:35;;7927:57;7905:13;7845:35;7961:4;7949:17;;7927:57;:::i;:::-;8051:13;;8006:20;;;8073:57;8051:13;8006:20;8107:4;8095:17;;8073:57;:::i;:::-;8161:6;8155:13;8177:72;8240:8;8229;8222:5;8218:20;8211:4;8203:6;8199:17;8177:72;:::i;:::-;8269:20;;8265:35;;7037:1269;-1:-1:-1;;;;;;;;;;;7037:1269:1:o;8311:1248::-;;-1:-1:-1;;;8967:3:1;8960:19;9008:6;9002:13;9024:61;9078:6;9074:1;9069:3;9065:11;9058:4;9050:6;9046:17;9024:61;:::i;:::-;9113:6;9108:3;9104:16;9094:26;;-1:-1:-1;;;9171:2:1;9167:1;9163:2;9159:10;9152:22;9205:6;9199:13;9221:62;9274:8;9270:1;9266:2;9262:10;9255:4;9247:6;9243:17;9221:62;:::i;:::-;9343:1;9302:17;;9335:10;;;9328:22;9375:13;;9397:62;9375:13;9446:1;9438:10;;9431:4;9419:17;;9397:62;:::i;:::-;-1:-1:-1;;;9519:1:1;9478:17;;;;9511:10;;;9504:23;9551:1;9543:10;;8950:609;-1:-1:-1;;;;;8950:609:1:o;9564:448::-;;9826:31;9821:3;9814:44;9887:6;9881:13;9903:62;9958:6;9953:2;9948:3;9944:12;9937:4;9929:6;9925:17;9903:62;:::i;:::-;9985:16;;;;10003:2;9981:25;;9804:208;-1:-1:-1;;9804:208:1:o;10017:2302::-;;11332:66;11327:3;11320:79;-1:-1:-1;;;11424:2:1;11419:3;11415:12;11408:33;11470:6;11464:13;11486:60;11539:6;11534:2;11529:3;11525:12;11520:2;11512:6;11508:15;11486:60;:::i;:::-;11610:66;11605:2;11565:16;;;11597:11;;;11590:87;11706:34;11701:2;11693:11;;11686:55;-1:-1:-1;;;11765:3:1;11757:12;;11750:46;-1:-1:-1;;;11820:3:1;11812:12;;11805:64;11899:66;11893:3;11885:12;;11878:88;-1:-1:-1;;;11990:3:1;11982:12;;11975:25;12016:297;12048:264;12076:235;12108:202;12140:169;12048:264;12200:107;12232:74;12264:41;12300:3;12292:12;;12284:6;12264:41;:::i;:::-;12232:74;:::i;:::-;12200:107;:::i;:::-;12192:6;12172:136;:::i;:::-;12140:169;:::i;:::-;12108:202;:::i;:::-;12076:235;:::i;:::-;12068:6;12048:264;:::i;12016:297::-;12009:304;11310:1009;-1:-1:-1;;;;;;;11310:1009:1:o;12324:203::-;-1:-1:-1;;;;;12488:32:1;;;;12470:51;;12458:2;12443:18;;12425:102::o;12532:490::-;-1:-1:-1;;;;;12801:15:1;;;12783:34;;12853:15;;12848:2;12833:18;;12826:43;12900:2;12885:18;;12878:34;;;12948:3;12943:2;12928:18;;12921:31;;;12532:490;;12969:47;;12996:19;;12988:6;12969:47;:::i;:::-;12961:55;12735:287;-1:-1:-1;;;;;;12735:287:1:o;13027:187::-;13192:14;;13185:22;13167:41;;13155:2;13140:18;;13122:92::o;13219:221::-;;13368:2;13357:9;13350:21;13388:46;13430:2;13419:9;13415:18;13407:6;13388:46;:::i;13445:407::-;13647:2;13629:21;;;13686:2;13666:18;;;13659:30;13725:34;13720:2;13705:18;;13698:62;-1:-1:-1;;;13791:2:1;13776:18;;13769:41;13842:3;13827:19;;13619:233::o;13857:414::-;14059:2;14041:21;;;14098:2;14078:18;;;14071:30;14137:34;14132:2;14117:18;;14110:62;-1:-1:-1;;;14203:2:1;14188:18;;14181:48;14261:3;14246:19;;14031:240::o;14276:402::-;14478:2;14460:21;;;14517:2;14497:18;;;14490:30;14556:34;14551:2;14536:18;;14529:62;-1:-1:-1;;;14622:2:1;14607:18;;14600:36;14668:3;14653:19;;14450:228::o;14683:352::-;14885:2;14867:21;;;14924:2;14904:18;;;14897:30;14963;14958:2;14943:18;;14936:58;15026:2;15011:18;;14857:178::o;15040:400::-;15242:2;15224:21;;;15281:2;15261:18;;;15254:30;15320:34;15315:2;15300:18;;15293:62;-1:-1:-1;;;15386:2:1;15371:18;;15364:34;15430:3;15415:19;;15214:226::o;15445:349::-;15647:2;15629:21;;;15686:2;15666:18;;;15659:30;15725:27;15720:2;15705:18;;15698:55;15785:2;15770:18;;15619:175::o;15799:408::-;16001:2;15983:21;;;16040:2;16020:18;;;16013:30;16079:34;16074:2;16059:18;;16052:62;-1:-1:-1;;;16145:2:1;16130:18;;16123:42;16197:3;16182:19;;15973:234::o;16212:420::-;16414:2;16396:21;;;16453:2;16433:18;;;16426:30;16492:34;16487:2;16472:18;;16465:62;16563:26;16558:2;16543:18;;16536:54;16622:3;16607:19;;16386:246::o;16637:406::-;16839:2;16821:21;;;16878:2;16858:18;;;16851:30;16917:34;16912:2;16897:18;;16890:62;-1:-1:-1;;;16983:2:1;16968:18;;16961:40;17033:3;17018:19;;16811:232::o;17048:405::-;17250:2;17232:21;;;17289:2;17269:18;;;17262:30;17328:34;17323:2;17308:18;;17301:62;-1:-1:-1;;;17394:2:1;17379:18;;17372:39;17443:3;17428:19;;17222:231::o;17458:356::-;17660:2;17642:21;;;17679:18;;;17672:30;17738:34;17733:2;17718:18;;17711:62;17805:2;17790:18;;17632:182::o;17819:408::-;18021:2;18003:21;;;18060:2;18040:18;;;18033:30;18099:34;18094:2;18079:18;;18072:62;-1:-1:-1;;;18165:2:1;18150:18;;18143:42;18217:3;18202:19;;17993:234::o;18232:356::-;18434:2;18416:21;;;18453:18;;;18446:30;18512:34;18507:2;18492:18;;18485:62;18579:2;18564:18;;18406:182::o;18593:340::-;18795:2;18777:21;;;18834:2;18814:18;;;18807:30;-1:-1:-1;;;18868:2:1;18853:18;;18846:46;18924:2;18909:18;;18767:166::o;18938:405::-;19140:2;19122:21;;;19179:2;19159:18;;;19152:30;19218:34;19213:2;19198:18;;19191:62;-1:-1:-1;;;19284:2:1;19269:18;;19262:39;19333:3;19318:19;;19112:231::o;19348:397::-;19550:2;19532:21;;;19589:2;19569:18;;;19562:30;19628:34;19623:2;19608:18;;19601:62;-1:-1:-1;;;19694:2:1;19679:18;;19672:31;19735:3;19720:19;;19522:223::o;19750:415::-;19952:2;19934:21;;;19991:2;19971:18;;;19964:30;20030:34;20025:2;20010:18;;20003:62;-1:-1:-1;;;20096:2:1;20081:18;;20074:49;20155:3;20140:19;;19924:241::o;20170:413::-;20372:2;20354:21;;;20411:2;20391:18;;;20384:30;20450:34;20445:2;20430:18;;20423:62;-1:-1:-1;;;20516:2:1;20501:18;;20494:47;20573:3;20558:19;;20344:239::o;20588:408::-;20790:2;20772:21;;;20829:2;20809:18;;;20802:30;20868:34;20863:2;20848:18;;20841:62;-1:-1:-1;;;20934:2:1;20919:18;;20912:42;20986:3;20971:19;;20762:234::o;21001:355::-;21203:2;21185:21;;;21242:2;21222:18;;;21215:30;21281:33;21276:2;21261:18;;21254:61;21347:2;21332:18;;21175:181::o;21361:177::-;21507:25;;;21495:2;21480:18;;21462:76::o;21543:128::-;;21614:1;21610:6;21607:1;21604:13;21601:2;;;21620:18;;:::i;:::-;-1:-1:-1;21656:9:1;;21591:80::o;21676:120::-;;21742:1;21732:2;;21747:18;;:::i;:::-;-1:-1:-1;21781:9:1;;21722:74::o;21801:168::-;;21907:1;21903;21899:6;21895:14;21892:1;21889:21;21884:1;21877:9;21870:17;21866:45;21863:2;;;21914:18;;:::i;:::-;-1:-1:-1;21954:9:1;;21853:116::o;21974:125::-;;22042:1;22039;22036:8;22033:2;;;22047:18;;:::i;:::-;-1:-1:-1;22084:9:1;;22023:76::o;22104:258::-;22176:1;22186:113;22200:6;22197:1;22194:13;22186:113;;;22276:11;;;22270:18;22257:11;;;22250:39;22222:2;22215:10;22186:113;;;22317:6;22314:1;22311:13;22308:2;;;-1:-1:-1;;22352:1:1;22334:16;;22327:27;22157:205::o;22367:380::-;22452:1;22442:12;;22499:1;22489:12;;;22510:2;;22564:4;22556:6;22552:17;22542:27;;22510:2;22617;22609:6;22606:14;22586:18;22583:38;22580:2;;;22663:10;22658:3;22654:20;22651:1;22644:31;22698:4;22695:1;22688:15;22726:4;22723:1;22716:15;22580:2;;22422:325;;;:::o;22752:135::-;;-1:-1:-1;;22812:17:1;;22809:2;;;22832:18;;:::i;:::-;-1:-1:-1;22879:1:1;22868:13;;22799:88::o;22892:112::-;;22950:1;22940:2;;22955:18;;:::i;:::-;-1:-1:-1;22989:9:1;;22930:74::o;23009:127::-;23070:10;23065:3;23061:20;23058:1;23051:31;23101:4;23098:1;23091:15;23125:4;23122:1;23115:15;23141:127;23202:10;23197:3;23193:20;23190:1;23183:31;23233:4;23230:1;23223:15;23257:4;23254:1;23247:15;23273:127;23334:10;23329:3;23325:20;23322:1;23315:31;23365:4;23362:1;23355:15;23389:4;23386:1;23379:15;23405:133;-1:-1:-1;;;;;;23481:32:1;;23471:43;;23461:2;;23528:1;23525;23518:12

Swarm Source

ipfs://36c344c84968f3818a08cfcdb2a3ea9c08da93d8e3c9ac1f24239712d6ba3049
Loading...
Loading
[ 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.