ETH Price: $2,370.02 (-3.76%)

Token

Parameter (PARAM)
 

Overview

Max Total Supply

79 PARAM

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PARAM
0x857784ea852149c21ad6025e94b715e753cc2124
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:
Parameter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * ________  ________  ________  ________  _____ ______   ________           ___   ___          ________ ___  ___  ________   ________  ________      
 *|\   __  \|\   __  \|\   __  \|\   __  \|\   _ \  _   \|\   ____\         |\  \ |\  \        |\  _____\\  \|\  \|\   ___  \|\   ____\|\   ____\     
 *\ \  \|\  \ \  \|\  \ \  \|\  \ \  \|\  \ \  \\\__\ \  \ \  \___|_        \ \  \\_\  \       \ \  \__/\ \  \\\  \ \  \\ \  \ \  \___|\ \  \___|_    
 * \ \   ____\ \   __  \ \   _  _\ \   __  \ \  \\|__| \  \ \_____  \        \ \______  \       \ \   __\\ \  \\\  \ \  \\ \  \ \  \    \ \_____  \   
 *  \ \  \___|\ \  \ \  \ \  \\  \\ \  \ \  \ \  \    \ \  \|____|\  \        \|_____|\  \       \ \  \_| \ \  \\\  \ \  \\ \  \ \  \____\|____|\  \  
 *   \ \__\    \ \__\ \__\ \__\\ _\\ \__\ \__\ \__\    \ \__\____\_\  \              \ \__\       \ \__\   \ \_______\ \__\\ \__\ \_______\____\_\  \ 
 *    \|__|     \|__|\|__|\|__|\|__|\|__|\|__|\|__|     \|__|\_________\              \|__|        \|__|    \|_______|\|__| \|__|\|_______|\_________\
 *                                                          \|_________|                                                                  \|_________|
 */                                                                                                                                                    
                                                                                                                                                    
// Parameters (for Functions)
// no website
// just this contract

// what you get:
// a boolean
// a single digit
// a double digit
// a triple digit
// a character
// a hex color
// a second hex color
// a logical operator

// any of these can come with an additional single digit parameter
// as well as an additional character parameter

// any value may return null

// 8192 max supply. 0-indexed

/**
 * @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);
}






/**
 * @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.
     * 
      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;
}




/**
 * @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);
    }
}




/*
 * @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;
    }
}









/**
 * @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);
    }
}





/**
 * @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;
    }
}














/**
 * @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);
}







/**
 * @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);
}





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









/**
 * @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;
    }
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







/**
 * @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);
}


/**
 * @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();
    }
}


contract Parameter is ERC721Enumerable, ReentrancyGuard, Ownable {

        string[] private bool_list = [
        "true","false"
    ];
    
    string[] private digit_list = [
        "0","1","2","3","4","5","6","7","8","9"
    ];
        
    string[] private char_list = [
        "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"
    ];
    
    string[] private color_list = [
        "a","b","c","d","e","f","0","1","2","3","4","5","6","7","8","9"
    ];
    
    
    string[] private operator_list = [
        "AND","OR","NOT"
    ];
    
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getBool(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "BOOL", bool_list,1);
    }
    
    function getDigit(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "DIGIT", digit_list,1);
    }
    
    function getDoubleDigit(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "DOUBLEDIGIT", digit_list,2);
    }
    
    function getTripleDigit(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "TRIPLEDIGIT", digit_list,3);
    }

    function getChar(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "CHAR", char_list,1);
    }
    
    function getColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "COLOR", color_list,6);
    }
    
    function getSecondaryColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SECONDARYCOLOR", color_list,6);
    }
    
    function getOperator(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "OPERATOR", operator_list,1);
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, uint256 pulls) internal view returns (string memory) {
        uint256 rand = 0;
        string memory output = "";
        for (uint256 i = 0; i < pulls; i++) {
            rand = random(string(abi.encodePacked(keyPrefix,i, toString(tokenId))));
            output = string(abi.encodePacked(output,sourceArray[rand % sourceArray.length]));
        }

        uint256 rarity = rand % 100;
        uint256 rerand = 0;
        if (rarity == 99){
            output = string(abi.encodePacked('null'));
        }
        else if (rarity > 80) {
            rerand = random(string(abi.encodePacked(keyPrefix,"19", toString(tokenId))));
            string[2] memory name;
            name[1] = digit_list[rerand % digit_list.length];
            output = string(abi.encodePacked(output, ", ", name[1]));
            if (rarity >= 95) {
                name[0] = char_list[rerand % char_list.length];
                output = string(abi.encodePacked(output, ", ", name[0]));
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: #d8dee9; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#303841" /><text x="10" y="20" class="base">';

        parts[1] = getBool(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getDigit(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getDoubleDigit(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getTripleDigit(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getChar(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getColor(tokenId);

        parts[12] = '</text><text x="10" y="140" class="base">';

        parts[13] = getSecondaryColor(tokenId);

        parts[14] = '</text><text x="10" y="160" class="base">';

        parts[15] = getOperator(tokenId);

        parts[16] = '</text></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], parts[16]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Parameter Set ', toString(tokenId), '", "description": "Parameter is randomized input generated and stored on chain. Definitions are intentionally omitted for others to interpret. Feel free to use this Parameter in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId >= 0 && tokenId <= 8180, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId >= 8181 && tokenId < 8192, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Parameter", "PARAM") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":[{"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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBool","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getChar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDoubleDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOperator","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondaryColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTripleDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","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":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600460c0908152637472756560e01b60e052608090815261014060405260056101009081526466616c736560d81b6101205260a0526200004490600c9060026200070b565b50604080516101808101825260016101408201818152600360fc1b610160840152825282518084018452818152603160f81b6020828101919091528084019190915283518085018552828152601960f91b818301528385015283518085018552828152603360f81b81830152606084015283518085018552828152600d60fa1b81830152608084015283518085018552828152603560f81b8183015260a084015283518085018552828152601b60f91b8183015260c084015283518085018552828152603760f81b8183015260e084015283518085018552828152600760fb1b818301526101008401528351808501909452908352603960f81b908301526101208101919091526200015b90600d90600a6200076f565b50604080516103808101825260016103408201818152606160f81b610360840152825282518084018452818152603160f91b6020828101919091528084019190915283518085018552828152606360f81b818301528385015283518085018552828152601960fa1b81830152606084015283518085018552828152606560f81b81830152608084015283518085018552828152603360f91b8183015260a084015283518085018552828152606760f81b8183015260c084015283518085018552828152600d60fb1b8183015260e084015283518085018552828152606960f81b8183015261010084015283518085018552828152603560f91b8183015261012084015283518085018552828152606b60f81b8183015261014084015283518085018552828152601b60fa1b8183015261016084015283518085018552828152606d60f81b8183015261018084015283518085018552828152603760f91b818301526101a084015283518085018552828152606f60f81b818301526101c084015283518085018552828152600760fc1b818301526101e084015283518085018552828152607160f81b8183015261020084015283518085018552828152603960f91b8183015261022084015283518085018552828152607360f81b8183015261024084015283518085018552828152601d60fa1b8183015261026084015283518085018552828152607560f81b8183015261028084015283518085018552828152603b60f91b818301526102a084015283518085018552828152607760f81b818301526102c084015283518085018552828152600f60fb1b818301526102e084015283518085018552828152607960f81b818301526103008401528351808501909452908352603d60f91b908301526103208101919091526200040290600e90601a620007c1565b50604080516102408101825260016102008201818152606160f81b610220840152825282518084018452818152603160f91b6020828101919091528084019190915283518085018552828152606360f81b818301528385015283518085018552828152601960fa1b81830152606084015283518085018552828152606560f81b81830152608084015283518085018552828152603360f91b8183015260a084015283518085018552828152600360fc1b8183015260c084015283518085018552828152603160f81b8183015260e084015283518085018552828152601960f91b8183015261010084015283518085018552828152603360f81b8183015261012084015283518085018552828152600d60fa1b8183015261014084015283518085018552828152603560f81b8183015261016084015283518085018552828152601b60f91b8183015261018084015283518085018552828152603760f81b818301526101a084015283518085018552828152600760fb1b818301526101c08401528351808501909452908352603960f81b908301526101e0810191909152620005af90600f90601062000813565b5060405180606001604052806040518060400160405280600381526020016210539160ea1b81525081526020016040518060400160405280600281526020016127a960f11b8152508152602001604051806040016040528060038152602001621393d560ea1b81525081525060109060036200062d92919062000865565b503480156200063b57600080fd5b5060408051808201825260098152682830b930b6b2ba32b960b91b602080830191825283518085019094526005845264504152414d60d81b9084015281519192916200068a91600091620008b7565b508051620006a0906001906020840190620008b7565b50506001600a5550620006b333620006b9565b620009f9565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d57825180516200074c918491602090910190620008b7565b50916020019190600101906200072c565b506200076b92915062000942565b5090565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d5782518051620007b0918491602090910190620008b7565b509160200191906001019062000790565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d578251805162000802918491602090910190620008b7565b5091602001919060010190620007e2565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d578251805162000854918491602090910190620008b7565b509160200191906001019062000834565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d5782518051620008a6918491602090910190620008b7565b509160200191906001019062000886565b828054620008c590620009bc565b90600052602060002090601f016020900481019282620008e9576000855562000934565b82601f106200090457805160ff191683800117855562000934565b8280016001018555821562000934579182015b828111156200093457825182559160200191906001019062000917565b506200076b92915062000963565b808211156200076b5760006200095982826200097a565b5060010162000942565b5b808211156200076b576000815560010162000964565b5080546200098890620009bc565b6000825580601f1062000999575050565b601f016020900490600052602060002090810190620009b9919062000963565b50565b600181811c90821680620009d157607f821691505b60208210811415620009f357634e487b7160e01b600052602260045260246000fd5b50919050565b6131088062000a096000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636343546611610104578063993e9ef4116100a2578063e985e9c511610071578063e985e9c5146103c7578063f2fde38b14610403578063f6f5afa014610416578063f87540fd1461042957600080fd5b8063993e9ef41461037b578063a22cb4651461038e578063b88d4fde146103a1578063c87b56dd146103b457600080fd5b8063715018a6116100de578063715018a61461034757806380057b9a1461034f5780638da5cb5b1461036257806395d89b411461037357600080fd5b8063634354661461030e5780636352211e1461032157806370a082311461033457600080fd5b806323b872dd1161017157806342842e0e1161014b57806342842e0e146102c2578063434f48c4146102d55780634f6ccce7146102e8578063573d5ef0146102fb57600080fd5b806323b872dd146102895780632f745c591461029c578063379607f5146102af57600080fd5b8063081812fc116101ad578063081812fc14610224578063095ea7b31461024f5780630ff88a8d1461026457806318160ddd1461027757600080fd5b806301ffc9a7146101d457806305f63c8a146101fc57806306fdde031461021c575b600080fd5b6101e76101e23660046127cb565b61043c565b60405190151581526020015b60405180910390f35b61020f61020a366004612805565b610467565b6040516101f39190612c0e565b61020f610567565b610237610232366004612805565b6105f9565b6040516001600160a01b0390911681526020016101f3565b61026261025d3660046127a1565b610693565b005b61020f610272366004612805565b6107a9565b6008545b6040519081526020016101f3565b61026261029736600461264d565b61089a565b61027b6102aa3660046127a1565b6108cb565b6102626102bd366004612805565b610961565b6102626102d036600461264d565b610a11565b6102626102e3366004612805565b610a2c565b61027b6102f6366004612805565b610b15565b61020f610309366004612805565b610ba8565b61020f61031c366004612805565b610cab565b61023761032f366004612805565b610d9c565b61027b6103423660046125f8565b610e13565b610262610e9a565b61020f61035d366004612805565b610ed0565b600b546001600160a01b0316610237565b61020f610fcd565b61020f610389366004612805565b610fdc565b61026261039c366004612765565b6110ce565b6102626103af366004612689565b611193565b61020f6103c2366004612805565b6111cb565b6101e76103d536600461261a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102626104113660046125f8565b611475565b61020f610424366004612805565b611510565b61020f610437366004612805565b61160b565b60006001600160e01b0319821663780e9d6360e01b148061046157506104618261170e565b92915050565b6060610461826040518060400160405280600881526020016727a822a920aa27a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561055c5783829060005260206000200180546104cf90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546104fb90612d87565b80156105485780601f1061051d57610100808354040283529160200191610548565b820191906000526020600020905b81548152906001019060200180831161052b57829003601f168201915b5050505050815260200190600101906104b0565b50505050600161175e565b60606000805461057690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546105a290612d87565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106775760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061069e82610d9c565b9050806001600160a01b0316836001600160a01b0316141561070c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066e565b336001600160a01b0382161480610728575061072881336103d5565b61079a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066e565b6107a48383611a84565b505050565b6060610461826040518060400160405280600481526020016321a420a960e11b815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461080d90612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612d87565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050815260200190600101906107ee565b6108a43382611af2565b6108c05760405162461bcd60e51b815260040161066e90612ca8565b6107a4838383611be5565b60006108d683610e13565b82106109385760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161066e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55611ff48111156109fe5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09335b82611d90565b506001600a55565b6107a483838360405180602001604052806000815250611193565b6002600a541415610a7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55600b546001600160a01b03163314610aae5760405162461bcd60e51b815260040161066e90612c73565b611ff58110158015610ac1575061200081105b610b005760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09610a03600b546001600160a01b031690565b6000610b2060085490565b8210610b835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161066e565b60088281548110610b9657610b96612e33565b90600052602060002001549050919050565b6060610461826040518060400160405280600b81526020016a1113d5509311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610ca0578382906000526020600020018054610c1390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90612d87565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b505050505081526020019060010190610bf4565b50505050600261175e565b606061046182604051806040016040528060048152602001631093d3d360e21b815250600c805480602002602001604051908101604052809291908181526020016000905b8282101561055c578382906000526020600020018054610d0f90612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612d87565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505081526020019060010190610cf0565b6000818152600260205260408120546001600160a01b0316806104615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161066e565b60006001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161066e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610ec45760405162461bcd60e51b815260040161066e90612c73565b610ece6000611dae565b565b6060610461826040518060400160405280600581526020016421a7a627a960d91b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc2578382906000526020600020018054610f3590612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612d87565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b505050505081526020019060010190610f16565b50505050600661175e565b60606001805461057690612d87565b60606104618260405180604001604052806005815260200164111251d25560da1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461104190612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612d87565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b505050505081526020019060010190611022565b6001600160a01b0382163314156111275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61119d3383611af2565b6111b95760405162461bcd60e51b815260040161066e90612ca8565b6111c584848484611e00565b50505050565b60606111d561259b565b6040518061014001604052806101018152602001612faa610101913981526111fc83610cab565b81600160200201819052506040518060600160405280602881526020016130ab60289139604082015261122e83610fdc565b6060808301919091526040805191820190526028808252612e766020830139608082015261125b83610ba8565b60a082015260408051606081019091526028808252612ef0602083013960c08201526112868361160b565b60e082015260408051606081019091526029808252612f1860208301396101008201526112b2836107a9565b61012082015260408051606081019091526029808252612ec760208301396101408201526112df83610ed0565b61016082015260408051606081019091526029808252612f41602083013961018082015261130c83611510565b6101a082015260408051606081019091526029808252612e9e60208301396101c082015261133983610467565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113a99a909101612895565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b01519799506113fc988a9890602001612895565b6040516020818303038152906040529050600061144961141b86611e33565b61142484611f31565b6040516020016114359291906129fc565b604051602081830303815290604052611f31565b90508060405160200161145c9190612b8c565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b0316331461149f5760405162461bcd60e51b815260040161066e90612c73565b6001600160a01b0381166115045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066e565b61150d81611dae565b50565b6060610461826040518060400160405280600e81526020016d29a2a1a7a72220a92ca1a7a627a960911b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc257838290600052602060002001805461157e90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546115aa90612d87565b80156115f75780601f106115cc576101008083540402835291602001916115f7565b820191906000526020600020905b8154815290600101906020018083116115da57829003601f168201915b50505050508152602001906001019061155f565b6060610461826040518060400160405280600b81526020016a151492541311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561170357838290600052602060002001805461167690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546116a290612d87565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b505050505081526020019060010190611657565b50505050600361175e565b60006001600160e01b031982166380ac58cd60e01b148061173f57506001600160e01b03198216635b5e139f60e01b145b8061046157506301ffc9a760e01b6001600160e01b0319831614610461565b60408051602081019091526000808252606091815b8481101561180d576117af87826117898b611e33565b60405160200161179b939291906129c5565b604051602081830303815290604052612097565b925081868751856117c09190612ddd565b815181106117d0576117d0612e33565b60200260200101516040516020016117e9929190612866565b6040516020818303038152906040529150808061180590612dc2565b915050611773565b50600061181b606484612ddd565b90506000816063141561185157604051631b9d5b1b60e21b60208201526024016040516020818303038152906040529250611a75565b6050821115611a7557611878886118678b611e33565b60405160200161179b929190612957565b90506118826125c3565b600d80546118909084612ddd565b815481106118a0576118a0612e33565b9060005260206000200180546118b590612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190612d87565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b50505050508160016002811061194657611946612e33565b6020020152838160016020020151604051602001611965929190612994565b6040516020818303038152906040529350605f8310611a7357600e805461198c9084612ddd565b8154811061199c5761199c612e33565b9060005260206000200180546119b190612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90612d87565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b505050505081600060028110611a4257611a42612e33565b6020020152838160006020020151604051602001611a61929190612994565b60405160208183030381529060405293505b505b5090925050505b949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ab982610d9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b6b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066e565b6000611b7683610d9c565b9050806001600160a01b0316846001600160a01b03161480611bb15750836001600160a01b0316611ba6846105f9565b6001600160a01b0316145b80611a7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a7c565b826001600160a01b0316611bf882610d9c565b6001600160a01b031614611c605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161066e565b6001600160a01b038216611cc25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066e565b611ccd8383836120c8565b611cd8600082611a84565b6001600160a01b0383166000908152600360205260408120805460019290611d01908490612d44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d2f908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611daa828260405180602001604052806000815250612180565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e0b848484611be5565b611e17848484846121b3565b6111c55760405162461bcd60e51b815260040161066e90612c21565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612dc2565b9150611e7a9050600a83612d11565b9150611e5b565b60008167ffffffffffffffff811115611e9c57611e9c612e49565b6040519080825280601f01601f191660200182016040528015611ec6576020820181803683370190505b5090505b8415611a7c57611edb600183612d44565b9150611ee8600a86612ddd565b611ef3906030612cf9565b60f81b818381518110611f0857611f08612e33565b60200101906001600160f81b031916908160001a905350611f2a600a86612d11565b9450611eca565b805160609080611f51575050604080516020810190915260008152919050565b60006003611f60836002612cf9565b611f6a9190612d11565b611f75906004612d25565b90506000611f84826020612cf9565b67ffffffffffffffff811115611f9c57611f9c612e49565b6040519080825280601f01601f191660200182016040528015611fc6576020820181803683370190505b5090506000604051806060016040528060408152602001612f6a604091399050600181016020830160005b86811015612052576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611ff1565b50600386066001811461206c576002811461207d57612089565b613d3d60f01b600119830152612089565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120aa919061284a565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121235761211e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612146565b816001600160a01b0316836001600160a01b0316146121465761214683826122bd565b6001600160a01b03821661215d576107a48161235a565b826001600160a01b0316826001600160a01b0316146107a4576107a48282612409565b61218a838361244d565b61219760008484846121b3565b6107a45760405162461bcd60e51b815260040161066e90612c21565b60006001600160a01b0384163b156122b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f7903390899088908890600401612bd1565b602060405180830381600087803b15801561221157600080fd5b505af1925050508015612241575060408051601f3d908101601f1916820190925261223e918101906127e8565b60015b61229b573d80801561226f576040519150601f19603f3d011682016040523d82523d6000602084013e612274565b606091505b5080516122935760405162461bcd60e51b815260040161066e90612c21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a7c565b506001611a7c565b600060016122ca84610e13565b6122d49190612d44565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d44565b6000838152600960205260408120546008805493945090928490811061239457612394612e33565b9060005260206000200154905080600883815481106123b5576123b5612e33565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e1d565b6001900381819060005260206000200160009055905550505050565b600061241483610e13565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066e565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066e565b612514600083836120c8565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b60408051808201909152606081526001602082016125ab565b80356001600160a01b03811681146125f357600080fd5b919050565b60006020828403121561260a57600080fd5b612613826125dc565b9392505050565b6000806040838503121561262d57600080fd5b612636836125dc565b9150612644602084016125dc565b90509250929050565b60008060006060848603121561266257600080fd5b61266b846125dc565b9250612679602085016125dc565b9150604084013590509250925092565b6000806000806080858703121561269f57600080fd5b6126a8856125dc565b93506126b6602086016125dc565b925060408501359150606085013567ffffffffffffffff808211156126da57600080fd5b818701915087601f8301126126ee57600080fd5b81358181111561270057612700612e49565b604051601f8201601f19908116603f0116810190838211818310171561272857612728612e49565b816040528281528a602084870101111561274157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561277857600080fd5b612781836125dc565b91506020830135801515811461279657600080fd5b809150509250929050565b600080604083850312156127b457600080fd5b6127bd836125dc565b946020939093013593505050565b6000602082840312156127dd57600080fd5b813561261381612e5f565b6000602082840312156127fa57600080fd5b815161261381612e5f565b60006020828403121561281757600080fd5b5035919050565b60008151808452612836816020860160208601612d5b565b601f01601f19169290920160200192915050565b6000825161285c818460208701612d5b565b9190910192915050565b60008351612878818460208801612d5b565b83519083019061288c818360208801612d5b565b01949350505050565b60008a516128a7818460208f01612d5b565b8a51908301906128bb818360208f01612d5b565b8a516128cd8183850160208f01612d5b565b8a519290910101906128e3818360208d01612d5b565b88516128f58183850160208d01612d5b565b885192909101019061290b818360208b01612d5b565b865161291d8183850160208b01612d5b565b8651929091010190612933818360208901612d5b565b84516129458183850160208901612d5b565b9101019b9a5050505050505050505050565b60008351612969818460208801612d5b565b61313960f01b9083019081528351612988816002840160208801612d5b565b01600201949350505050565b600083516129a6818460208801612d5b565b61016160f51b9083019081528351612988816002840160208801612d5b565b600084516129d7818460208901612d5b565b820184815283516129ef816020808501908801612d5b565b0160200195945050505050565b7f7b226e616d65223a2022506172616d6574657220536574200000000000000000815260008351612a34816018850160208801612d5b565b80830190507f222c20226465736372697074696f6e223a2022506172616d657465722069732060188201527f72616e646f6d697a656420696e7075742067656e65726174656420616e64207360388201527f746f726564206f6e20636861696e2e20446566696e6974696f6e73206172652060588201527f696e74656e74696f6e616c6c79206f6d697474656420666f72206f746865727360788201527f20746f20696e746572707265742e204665656c206672656520746f207573652060988201527f7468697320506172616d6574657220696e20616e792077617920796f7520776160b88201527f6e742e222c2022696d616765223a2022646174613a696d6167652f7376672b7860d8820152691b5b0ed8985cd94d8d0b60b21b60f88201526101028451612b6b8183850160208901612d5b565b612b81828285010161227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bc481601d850160208701612d5b565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c049083018461281e565b9695505050505050565b602081526000612613602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d0c57612d0c612df1565b500190565b600082612d2057612d20612e07565b500490565b6000816000190483118215151615612d3f57612d3f612df1565b500290565b600082821015612d5657612d56612df1565b500390565b60005b83811015612d76578181015183820152602001612d5e565b838111156111c55750506000910152565b600181811c90821680612d9b57607f821691505b60208210811415612dbc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612dd657612dd6612df1565b5060010190565b600082612dec57612dec612e07565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461150d57600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20236438646565393b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222333303338343122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee630064736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636343546611610104578063993e9ef4116100a2578063e985e9c511610071578063e985e9c5146103c7578063f2fde38b14610403578063f6f5afa014610416578063f87540fd1461042957600080fd5b8063993e9ef41461037b578063a22cb4651461038e578063b88d4fde146103a1578063c87b56dd146103b457600080fd5b8063715018a6116100de578063715018a61461034757806380057b9a1461034f5780638da5cb5b1461036257806395d89b411461037357600080fd5b8063634354661461030e5780636352211e1461032157806370a082311461033457600080fd5b806323b872dd1161017157806342842e0e1161014b57806342842e0e146102c2578063434f48c4146102d55780634f6ccce7146102e8578063573d5ef0146102fb57600080fd5b806323b872dd146102895780632f745c591461029c578063379607f5146102af57600080fd5b8063081812fc116101ad578063081812fc14610224578063095ea7b31461024f5780630ff88a8d1461026457806318160ddd1461027757600080fd5b806301ffc9a7146101d457806305f63c8a146101fc57806306fdde031461021c575b600080fd5b6101e76101e23660046127cb565b61043c565b60405190151581526020015b60405180910390f35b61020f61020a366004612805565b610467565b6040516101f39190612c0e565b61020f610567565b610237610232366004612805565b6105f9565b6040516001600160a01b0390911681526020016101f3565b61026261025d3660046127a1565b610693565b005b61020f610272366004612805565b6107a9565b6008545b6040519081526020016101f3565b61026261029736600461264d565b61089a565b61027b6102aa3660046127a1565b6108cb565b6102626102bd366004612805565b610961565b6102626102d036600461264d565b610a11565b6102626102e3366004612805565b610a2c565b61027b6102f6366004612805565b610b15565b61020f610309366004612805565b610ba8565b61020f61031c366004612805565b610cab565b61023761032f366004612805565b610d9c565b61027b6103423660046125f8565b610e13565b610262610e9a565b61020f61035d366004612805565b610ed0565b600b546001600160a01b0316610237565b61020f610fcd565b61020f610389366004612805565b610fdc565b61026261039c366004612765565b6110ce565b6102626103af366004612689565b611193565b61020f6103c2366004612805565b6111cb565b6101e76103d536600461261a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102626104113660046125f8565b611475565b61020f610424366004612805565b611510565b61020f610437366004612805565b61160b565b60006001600160e01b0319821663780e9d6360e01b148061046157506104618261170e565b92915050565b6060610461826040518060400160405280600881526020016727a822a920aa27a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561055c5783829060005260206000200180546104cf90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546104fb90612d87565b80156105485780601f1061051d57610100808354040283529160200191610548565b820191906000526020600020905b81548152906001019060200180831161052b57829003601f168201915b5050505050815260200190600101906104b0565b50505050600161175e565b60606000805461057690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546105a290612d87565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106775760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061069e82610d9c565b9050806001600160a01b0316836001600160a01b0316141561070c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066e565b336001600160a01b0382161480610728575061072881336103d5565b61079a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066e565b6107a48383611a84565b505050565b6060610461826040518060400160405280600481526020016321a420a960e11b815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461080d90612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612d87565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050815260200190600101906107ee565b6108a43382611af2565b6108c05760405162461bcd60e51b815260040161066e90612ca8565b6107a4838383611be5565b60006108d683610e13565b82106109385760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161066e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55611ff48111156109fe5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09335b82611d90565b506001600a55565b6107a483838360405180602001604052806000815250611193565b6002600a541415610a7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55600b546001600160a01b03163314610aae5760405162461bcd60e51b815260040161066e90612c73565b611ff58110158015610ac1575061200081105b610b005760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09610a03600b546001600160a01b031690565b6000610b2060085490565b8210610b835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161066e565b60088281548110610b9657610b96612e33565b90600052602060002001549050919050565b6060610461826040518060400160405280600b81526020016a1113d5509311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610ca0578382906000526020600020018054610c1390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90612d87565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b505050505081526020019060010190610bf4565b50505050600261175e565b606061046182604051806040016040528060048152602001631093d3d360e21b815250600c805480602002602001604051908101604052809291908181526020016000905b8282101561055c578382906000526020600020018054610d0f90612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612d87565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505081526020019060010190610cf0565b6000818152600260205260408120546001600160a01b0316806104615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161066e565b60006001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161066e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610ec45760405162461bcd60e51b815260040161066e90612c73565b610ece6000611dae565b565b6060610461826040518060400160405280600581526020016421a7a627a960d91b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc2578382906000526020600020018054610f3590612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612d87565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b505050505081526020019060010190610f16565b50505050600661175e565b60606001805461057690612d87565b60606104618260405180604001604052806005815260200164111251d25560da1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461104190612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612d87565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b505050505081526020019060010190611022565b6001600160a01b0382163314156111275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61119d3383611af2565b6111b95760405162461bcd60e51b815260040161066e90612ca8565b6111c584848484611e00565b50505050565b60606111d561259b565b6040518061014001604052806101018152602001612faa610101913981526111fc83610cab565b81600160200201819052506040518060600160405280602881526020016130ab60289139604082015261122e83610fdc565b6060808301919091526040805191820190526028808252612e766020830139608082015261125b83610ba8565b60a082015260408051606081019091526028808252612ef0602083013960c08201526112868361160b565b60e082015260408051606081019091526029808252612f1860208301396101008201526112b2836107a9565b61012082015260408051606081019091526029808252612ec760208301396101408201526112df83610ed0565b61016082015260408051606081019091526029808252612f41602083013961018082015261130c83611510565b6101a082015260408051606081019091526029808252612e9e60208301396101c082015261133983610467565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113a99a909101612895565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b01519799506113fc988a9890602001612895565b6040516020818303038152906040529050600061144961141b86611e33565b61142484611f31565b6040516020016114359291906129fc565b604051602081830303815290604052611f31565b90508060405160200161145c9190612b8c565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b0316331461149f5760405162461bcd60e51b815260040161066e90612c73565b6001600160a01b0381166115045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066e565b61150d81611dae565b50565b6060610461826040518060400160405280600e81526020016d29a2a1a7a72220a92ca1a7a627a960911b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc257838290600052602060002001805461157e90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546115aa90612d87565b80156115f75780601f106115cc576101008083540402835291602001916115f7565b820191906000526020600020905b8154815290600101906020018083116115da57829003601f168201915b50505050508152602001906001019061155f565b6060610461826040518060400160405280600b81526020016a151492541311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561170357838290600052602060002001805461167690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546116a290612d87565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b505050505081526020019060010190611657565b50505050600361175e565b60006001600160e01b031982166380ac58cd60e01b148061173f57506001600160e01b03198216635b5e139f60e01b145b8061046157506301ffc9a760e01b6001600160e01b0319831614610461565b60408051602081019091526000808252606091815b8481101561180d576117af87826117898b611e33565b60405160200161179b939291906129c5565b604051602081830303815290604052612097565b925081868751856117c09190612ddd565b815181106117d0576117d0612e33565b60200260200101516040516020016117e9929190612866565b6040516020818303038152906040529150808061180590612dc2565b915050611773565b50600061181b606484612ddd565b90506000816063141561185157604051631b9d5b1b60e21b60208201526024016040516020818303038152906040529250611a75565b6050821115611a7557611878886118678b611e33565b60405160200161179b929190612957565b90506118826125c3565b600d80546118909084612ddd565b815481106118a0576118a0612e33565b9060005260206000200180546118b590612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190612d87565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b50505050508160016002811061194657611946612e33565b6020020152838160016020020151604051602001611965929190612994565b6040516020818303038152906040529350605f8310611a7357600e805461198c9084612ddd565b8154811061199c5761199c612e33565b9060005260206000200180546119b190612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90612d87565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b505050505081600060028110611a4257611a42612e33565b6020020152838160006020020151604051602001611a61929190612994565b60405160208183030381529060405293505b505b5090925050505b949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ab982610d9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b6b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066e565b6000611b7683610d9c565b9050806001600160a01b0316846001600160a01b03161480611bb15750836001600160a01b0316611ba6846105f9565b6001600160a01b0316145b80611a7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a7c565b826001600160a01b0316611bf882610d9c565b6001600160a01b031614611c605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161066e565b6001600160a01b038216611cc25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066e565b611ccd8383836120c8565b611cd8600082611a84565b6001600160a01b0383166000908152600360205260408120805460019290611d01908490612d44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d2f908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611daa828260405180602001604052806000815250612180565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e0b848484611be5565b611e17848484846121b3565b6111c55760405162461bcd60e51b815260040161066e90612c21565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612dc2565b9150611e7a9050600a83612d11565b9150611e5b565b60008167ffffffffffffffff811115611e9c57611e9c612e49565b6040519080825280601f01601f191660200182016040528015611ec6576020820181803683370190505b5090505b8415611a7c57611edb600183612d44565b9150611ee8600a86612ddd565b611ef3906030612cf9565b60f81b818381518110611f0857611f08612e33565b60200101906001600160f81b031916908160001a905350611f2a600a86612d11565b9450611eca565b805160609080611f51575050604080516020810190915260008152919050565b60006003611f60836002612cf9565b611f6a9190612d11565b611f75906004612d25565b90506000611f84826020612cf9565b67ffffffffffffffff811115611f9c57611f9c612e49565b6040519080825280601f01601f191660200182016040528015611fc6576020820181803683370190505b5090506000604051806060016040528060408152602001612f6a604091399050600181016020830160005b86811015612052576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611ff1565b50600386066001811461206c576002811461207d57612089565b613d3d60f01b600119830152612089565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120aa919061284a565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121235761211e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612146565b816001600160a01b0316836001600160a01b0316146121465761214683826122bd565b6001600160a01b03821661215d576107a48161235a565b826001600160a01b0316826001600160a01b0316146107a4576107a48282612409565b61218a838361244d565b61219760008484846121b3565b6107a45760405162461bcd60e51b815260040161066e90612c21565b60006001600160a01b0384163b156122b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f7903390899088908890600401612bd1565b602060405180830381600087803b15801561221157600080fd5b505af1925050508015612241575060408051601f3d908101601f1916820190925261223e918101906127e8565b60015b61229b573d80801561226f576040519150601f19603f3d011682016040523d82523d6000602084013e612274565b606091505b5080516122935760405162461bcd60e51b815260040161066e90612c21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a7c565b506001611a7c565b600060016122ca84610e13565b6122d49190612d44565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d44565b6000838152600960205260408120546008805493945090928490811061239457612394612e33565b9060005260206000200154905080600883815481106123b5576123b5612e33565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e1d565b6001900381819060005260206000200160009055905550505050565b600061241483610e13565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066e565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066e565b612514600083836120c8565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b60408051808201909152606081526001602082016125ab565b80356001600160a01b03811681146125f357600080fd5b919050565b60006020828403121561260a57600080fd5b612613826125dc565b9392505050565b6000806040838503121561262d57600080fd5b612636836125dc565b9150612644602084016125dc565b90509250929050565b60008060006060848603121561266257600080fd5b61266b846125dc565b9250612679602085016125dc565b9150604084013590509250925092565b6000806000806080858703121561269f57600080fd5b6126a8856125dc565b93506126b6602086016125dc565b925060408501359150606085013567ffffffffffffffff808211156126da57600080fd5b818701915087601f8301126126ee57600080fd5b81358181111561270057612700612e49565b604051601f8201601f19908116603f0116810190838211818310171561272857612728612e49565b816040528281528a602084870101111561274157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561277857600080fd5b612781836125dc565b91506020830135801515811461279657600080fd5b809150509250929050565b600080604083850312156127b457600080fd5b6127bd836125dc565b946020939093013593505050565b6000602082840312156127dd57600080fd5b813561261381612e5f565b6000602082840312156127fa57600080fd5b815161261381612e5f565b60006020828403121561281757600080fd5b5035919050565b60008151808452612836816020860160208601612d5b565b601f01601f19169290920160200192915050565b6000825161285c818460208701612d5b565b9190910192915050565b60008351612878818460208801612d5b565b83519083019061288c818360208801612d5b565b01949350505050565b60008a516128a7818460208f01612d5b565b8a51908301906128bb818360208f01612d5b565b8a516128cd8183850160208f01612d5b565b8a519290910101906128e3818360208d01612d5b565b88516128f58183850160208d01612d5b565b885192909101019061290b818360208b01612d5b565b865161291d8183850160208b01612d5b565b8651929091010190612933818360208901612d5b565b84516129458183850160208901612d5b565b9101019b9a5050505050505050505050565b60008351612969818460208801612d5b565b61313960f01b9083019081528351612988816002840160208801612d5b565b01600201949350505050565b600083516129a6818460208801612d5b565b61016160f51b9083019081528351612988816002840160208801612d5b565b600084516129d7818460208901612d5b565b820184815283516129ef816020808501908801612d5b565b0160200195945050505050565b7f7b226e616d65223a2022506172616d6574657220536574200000000000000000815260008351612a34816018850160208801612d5b565b80830190507f222c20226465736372697074696f6e223a2022506172616d657465722069732060188201527f72616e646f6d697a656420696e7075742067656e65726174656420616e64207360388201527f746f726564206f6e20636861696e2e20446566696e6974696f6e73206172652060588201527f696e74656e74696f6e616c6c79206f6d697474656420666f72206f746865727360788201527f20746f20696e746572707265742e204665656c206672656520746f207573652060988201527f7468697320506172616d6574657220696e20616e792077617920796f7520776160b88201527f6e742e222c2022696d616765223a2022646174613a696d6167652f7376672b7860d8820152691b5b0ed8985cd94d8d0b60b21b60f88201526101028451612b6b8183850160208901612d5b565b612b81828285010161227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bc481601d850160208701612d5b565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c049083018461281e565b9695505050505050565b602081526000612613602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d0c57612d0c612df1565b500190565b600082612d2057612d20612e07565b500490565b6000816000190483118215151615612d3f57612d3f612df1565b500290565b600082821015612d5657612d56612df1565b500390565b60005b83811015612d76578181015183820152602001612d5e565b838111156111c55750506000910152565b600181811c90821680612d9b57607f821691505b60208210811415612dbc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612dd657612dd6612df1565b5060010190565b600082612dec57612dec612e07565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461150d57600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20236438646565393b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222333303338343122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee630064736f6c63430008070033

Deployed Bytecode Sourcemap

46446:6381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40296:224;;;;;;:::i;:::-;;:::i;:::-;;;11226:14:1;;11219:22;11201:41;;11189:2;11174:18;40296:224:0;;;;;;;;48285:143;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27410:100::-;;;:::i;28969:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10524:32:1;;;10506:51;;10494:2;10479:18;28969:221:0;10360:203:1;28492:411:0;;;;;;:::i;:::-;;:::i;:::-;;47832:131;;;;;;:::i;:::-;;:::i;40936:113::-;41024:10;:17;40936:113;;;19119:25:1;;;19107:2;19092:18;40936:113:0;18973:177:1;29859:339:0;;;;;;:::i;:::-;;:::i;40604:256::-;;;;;;:::i;:::-;;:::i;51658:174::-;;;;;;:::i;:::-;;:::i;30269:185::-;;;;;;:::i;:::-;;:::i;51844:186::-;;;;;;:::i;:::-;;:::i;41126:233::-;;;;;;:::i;:::-;;:::i;47520:146::-;;;;;;:::i;:::-;;:::i;47231:131::-;;;;;;:::i;:::-;;:::i;27104:239::-;;;;;;:::i;:::-;;:::i;26834:208::-;;;;;;:::i;:::-;;:::i;11802:94::-;;;:::i;47975:134::-;;;;;;:::i;:::-;;:::i;11151:87::-;11224:6;;-1:-1:-1;;;;;11224:6:0;11151:87;;27579:104;;;:::i;47374:134::-;;;;;;:::i;:::-;;:::i;29262:295::-;;;;;;:::i;:::-;;:::i;30525:328::-;;;;;;:::i;:::-;;:::i;49578:2072::-;;;;;;:::i;:::-;;:::i;29628:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;29749:25:0;;;29725:4;29749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29628:164;12051:192;;;;;;:::i;:::-;;:::i;48121:152::-;;;;;;:::i;:::-;;:::i;47678:146::-;;;;;;:::i;:::-;;:::i;40296:224::-;40398:4;-1:-1:-1;;;;;;40422:50:0;;-1:-1:-1;;;40422:50:0;;:90;;;40476:36;40500:11;40476:23;:36::i;:::-;40415:97;40296:224;-1:-1:-1;;40296:224:0:o;48285:143::-;48344:13;48377:43;48383:7;48377:43;;;;;;;;;;;;;-1:-1:-1;;;48377:43:0;;;48404:13;48377:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48418:1;48377:5;:43::i;27410:100::-;27464:13;27497:5;27490:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27410:100;:::o;28969:221::-;29045:7;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;29065:73;;;;-1:-1:-1;;;29065:73:0;;16053:2:1;29065:73:0;;;16035:21:1;16092:2;16072:18;;;16065:30;16131:34;16111:18;;;16104:62;-1:-1:-1;;;16182:18:1;;;16175:42;16234:19;;29065:73:0;;;;;;;;;-1:-1:-1;29158:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29158:24:0;;28969:221::o;28492:411::-;28573:13;28589:23;28604:7;28589:14;:23::i;:::-;28573:39;;28637:5;-1:-1:-1;;;;;28631:11:0;:2;-1:-1:-1;;;;;28631:11:0;;;28623:57;;;;-1:-1:-1;;;28623:57:0;;17582:2:1;28623:57:0;;;17564:21:1;17621:2;17601:18;;;17594:30;17660:34;17640:18;;;17633:62;-1:-1:-1;;;17711:18:1;;;17704:31;17752:19;;28623:57:0;17380:397:1;28623:57:0;10091:10;-1:-1:-1;;;;;28715:21:0;;;;:62;;-1:-1:-1;28740:37:0;28757:5;10091:10;29628:164;:::i;28740:37::-;28693:168;;;;-1:-1:-1;;;28693:168:0;;14446:2:1;28693:168:0;;;14428:21:1;14485:2;14465:18;;;14458:30;14524:34;14504:18;;;14497:62;14595:26;14575:18;;;14568:54;14639:19;;28693:168:0;14244:420:1;28693:168:0;28874:21;28883:2;28887:7;28874:8;:21::i;:::-;28562:341;28492:411;;:::o;47832:131::-;47887:13;47920:35;47926:7;47920:35;;;;;;;;;;;;;-1:-1:-1;;;47920:35:0;;;47943:9;47920:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29859:339;30054:41;10091:10;30087:7;30054:18;:41::i;:::-;30046:103;;;;-1:-1:-1;;;30046:103:0;;;;;;;:::i;:::-;30162:28;30172:4;30178:2;30182:7;30162:9;:28::i;40604:256::-;40701:7;40737:23;40754:5;40737:16;:23::i;:::-;40729:5;:31;40721:87;;;;-1:-1:-1;;;40721:87:0;;11679:2:1;40721:87:0;;;11661:21:1;11718:2;11698:18;;;11691:30;11757:34;11737:18;;;11730:62;-1:-1:-1;;;11808:18:1;;;11801:41;11859:19;;40721:87:0;11477:407:1;40721:87:0;-1:-1:-1;;;;;;40826:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40604:256::o;51658:174::-;14090:1;14686:7;;:19;;14678:63;;;;-1:-1:-1;;;14678:63:0;;18815:2:1;14678:63:0;;;18797:21:1;18854:2;18834:18;;;18827:30;18893:33;18873:18;;;18866:61;18944:18;;14678:63:0;18613:355:1;14678:63:0;14090:1;14819:7;:18;51756:4:::1;51745:7;:15;;51721:60;;;::::0;-1:-1:-1;;;51721:60:0;;16827:2:1;51721:60:0::1;::::0;::::1;16809:21:1::0;16866:2;16846:18;;;16839:30;-1:-1:-1;;;16885:18:1;;;16878:46;16941:18;;51721:60:0::1;16625:340:1::0;51721:60:0::1;51792:32;10091:10:::0;51802:12:::1;51816:7;51792:9;:32::i;:::-;-1:-1:-1::0;14046:1:0;14998:7;:22;51658:174::o;30269:185::-;30407:39;30424:4;30430:2;30434:7;30407:39;;;;;;;;;;;;:16;:39::i;51844:186::-;14090:1;14686:7;;:19;;14678:63;;;;-1:-1:-1;;;14678:63:0;;18815:2:1;14678:63:0;;;18797:21:1;18854:2;18834:18;;;18827:30;18893:33;18873:18;;;18866:61;18944:18;;14678:63:0;18613:355:1;14678:63:0;14090:1;14819:7;:18;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23:::1;11363:68;;;;-1:-1:-1::0;;;11363:68:0::1;;;;;;;:::i;:::-;51941:4:::2;51930:7;:15;;:33;;;;;51959:4;51949:7;:14;51930:33;51922:62;;;::::0;-1:-1:-1;;;51922:62:0;;16827:2:1;51922:62:0::2;::::0;::::2;16809:21:1::0;16866:2;16846:18;;;16839:30;-1:-1:-1;;;16885:18:1;;;16878:46;16941:18;;51922:62:0::2;16625:340:1::0;51922:62:0::2;51995:27;52005:7;11224:6:::0;;-1:-1:-1;;;;;11224:6:0;;11151:87;41126:233;41201:7;41237:30;41024:10;:17;;40936:113;41237:30;41229:5;:38;41221:95;;;;-1:-1:-1;;;41221:95:0;;18402:2:1;41221:95:0;;;18384:21:1;18441:2;18421:18;;;18414:30;18480:34;18460:18;;;18453:62;-1:-1:-1;;;18531:18:1;;;18524:42;18583:19;;41221:95:0;18200:408:1;41221:95:0;41334:10;41345:5;41334:17;;;;;;;;:::i;:::-;;;;;;;;;41327:24;;41126:233;;;:::o;47520:146::-;47582:13;47615:43;47621:7;47615:43;;;;;;;;;;;;;-1:-1:-1;;;47615:43:0;;;47645:10;47615:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47656:1;47615:5;:43::i;47231:131::-;47286:13;47319:35;47325:7;47319:35;;;;;;;;;;;;;-1:-1:-1;;;47319:35:0;;;47342:9;47319:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27104:239;27176:7;27212:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27212:16:0;27247:19;27239:73;;;;-1:-1:-1;;;27239:73:0;;15282:2:1;27239:73:0;;;15264:21:1;15321:2;15301:18;;;15294:30;15360:34;15340:18;;;15333:62;-1:-1:-1;;;15411:18:1;;;15404:39;15460:19;;27239:73:0;15080:405:1;26834:208:0;26906:7;-1:-1:-1;;;;;26934:19:0;;26926:74;;;;-1:-1:-1;;;26926:74:0;;14871:2:1;26926:74:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:40;15050:19;;26926:74:0;14669:406:1;26926:74:0;-1:-1:-1;;;;;;27018:16:0;;;;;:9;:16;;;;;;;26834:208::o;11802:94::-;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23;11363:68;;;;-1:-1:-1;;;11363:68:0;;;;;;;:::i;:::-;11867:21:::1;11885:1;11867:9;:21::i;:::-;11802:94::o:0;47975:134::-;48031:13;48064:37;48070:7;48064:37;;;;;;;;;;;;;-1:-1:-1;;;48064:37:0;;;48088:10;48064:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48099:1;48064:5;:37::i;27579:104::-;27635:13;27668:7;27661:14;;;;;:::i;47374:134::-;47430:13;47463:37;47469:7;47463:37;;;;;;;;;;;;;-1:-1:-1;;;47463:37:0;;;47487:10;47463:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29262:295;-1:-1:-1;;;;;29365:24:0;;10091:10;29365:24;;29357:62;;;;-1:-1:-1;;;29357:62:0;;13679:2:1;29357:62:0;;;13661:21:1;13718:2;13698:18;;;13691:30;13757:27;13737:18;;;13730:55;13802:18;;29357:62:0;13477:349:1;29357:62:0;10091:10;29432:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29432:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29432:53:0;;;;;;;;;;29501:48;;11201:41:1;;;29432:42:0;;10091:10;29501:48;;11174:18:1;29501:48:0;;;;;;;29262:295;;:::o;30525:328::-;30700:41;10091:10;30733:7;30700:18;:41::i;:::-;30692:103;;;;-1:-1:-1;;;30692:103:0;;;;;;;:::i;:::-;30806:39;30820:4;30826:2;30830:7;30839:5;30806:13;:39::i;:::-;30525:328;;;;:::o;49578:2072::-;49643:13;49669:23;;:::i;:::-;49703:270;;;;;;;;;;;;;;;;;;;49997:16;50005:7;49997;:16::i;:::-;49986:5;49992:1;49986:8;;;:27;;;;50026:53;;;;;;;;;;;;;;;;;:8;;;:53;50103:17;50112:7;50103:8;:17::i;:::-;50092:8;;;;:28;;;;50133:53;;;;;;;;;;;;;50092:8;50133:53;;;:8;;;:53;50210:23;50225:7;50210:14;:23::i;:::-;50199:8;;;:34;50246:53;;;;;;;;;;;;;;50199:8;50246:53;;;:8;;;:53;50323:23;50338:7;50323:14;:23::i;:::-;50312:8;;;:34;50359:54;;;;;;;;;;;;;;50312:8;50359:54;;;:8;;;:54;50437:16;50445:7;50437;:16::i;:::-;50426:8;;;:27;50466:55;;;;;;;;;;;;;;50426:8;50466:55;;;:9;;;:55;50546:17;50555:7;50546:8;:17::i;:::-;50534:9;;;:29;50576:55;;;;;;;;;;;;;;50534:9;50576:55;;;:9;;;:55;50656:26;50674:7;50656:17;:26::i;:::-;50644:9;;;:38;50695:55;;;;;;;;;;;;;;50644:9;50695:55;;;:9;;;:55;50775:20;50787:7;50775:11;:20::i;:::-;50763:9;;;:32;50808:27;;;;;;;;;;;-1:-1:-1;;;50763:9:0;50808:27;;;;;;;:9;;;:27;;;;50895:8;;50905;;;;50915;;;;50925;;;;50935;;;;50945;;;;50955;;;;50965;;;;50975;;;;50878:106;;-1:-1:-1;;50878:106:0;;50975:8;;50878:106;;:::i;:::-;;;;;;;-1:-1:-1;;50878:106:0;;;;;;;51037:8;;;;51047:9;;;;51058;;;;51069;;;;51080;;;;51091;;;;51102;;;;51113;;;;50878:106;;-1:-1:-1;51012:111:0;;50878:106;;51113:9;51037:8;51012:111;;:::i;:::-;;;;;;;;;;;;;50996:128;;51145:18;51166:367;51238:17;51247:7;51238:8;:17::i;:::-;51495:28;51515:6;51495:13;:28::i;:::-;51193:337;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51166:13;:367::i;:::-;51145:388;;51610:4;51560:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51560:55:0;;;;;;;;;;49578:2072;-1:-1:-1;;;;;49578:2072:0:o;12051:192::-;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23;11363:68;;;;-1:-1:-1;;;11363:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12140:22:0;::::1;12132:73;;;::::0;-1:-1:-1;;;12132:73:0;;12510:2:1;12132:73:0::1;::::0;::::1;12492:21:1::0;12549:2;12529:18;;;12522:30;12588:34;12568:18;;;12561:62;-1:-1:-1;;;12639:18:1;;;12632:36;12685:19;;12132:73:0::1;12308:402:1::0;12132:73:0::1;12216:19;12226:8;12216:9;:19::i;:::-;12051:192:::0;:::o;48121:152::-;48186:13;48219:46;48225:7;48219:46;;;;;;;;;;;;;-1:-1:-1;;;48219:46:0;;;48252:10;48219:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47678:146;47740:13;47773:43;47779:7;47773:43;;;;;;;;;;;;;-1:-1:-1;;;47773:43:0;;;47803:10;47773:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47814:1;47773:5;:43::i;26465:305::-;26567:4;-1:-1:-1;;;;;;26604:40:0;;-1:-1:-1;;;26604:40:0;;:105;;-1:-1:-1;;;;;;;26661:48:0;;-1:-1:-1;;;26661:48:0;26604:105;:158;;;-1:-1:-1;;;;;;;;;;25181:40:0;;;26726:36;25072:157;48440:1130;48617:25;;;;;;;;;48590:12;48617:25;;;48564:13;;48590:12;48653:229;48677:5;48673:1;:9;48653:229;;;48711:64;48742:9;48752:1;48755:17;48764:7;48755:8;:17::i;:::-;48725:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48711:6;:64::i;:::-;48704:71;;48823:6;48830:11;48849;:18;48842:4;:25;;;;:::i;:::-;48830:38;;;;;;;;:::i;:::-;;;;;;;48806:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48790:80;;48684:3;;;;;:::i;:::-;;;;48653:229;;;-1:-1:-1;48894:14:0;48911:10;48918:3;48911:4;:10;:::i;:::-;48894:27;;48932:14;48965:6;48975:2;48965:12;48961:578;;;49009:24;;-1:-1:-1;;;49009:24:0;;;10303:19:1;10338:11;;49009:24:0;;;;;;;;;;;;48993:41;;48961:578;;;49074:2;49065:6;:11;49061:478;;;49102:67;49133:9;49149:17;49158:7;49149:8;:17::i;:::-;49116:51;;;;;;;;;:::i;49102:67::-;49093:76;;49184:21;;:::i;:::-;49230:10;49250:17;;49241:26;;:6;:26;:::i;:::-;49230:38;;;;;;;;:::i;:::-;;;;;;;;49220:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;49225:1;49220:7;;;;;;;:::i;:::-;;;;:48;49316:6;49330:4;49335:1;49330:7;;;;49299:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49283:56;;49368:2;49358:6;:12;49354:174;;49401:9;49420:16;;49411:25;;:6;:25;:::i;:::-;49401:36;;;;;;;;:::i;:::-;;;;;;;;49391:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;49396:1;49391:7;;;;;;;:::i;:::-;;;;:46;49489:6;49503:4;49508:1;49503:7;;;;49472:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49456:56;;49354:174;49078:461;49061:478;-1:-1:-1;49556:6:0;;-1:-1:-1;;;48440:1130:0;;;;;;;:::o;36345:174::-;36420:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36420:29:0;-1:-1:-1;;;;;36420:29:0;;;;;;;;:24;;36474:23;36420:24;36474:14;:23::i;:::-;-1:-1:-1;;;;;36465:46:0;;;;;;;;;;;36345:174;;:::o;32657:348::-;32750:4;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;32767:73;;;;-1:-1:-1;;;32767:73:0;;14033:2:1;32767:73:0;;;14015:21:1;14072:2;14052:18;;;14045:30;14111:34;14091:18;;;14084:62;-1:-1:-1;;;14162:18:1;;;14155:42;14214:19;;32767:73:0;13831:408:1;32767:73:0;32851:13;32867:23;32882:7;32867:14;:23::i;:::-;32851:39;;32920:5;-1:-1:-1;;;;;32909:16:0;:7;-1:-1:-1;;;;;32909:16:0;;:51;;;;32953:7;-1:-1:-1;;;;;32929:31:0;:20;32941:7;32929:11;:20::i;:::-;-1:-1:-1;;;;;32929:31:0;;32909:51;:87;;;-1:-1:-1;;;;;;29749:25:0;;;29725:4;29749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32964:32;29628:164;35649:578;35808:4;-1:-1:-1;;;;;35781:31:0;:23;35796:7;35781:14;:23::i;:::-;-1:-1:-1;;;;;35781:31:0;;35773:85;;;;-1:-1:-1;;;35773:85:0;;17172:2:1;35773:85:0;;;17154:21:1;17211:2;17191:18;;;17184:30;17250:34;17230:18;;;17223:62;-1:-1:-1;;;17301:18:1;;;17294:39;17350:19;;35773:85:0;16970:405:1;35773:85:0;-1:-1:-1;;;;;35877:16:0;;35869:65;;;;-1:-1:-1;;;35869:65:0;;13274:2:1;35869:65:0;;;13256:21:1;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:34;13447:19;;35869:65:0;13072:400:1;35869:65:0;35947:39;35968:4;35974:2;35978:7;35947:20;:39::i;:::-;36051:29;36068:1;36072:7;36051:8;:29::i;:::-;-1:-1:-1;;;;;36093:15:0;;;;;;:9;:15;;;;;:20;;36112:1;;36093:15;:20;;36112:1;;36093:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36124:13:0;;;;;;:9;:13;;;;;:18;;36141:1;;36124:13;:18;;36141:1;;36124:18;:::i;:::-;;;;-1:-1:-1;;36153:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36153:21:0;-1:-1:-1;;;;;36153:21:0;;;;;;;;;36192:27;;36153:16;;36192:27;;;;;;;35649:578;;;:::o;33347:110::-;33423:26;33433:2;33437:7;33423:26;;;;;;;;;;;;:9;:26::i;:::-;33347:110;;:::o;12251:173::-;12326:6;;;-1:-1:-1;;;;;12343:17:0;;;-1:-1:-1;;;;;;12343:17:0;;;;;;;12376:40;;12326:6;;;12343:17;12326:6;;12376:40;;12307:16;;12376:40;12296:128;12251:173;:::o;31735:315::-;31892:28;31902:4;31908:2;31912:7;31892:9;:28::i;:::-;31939:48;31962:4;31968:2;31972:7;31981:5;31939:22;:48::i;:::-;31931:111;;;;-1:-1:-1;;;31931:111:0;;;;;;;:::i;52042:715::-;52098:13;52311:10;52307:53;;-1:-1:-1;;52338:10:0;;;;;;;;;;;;-1:-1:-1;;;52338:10:0;;;;;52042:715::o;52307:53::-;52385:5;52370:12;52426:78;52433:9;;52426:78;;52459:8;;;;:::i;:::-;;-1:-1:-1;52482:10:0;;-1:-1:-1;52490:2:0;52482:10;;:::i;:::-;;;52426:78;;;52514:19;52546:6;52536:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52536:17:0;;52514:39;;52564:154;52571:10;;52564:154;;52598:11;52608:1;52598:11;;:::i;:::-;;-1:-1:-1;52667:10:0;52675:2;52667:5;:10;:::i;:::-;52654:24;;:2;:24;:::i;:::-;52641:39;;52624:6;52631;52624:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;52624:56:0;;;;;;;;-1:-1:-1;52695:11:0;52704:2;52695:11;;:::i;:::-;;;52564:154;;53178:1607;53276:11;;53236:13;;53302:8;53298:23;;-1:-1:-1;;53312:9:0;;;;;;;;;-1:-1:-1;53312:9:0;;;53178:1607;-1:-1:-1;53178:1607:0:o;53298:23::-;53373:18;53411:1;53400:7;:3;53406:1;53400:7;:::i;:::-;53399:13;;;;:::i;:::-;53394:19;;:1;:19;:::i;:::-;53373:40;-1:-1:-1;53471:19:0;53503:15;53373:40;53516:2;53503:15;:::i;:::-;53493:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53493:26:0;;53471:48;;53532:18;53553:5;;;;;;;;;;;;;;;;;53532:26;;53622:1;53615:5;53611:13;53667:2;53659:6;53655:15;53718:1;53686:777;53741:3;53738:1;53735:10;53686:777;;;53796:1;53839:12;;;;;53833:19;53934:4;53922:2;53918:14;;;;;53900:40;;53894:47;54043:2;54039:14;;;54035:25;;54021:40;;54015:47;54172:1;54168:13;;;54164:24;;54150:39;;54144:46;54292:16;;;;54278:31;;54272:38;53970:1;53966:11;;;54064:4;54011:58;;;54002:68;54095:11;;54140:57;;;54131:67;;;;54223:11;;54268:49;;54259:59;54347:3;54343:13;54376:22;;54446:1;54431:17;;;;53789:9;53686:777;;;53690:44;54495:1;54490:3;54486:11;54516:1;54511:84;;;;54614:1;54609:82;;;;54479:212;;54511:84;-1:-1:-1;;;;;54544:17:0;;54537:43;54511:84;;54609:82;-1:-1:-1;;;;;54642:17:0;;54635:41;54479:212;-1:-1:-1;;;54707:26:0;;;54714:6;53178:1607;-1:-1:-1;;;;53178:1607:0:o;47081:138::-;47141:7;47203:5;47186:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47186:23:0;;;;;;;;;47176:34;;47186:23;47176:34;;;;;47081:138;-1:-1:-1;;47081:138:0:o;41972:589::-;-1:-1:-1;;;;;42178:18:0;;42174:187;;42213:40;42245:7;43388:10;:17;;43361:24;;;;:15;:24;;;;;:44;;;43416:24;;;;;;;;;;;;43284:164;42213:40;42174:187;;;42283:2;-1:-1:-1;;;;;42275:10:0;:4;-1:-1:-1;;;;;42275:10:0;;42271:90;;42302:47;42335:4;42341:7;42302:32;:47::i;:::-;-1:-1:-1;;;;;42375:16:0;;42371:183;;42408:45;42445:7;42408:36;:45::i;42371:183::-;42481:4;-1:-1:-1;;;;;42475:10:0;:2;-1:-1:-1;;;;;42475:10:0;;42471:83;;42502:40;42530:2;42534:7;42502:27;:40::i;33684:321::-;33814:18;33820:2;33824:7;33814:5;:18::i;:::-;33865:54;33896:1;33900:2;33904:7;33913:5;33865:22;:54::i;:::-;33843:154;;;;-1:-1:-1;;;33843:154:0;;;;;;;:::i;37084:803::-;37239:4;-1:-1:-1;;;;;37260:13:0;;17567:20;17615:8;37256:624;;37296:72;;-1:-1:-1;;;37296:72:0;;-1:-1:-1;;;;;37296:36:0;;;;;:72;;10091:10;;37347:4;;37353:7;;37362:5;;37296:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37296:72:0;;;;;;;;-1:-1:-1;;37296:72:0;;;;;;;;;;;;:::i;:::-;;;37292:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37542:13:0;;37538:272;;37585:60;;-1:-1:-1;;;37585:60:0;;;;;;;:::i;37538:272::-;37760:6;37754:13;37745:6;37741:2;37737:15;37730:38;37292:533;-1:-1:-1;;;;;;37419:55:0;-1:-1:-1;;;37419:55:0;;-1:-1:-1;37412:62:0;;37256:624;-1:-1:-1;37864:4:0;37857:11;;44075:988;44341:22;44391:1;44366:22;44383:4;44366:16;:22::i;:::-;:26;;;;:::i;:::-;44403:18;44424:26;;;:17;:26;;;;;;44341:51;;-1:-1:-1;44557:28:0;;;44553:328;;-1:-1:-1;;;;;44624:18:0;;44602:19;44624:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44675:30;;;;;;:44;;;44792:30;;:17;:30;;;;;:43;;;44553:328;-1:-1:-1;44977:26:0;;;;:17;:26;;;;;;;;44970:33;;;-1:-1:-1;;;;;45021:18:0;;;;;:12;:18;;;;;:34;;;;;;;45014:41;44075:988::o;45358:1079::-;45636:10;:17;45611:22;;45636:21;;45656:1;;45636:21;:::i;:::-;45668:18;45689:24;;;:15;:24;;;;;;46062:10;:26;;45611:46;;-1:-1:-1;45689:24:0;;45611:46;;46062:26;;;;;;:::i;:::-;;;;;;;;;46040:48;;46126:11;46101:10;46112;46101:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46206:28;;;:15;:28;;;;;;;:41;;;46378:24;;;;;46371:31;46413:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45429:1008;;;45358:1079;:::o;42862:221::-;42947:14;42964:20;42981:2;42964:16;:20::i;:::-;-1:-1:-1;;;;;42995:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43040:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42862:221:0:o;34341:382::-;-1:-1:-1;;;;;34421:16:0;;34413:61;;;;-1:-1:-1;;;34413:61:0;;15692:2:1;34413:61:0;;;15674:21:1;;;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;15822:18;;34413:61:0;15490:356:1;34413:61:0;32428:4;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;:30;34485:58;;;;-1:-1:-1;;;34485:58:0;;12917:2:1;34485:58:0;;;12899:21:1;12956:2;12936:18;;;12929:30;12995;12975:18;;;12968:58;13043:18;;34485:58:0;12715:352:1;34485:58:0;34556:45;34585:1;34589:2;34593:7;34556:20;:45::i;:::-;-1:-1:-1;;;;;34614:13:0;;;;;;:9;:13;;;;;:18;;34631:1;;34614:13;:18;;34631:1;;34614:18;:::i;:::-;;;;-1:-1:-1;;34643:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34643:21:0;-1:-1:-1;;;;;34643:21:0;;;;;;;;34682:33;;34643:16;;;34682:33;;34643:16;;34682:33;34341:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:257::-;3465:3;3503:5;3497:12;3530:6;3525:3;3518:19;3546:63;3602:6;3595:4;3590:3;3586:14;3579:4;3572:5;3568:16;3546:63;:::i;:::-;3663:2;3642:15;-1:-1:-1;;3638:29:1;3629:39;;;;3670:4;3625:50;;3424:257;-1:-1:-1;;3424:257:1:o;3816:276::-;3947:3;3985:6;3979:13;4001:53;4047:6;4042:3;4035:4;4027:6;4023:17;4001:53;:::i;:::-;4070:16;;;;;3816:276;-1:-1:-1;;3816:276:1:o;4097:470::-;4276:3;4314:6;4308:13;4330:53;4376:6;4371:3;4364:4;4356:6;4352:17;4330:53;:::i;:::-;4446:13;;4405:16;;;;4468:57;4446:13;4405:16;4502:4;4490:17;;4468:57;:::i;:::-;4541:20;;4097:470;-1:-1:-1;;;;4097:470:1:o;4572:1780::-;5087:3;5125:6;5119:13;5141:53;5187:6;5182:3;5175:4;5167:6;5163:17;5141:53;:::i;:::-;5257:13;;5216:16;;;;5279:57;5257:13;5216:16;5313:4;5301:17;;5279:57;:::i;:::-;5367:6;5361:13;5383:72;5446:8;5435;5428:5;5424:20;5417:4;5409:6;5405:17;5383:72;:::i;:::-;5537:13;;5481:20;;;;5477:35;;5559:57;5537:13;5477:35;5593:4;5581:17;;5559:57;:::i;:::-;5647:6;5641:13;5663:72;5726:8;5715;5708:5;5704:20;5697:4;5689:6;5685:17;5663:72;:::i;:::-;5817:13;;5761:20;;;;5757:35;;5839:57;5817:13;5757:35;5873:4;5861:17;;5839:57;:::i;:::-;5927:6;5921:13;5943:72;6006:8;5995;5988:5;5984:20;5977:4;5969:6;5965:17;5943:72;:::i;:::-;6097:13;;6041:20;;;;6037:35;;6119:57;6097:13;6037:35;6153:4;6141:17;;6119:57;:::i;:::-;6207:6;6201:13;6223:72;6286:8;6275;6268:5;6264:20;6257:4;6249:6;6245:17;6223:72;:::i;:::-;6315:20;;6311:35;;4572:1780;-1:-1:-1;;;;;;;;;;;4572:1780:1:o;6357:615::-;6637:3;6675:6;6669:13;6691:53;6737:6;6732:3;6725:4;6717:6;6713:17;6691:53;:::i;:::-;-1:-1:-1;;;6766:16:1;;;6791:19;;;6835:13;;6857:65;6835:13;6909:1;6898:13;;6891:4;6879:17;;6857:65;:::i;:::-;6942:20;6964:1;6938:28;;6357:615;-1:-1:-1;;;;6357:615:1:o;6977:::-;7257:3;7295:6;7289:13;7311:53;7357:6;7352:3;7345:4;7337:6;7333:17;7311:53;:::i;:::-;-1:-1:-1;;;7386:16:1;;;7411:19;;;7455:13;;7477:65;7455:13;7529:1;7518:13;;7511:4;7499:17;;7477:65;:::i;7597:550::-;7804:3;7842:6;7836:13;7858:53;7904:6;7899:3;7892:4;7884:6;7880:17;7858:53;:::i;:::-;7933:16;;7958:21;;;8004:13;;8026:68;8004:13;8078:4;8067:16;;;;8048:17;;8026:68;:::i;:::-;8114:20;8136:4;8110:31;;7597:550;-1:-1:-1;;;;;7597:550:1:o;8152:1491::-;8664:66;8659:3;8652:79;8634:3;8760:6;8754:13;8776:62;8831:6;8826:2;8821:3;8817:12;8810:4;8802:6;8798:17;8776:62;:::i;:::-;8866:6;8861:3;8857:16;8847:26;;8902:66;8897:2;8893;8889:11;8882:87;8998:34;8993:2;8989;8985:11;8978:55;9062:34;9057:2;9053;9049:11;9042:55;9127:34;9121:3;9117:2;9113:12;9106:56;9192:34;9186:3;9182:2;9178:12;9171:56;9257:34;9251:3;9247:2;9243:12;9236:56;9322:66;9316:3;9312:2;9308:12;9301:88;-1:-1:-1;;;9413:3:1;9409:2;9405:12;9398:34;9451:3;9485:6;9479:13;9501:63;9555:8;9550:2;9546;9542:11;9535:4;9527:6;9523:17;9501:63;:::i;:::-;9580:57;9633:2;9622:8;9618:2;9614:17;9610:26;-1:-1:-1;;;3751:27:1;;3803:1;3794:11;;3686:125;9580:57;9573:64;8152:1491;-1:-1:-1;;;;;;;8152:1491:1:o;9648:448::-;9910:31;9905:3;9898:44;9880:3;9971:6;9965:13;9987:62;10042:6;10037:2;10032:3;10028:12;10021:4;10013:6;10009:17;9987:62;:::i;:::-;10069:16;;;;10087:2;10065:25;;9648:448;-1:-1:-1;;9648:448:1:o;10568:488::-;-1:-1:-1;;;;;10837:15:1;;;10819:34;;10889:15;;10884:2;10869:18;;10862:43;10936:2;10921:18;;10914:34;;;10984:3;10979:2;10964:18;;10957:31;;;10762:4;;11005:45;;11030:19;;11022:6;11005:45;:::i;:::-;10997:53;10568:488;-1:-1:-1;;;;;;10568:488:1:o;11253:219::-;11402:2;11391:9;11384:21;11365:4;11422:44;11462:2;11451:9;11447:18;11439:6;11422:44;:::i;11889:414::-;12091:2;12073:21;;;12130:2;12110:18;;;12103:30;12169:34;12164:2;12149:18;;12142:62;-1:-1:-1;;;12235:2:1;12220:18;;12213:48;12293:3;12278:19;;11889:414::o;16264:356::-;16466:2;16448:21;;;16485:18;;;16478:30;16544:34;16539:2;16524:18;;16517:62;16611:2;16596:18;;16264:356::o;17782:413::-;17984:2;17966:21;;;18023:2;18003:18;;;17996:30;18062:34;18057:2;18042:18;;18035:62;-1:-1:-1;;;18128:2:1;18113:18;;18106:47;18185:3;18170:19;;17782:413::o;19155:128::-;19195:3;19226:1;19222:6;19219:1;19216:13;19213:39;;;19232:18;;:::i;:::-;-1:-1:-1;19268:9:1;;19155:128::o;19288:120::-;19328:1;19354;19344:35;;19359:18;;:::i;:::-;-1:-1:-1;19393:9:1;;19288:120::o;19413:168::-;19453:7;19519:1;19515;19511:6;19507:14;19504:1;19501:21;19496:1;19489:9;19482:17;19478:45;19475:71;;;19526:18;;:::i;:::-;-1:-1:-1;19566:9:1;;19413:168::o;19586:125::-;19626:4;19654:1;19651;19648:8;19645:34;;;19659:18;;:::i;:::-;-1:-1:-1;19696:9:1;;19586:125::o;19716:258::-;19788:1;19798:113;19812:6;19809:1;19806:13;19798:113;;;19888:11;;;19882:18;19869:11;;;19862:39;19834:2;19827:10;19798:113;;;19929:6;19926:1;19923:13;19920:48;;;-1:-1:-1;;19964:1:1;19946:16;;19939:27;19716:258::o;19979:380::-;20058:1;20054:12;;;;20101;;;20122:61;;20176:4;20168:6;20164:17;20154:27;;20122:61;20229:2;20221:6;20218:14;20198:18;20195:38;20192:161;;;20275:10;20270:3;20266:20;20263:1;20256:31;20310:4;20307:1;20300:15;20338:4;20335:1;20328:15;20192:161;;19979:380;;;:::o;20364:135::-;20403:3;-1:-1:-1;;20424:17:1;;20421:43;;;20444:18;;:::i;:::-;-1:-1:-1;20491:1:1;20480:13;;20364:135::o;20504:112::-;20536:1;20562;20552:35;;20567:18;;:::i;:::-;-1:-1:-1;20601:9:1;;20504:112::o;20621:127::-;20682:10;20677:3;20673:20;20670:1;20663:31;20713:4;20710:1;20703:15;20737:4;20734:1;20727:15;20753:127;20814:10;20809:3;20805:20;20802:1;20795:31;20845:4;20842:1;20835:15;20869:4;20866:1;20859:15;20885:127;20946:10;20941:3;20937:20;20934:1;20927:31;20977:4;20974:1;20967:15;21001:4;20998:1;20991:15;21017:127;21078:10;21073:3;21069:20;21066:1;21059:31;21109:4;21106:1;21099:15;21133:4;21130:1;21123:15;21149:127;21210:10;21205:3;21201:20;21198:1;21191:31;21241:4;21238:1;21231:15;21265:4;21262:1;21255:15;21281:131;-1:-1:-1;;;;;;21355:32:1;;21345:43;;21335:71;;21402:1;21399;21392:12

Swarm Source

ipfs://3ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee6300
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.