ETH Price: $3,405.58 (+3.14%)

Token

United Metaverse Nation (UMN)
 

Overview

Max Total Supply

3,158 UMN

Holders

1,121

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 UMN
0x0a66aea8ce7fe9cce226b724955e583773247d7e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The United Metaverse Nation is the first decentralized autonomous organization (DAO) that acts as a virtual country. The UMN is a member-owned nation without centralized leadership. All activities, such as government laws and monetary policies, are transparent and fully publi...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UnitedMetaverseNation

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/********************************************************************************
    * United Metaverse Nation

                                                      ..:---=====---:..                                  
                
                                               .-=*#%@@@@@@@@@@@@@@@@@@@%#*=-.                           
                
                                           :=#@@@@@@@@@@@@@@@@@@@@@@#*%@@@@@@@@*=:                       
                
                                        -*%@@@@@@@@%##@@@@@@@@@@@@@=:.*@@@@@@@@@@@%*-                    
                
                                     :+@@@@%*#@@@@%.=@@@@@+*+=-=-:.   :#@@@@@@@@@@@@@%*:                 
                
                                   -#@@@@%#=-=##+**@@@@@@%#-           :*@@@@@@@@@@@@@@@#=               
                
                                 -%@@@@@*@@@*. -%@@@#*+=:      -****:.+@@@@@@@@@@@@@@@@@@@%=              
                
                               .#@@@@@@@@@@@=. =::-          .#@%#@@*%@@@@@@@@@@@@@@@@@@@@@@#-           
                
                              =@@@@@@@@@@**#.               -@@@=-+%@@@@@@@@@@@@@@@@@@@@@@@@@%*          
                
                    .-----===*@@@@@@**=%#-#                 .:=#. *@@@@@@@@@@@@@@@@@@@@@@@@@@@%#.        
                
                      ..=@@@@@#=:                        =@%**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#.          
                
                       -@@@%#:                       :=*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###**+          
                
                      :@@@%%.                        +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:::::..         
                
                      %@@@%*                      =@%%@@%+=+*=+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=        
                
                     =@@@@*-                      @@@@%%-   .%++@=:@@@%@@@@@@@@@@@@@@@@@@@##@@@%%.       
                
                    .@@@@%+-                      :**#%%*##*#+ .       =@@@@@@@@@@@@@@@@@@* #@@@%+       
                
                    -@@@@% #.                   :#@@@@@@@@@@@*. -+===++%@@@@@@*#@#*++:-.*@# :@@@%%       
                
                    *@@@%%..                  :+@@@@@@@@@@@@@@@@@@@@@@@%*@@@@@@@%@@@%%:  #@  @@@%%:      
                
                    %@@@@%*                 .*@@@@@@@@@@@@@@@@@@@@@@@@@@*.+@@@@@@@@@%%:   %- #@@@%-      
                
                    =+==++#****++=          :::---=+++++++++++*@@@@@@@@@@%*@@@@@@**@@@***++= -=+=+-:**++=
                
                          =@@@@@@%+               #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@==@@%@#+.        -@@@%#
                
                          -@@@@@@@%+             .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*#+#=*-        =@@@%*
                
                          .@@@@@@@%%.            .+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%.        #@@%%-
                
                 =+++++++++%@@@@@@@%#:             -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=        :@@@%% 
                
                 -=======+++@@@@@@@@@@*-            .+#%%%%*+*@@@@@@@@@@@@@@@@@@@@@@@@@%=         #@@@%= 
                
                            +@@@@@@@@@@%%-                     .:*@@@@@@@@@@@@@@@@@@@%*.         =@@@%#  
                
                             #@@@@@@@@@@%%:                      %@@@@@@@@@@@@@@@@@@%*          :@@@%%:  
                
                             .%@@@@@@@@@%%.                      .+@@@@@@@@@@@@@@@@%%:         :@@@%%-   
                
                            ..:%@@@@@@%%#=                         :======#@@@@@@@@%%:     ...-@@%##-    
                
                            =@@@@@@@%#                             =@@@@@@@@@@@@@@@%#    -@@@@%=         
                
                             :%@@@@%=                             -@@@@@@@@@@@@@@@#:   .*@@@%%:          
                
                               +@@@@%+                            .%@@@@@@@@@@@@%+    .+***+=            
                
                                .*@@@@%+.                           #@@@@@@@@@@#-   ::::::               
                
                                  .*@@@@@*-                         .%@@@@@@%*-  -*@@@@%+.               
                
                                    .=%@@@@%+:                       .-:-::.  -*@@@@@#=                  
                
                                       :+%@@@@@#=:                       .-+#@@@@@#=.                    
                
                                          .=*%@@@@@%*+-:..       ..:-=*#@@@@@@%+-.                       
                
                                              .:=*#%@@@@@@@@@@@@@@@@@@@@%#+=:                             
                
                                                     ..:--========--:.  
    ******************************************************************************/

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity 0.8.4;

contract UnitedMetaverseNation is ERC721("United Metaverse Nation", "UMN"), ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    /*
     * Currently Assuming there will be one baseURI.
     * If it fails to upload all NFTs data under one baseURI,
     * we will divide baseURI and tokenURI function will be changed accordingly.
    */
    string private baseURI;
    string private blindURI;
    uint256 public constant BUY_LIMIT_PER_TX = 10;
    uint256 public constant MAX_NFT_PUBLIC = 10931;
    uint256 private constant MAX_NFT = 11111;
    uint256 public NFTPrice = 100000000000000000;  // 0.1 ETH
    bool public reveal;
    bool public isActive;
    bool public isPresaleActive;
    uint256 public constant WHITELIST_MAX_MINT = 2;
    mapping(address => bool) private whiteList;
    mapping(address => uint256) private whiteListClaimed;
    
    /*
     * Function to reveal all NFTs
    */
    function revealNow() 
        external 
        onlyOwner 
    {
        reveal = true;
    }
    
    /*
     * Function addToWhiteList to add whitelisted addresses to presale
    */
    function addToWhiteList(
        address[] memory _addresses
    ) 
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _addresses.length; i++) {
            require(_addresses[i] != address(0), "Cannot add the null address");
            whiteList[_addresses[i]] = true;
            /**
            * @dev We don't want to reset _whiteListClaimed count
            * if we try to add someone more than once.
            */
            whiteListClaimed[_addresses[i]] > 0 ? whiteListClaimed[_addresses[i]] : 0;
        }
    }
    
    /*
     * Function onWhiteList returns if address is whitelisted or not 
    */
    function onWhiteList(
        address _addr
    ) 
        external 
        view
        returns (bool) 
    {
        return whiteList[_addr];
    }
    
    /*
     * Function setIsActive to activate/desactivate the smart contract
    */
    function setIsActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isActive = _isActive;
    }
    
    /*
     * Function setPresaleActive to activate/desactivate the presale  
    */
    function setPresaleActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isPresaleActive = _isActive;
    }
    
    /*
     * Function to set Base and Blind URI 
    */
    function setURIs(
        string memory _blindURI, 
        string memory _URI
    ) 
        external 
        onlyOwner 
    {
        blindURI = _blindURI;
        baseURI = _URI;
    }
    
    /*
     * Function to withdraw collected amount during minting by the owner
    */
    function withdraw(
        address _to
    ) 
        public 
        onlyOwner 
    {
        uint balance = address(this).balance;
        require(balance > 0, "Balance should be more then zero");
        payable(_to).transfer(balance);
    }
    
    /*
     * Function to mint new NFTs during the public sale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */
    function mintNFT(
        uint256 _numOfTokens
    ) 
        public 
        payable 
    {
    
        require(isActive, 'Contract is not active');
        require(!isPresaleActive, 'Only whiteing from White List');
        require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit");
        require(totalSupply().add(_numOfTokens) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs");
        require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < _numOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    /*
     * Function to mint new NFTs during the presale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTDuringPresale(
        uint256 _numOfTokens
    ) 
        public 
        payable
    {
        require(isActive, 'Contract is not active');
        require(isPresaleActive, 'Only whiteing from White List');
        require(whiteList[msg.sender], 'You are not on the White List');
        require(totalSupply() < MAX_NFT_PUBLIC, 'All public tokens have been minted');
        require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens');
        require(totalSupply().add(_numOfTokens) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs');
        require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed');
        require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < _numOfTokens; i++) {
            
            whiteListClaimed[msg.sender] += 1;
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    /*
     * Function to mint all NFTs for giveaway and partnerships
    */
    function mintByOwner(
        address _to, 
        uint256 _tokenId
    ) 
        public 
        onlyOwner
    {
        require(_tokenId > MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens");
        require(_tokenId <= MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
        _safeMint(_to, _tokenId);
    }
    
    /*
     * Function to get token URI of given token ID
     * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC
    */
    function tokenURI(
        uint256 _tokenId
    ) 
        public 
        view 
        virtual 
        override 
        returns (string memory) 
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!reveal) {
            return string(abi.encodePacked(blindURI));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        }
    }
    
    function supportsInterface(
        bytes4 _interfaceId
    ) 
        public
        view 
        override (ERC721, ERC721Enumerable) 
        returns (bool) 
    {
        return super.supportsInterface(_interfaceId);
    }

    // Standard functions to be overridden 
    function _beforeTokenTransfer(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) 
        internal 
        override(ERC721, ERC721Enumerable) 
    {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"onWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","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":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","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"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600d553480156200001d57600080fd5b50604080518082018252601781527f556e69746564204d6574617665727365204e6174696f6e0000000000000000006020808301918252835180850190945260038452622aa6a760e91b9084015281519192916200007e916000916200010d565b508051620000949060019060208401906200010d565b505050620000b1620000ab620000b760201b60201c565b620000bb565b620001f0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b612a2d80620002006000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063b22d0c83116100a0578063e748e07c1161006f578063e748e07c146105e7578063e8254174146105fc578063e985e9c51461061c578063f2fde38b14610665578063ff99d8ce1461068557600080fd5b8063b22d0c8314610558578063b88d4fde14610591578063c87b56dd146105b1578063d1d80f30146105d157600080fd5b806395d89b41116100e757806395d89b41146104de578063a22cb465146104f3578063a38bffda14610513578063a475b5dd14610529578063aeb167681461054357600080fd5b8063715018a614610478578063740d73f31461048d5780638da5cb5b146104ad57806392642744146104cb57600080fd5b80633542aee21161019b57806351cff8d91161016a57806351cff8d9146103e35780635f0f45b21461040357806360d938dc146104185780636352211e1461043857806370a082311461045857600080fd5b80633542aee2146103635780633f8121a21461038357806342842e0e146103a35780634f6ccce7146103c357600080fd5b806318160ddd116101e257806318160ddd146102c557806322f3e2d4146102e457806323b872dd146103035780632750fc78146103235780632f745c591461034357600080fd5b806301ffc9a71461021457806306fdde0314610249578063081812fc1461026b578063095ea7b3146102a3575b600080fd5b34801561022057600080fd5b5061023461022f366004612559565b610698565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106a9565b604051610240919061273c565b34801561027757600080fd5b5061028b6102863660046125f2565b61073b565b6040516001600160a01b039091168152602001610240565b3480156102af57600080fd5b506102c36102be366004612467565b6107d5565b005b3480156102d157600080fd5b506008545b604051908152602001610240565b3480156102f057600080fd5b50600e5461023490610100900460ff1681565b34801561030f57600080fd5b506102c361031e36600461238a565b6108eb565b34801561032f57600080fd5b506102c361033e36600461253f565b61091c565b34801561034f57600080fd5b506102d661035e366004612467565b610960565b34801561036f57600080fd5b506102c361037e366004612467565b6109f6565b34801561038f57600080fd5b506102c361039e36600461253f565b610b1d565b3480156103af57600080fd5b506102c36103be36600461238a565b610b63565b3480156103cf57600080fd5b506102d66103de3660046125f2565b610b7e565b3480156103ef57600080fd5b506102c36103fe36600461233e565b610c1f565b34801561040f57600080fd5b506102c3610ccd565b34801561042457600080fd5b50600e546102349062010000900460ff1681565b34801561044457600080fd5b5061028b6104533660046125f2565b610d06565b34801561046457600080fd5b506102d661047336600461233e565b610d7d565b34801561048457600080fd5b506102c3610e04565b34801561049957600080fd5b506102c36104a8366004612490565b610e3a565b3480156104b957600080fd5b50600a546001600160a01b031661028b565b6102c36104d93660046125f2565b61101b565b3480156104ea57600080fd5b5061025e6111d4565b3480156104ff57600080fd5b506102c361050e36600461243e565b6111e3565b34801561051f57600080fd5b506102d6600d5481565b34801561053557600080fd5b50600e546102349060ff1681565b34801561054f57600080fd5b506102d6600281565b34801561056457600080fd5b5061023461057336600461233e565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561059d57600080fd5b506102c36105ac3660046123c5565b6112a8565b3480156105bd57600080fd5b5061025e6105cc3660046125f2565b6112e0565b3480156105dd57600080fd5b506102d6612ab381565b3480156105f357600080fd5b506102d6600a81565b34801561060857600080fd5b506102c3610617366004612591565b6113b2565b34801561062857600080fd5b50610234610637366004612358565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561067157600080fd5b506102c361068036600461233e565b611403565b6102c36106933660046125f2565b61149e565b60006106a38261179f565b92915050565b6060600080546106b890612935565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612935565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107e082610d06565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b0565b336001600160a01b038216148061086a575061086a8133610637565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b0565b6108e683836117c4565b505050565b6108f53382611832565b6109115760405162461bcd60e51b81526004016107b090612825565b6108e6838383611929565b600a546001600160a01b031633146109465760405162461bcd60e51b81526004016107b0906127a1565b600e80549115156101000261ff0019909216919091179055565b600061096b83610d7d565b82106109cd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a205760405162461bcd60e51b81526004016107b0906127a1565b612ab38111610a975760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e730000000000000060648201526084016107b0565b612b67811115610b0f5760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e73000000000000000060648201526084016107b0565b610b198282611ad4565b5050565b600a546001600160a01b03163314610b475760405162461bcd60e51b81526004016107b0906127a1565b600e8054911515620100000262ff000019909216919091179055565b6108e6838383604051806020016040528060008152506112a8565b6000610b8960085490565b8210610bec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b0565b60088281548110610c0d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610c495760405162461bcd60e51b81526004016107b0906127a1565b4780610c975760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f60448201526064016107b0565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156108e6573d6000803e3d6000fd5b600a546001600160a01b03163314610cf75760405162461bcd60e51b81526004016107b0906127a1565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806106a35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b0565b60006001600160a01b038216610de85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b0565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e2e5760405162461bcd60e51b81526004016107b0906127a1565b610e386000611aee565b565b600a546001600160a01b03163314610e645760405162461bcd60e51b81526004016107b0906127a1565b60005b8151811015610b195760006001600160a01b0316828281518110610e9b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610efa5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742061646420746865206e756c6c2061646472657373000000000060448201526064016107b0565b6001600f6000848481518110610f2057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600060106000848481518110610f8557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205411610fba576000611008565b60106000838381518110610fde57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020545b508061101381612970565b915050610e67565b600e54610100900460ff1661106b5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016107b0565b600e5462010000900460ff16156110c45760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c69737400000060448201526064016107b0565b600a8111156111155760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d697400000000000000000060448201526064016107b0565b612ab361112b8261112560085490565b90611b40565b11156111495760405162461bcd60e51b81526004016107b0906127d6565b600d5434906111589083611b53565b146111a55760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107b0565b60005b81811015610b19576111c2336111bd60085490565b611ad4565b806111cc81612970565b9150506111a8565b6060600180546106b890612935565b6001600160a01b03821633141561123c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112b23383611832565b6112ce5760405162461bcd60e51b81526004016107b090612825565b6112da84848484611b5f565b50505050565b6000818152600260205260409020546060906001600160a01b031661135f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b0565b600e5460ff1661139157600c60405160200161137b91906126ce565b6040516020818303038152906040529050919050565b600b61139c83611b92565b60405160200161137b9291906126da565b919050565b600a546001600160a01b031633146113dc5760405162461bcd60e51b81526004016107b0906127a1565b81516113ef90600c906020850190612207565b5080516108e690600b906020840190612207565b600a546001600160a01b0316331461142d5760405162461bcd60e51b81526004016107b0906127a1565b6001600160a01b0381166114925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b0565b61149b81611aee565b50565b600e54610100900460ff166114ee5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016107b0565b600e5462010000900460ff166115465760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c69737400000060448201526064016107b0565b336000908152600f602052604090205460ff166115a55760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e20746865205768697465204c69737400000060448201526064016107b0565b612ab36115b160085490565b106116095760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b60648201526084016107b0565b600281111561165a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360448201526064016107b0565b612ab361166a8261112560085490565b11156116885760405162461bcd60e51b81526004016107b0906127d6565b336000908152601060205260409020546002906116a59083611b40565b11156116f35760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820776869746565640000000060448201526064016107b0565b600d5434906117029083611b53565b1461174f5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107b0565b60005b81811015610b195733600090815260106020526040812080546001929061177a9084906128a7565b9091555061178d9050336111bd60085490565b8061179781612970565b915050611752565b60006001600160e01b0319821663780e9d6360e01b14806106a357506106a382611cac565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117f982610d06565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118ab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b0565b60006118b683610d06565b9050806001600160a01b0316846001600160a01b031614806118f15750836001600160a01b03166118e68461073b565b6001600160a01b0316145b8061192157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661193c82610d06565b6001600160a01b0316146119a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b0565b6001600160a01b038216611a065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b0565b611a11838383611cfc565b611a1c6000826117c4565b6001600160a01b0383166000908152600360205260408120805460019290611a459084906128f2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a739084906128a7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b19828260405180602001604052806000815250611d07565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b4c82846128a7565b9392505050565b6000611b4c82846128d3565b611b6a848484611929565b611b7684848484611d3a565b6112da5760405162461bcd60e51b81526004016107b09061274f565b606081611bb65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be05780611bca81612970565b9150611bd99050600a836128bf565b9150611bba565b60008167ffffffffffffffff811115611c0957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c33576020820181803683370190505b5090505b841561192157611c486001836128f2565b9150611c55600a8661298b565b611c609060306128a7565b60f81b818381518110611c8357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ca5600a866128bf565b9450611c37565b60006001600160e01b031982166380ac58cd60e01b1480611cdd57506001600160e01b03198216635b5e139f60e01b145b806106a357506301ffc9a760e01b6001600160e01b03198316146106a3565b6108e6838383611e47565b611d118383611eff565b611d1e6000848484611d3a565b6108e65760405162461bcd60e51b81526004016107b09061274f565b60006001600160a01b0384163b15611e3c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d7e9033908990889088906004016126ff565b602060405180830381600087803b158015611d9857600080fd5b505af1925050508015611dc8575060408051601f3d908101601f19168201909252611dc591810190612575565b60015b611e22573d808015611df6576040519150601f19603f3d011682016040523d82523d6000602084013e611dfb565b606091505b508051611e1a5760405162461bcd60e51b81526004016107b09061274f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611921565b506001949350505050565b6001600160a01b038316611ea257611e9d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ec5565b816001600160a01b0316836001600160a01b031614611ec557611ec5838261204d565b6001600160a01b038216611edc576108e6816120ea565b826001600160a01b0316826001600160a01b0316146108e6576108e682826121c3565b6001600160a01b038216611f555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b0565b6000818152600260205260409020546001600160a01b031615611fba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b0565b611fc660008383611cfc565b6001600160a01b0382166000908152600360205260408120805460019290611fef9084906128a7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161205a84610d7d565b61206491906128f2565b6000838152600760205260409020549091508082146120b7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120fc906001906128f2565b6000838152600960205260408120546008805493945090928490811061213257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061216157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121a757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121ce83610d7d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461221390612935565b90600052602060002090601f016020900481019282612235576000855561227b565b82601f1061224e57805160ff191683800117855561227b565b8280016001018555821561227b579182015b8281111561227b578251825591602001919060010190612260565b5061228792915061228b565b5090565b5b80821115612287576000815560010161228c565b600067ffffffffffffffff8311156122ba576122ba6129cb565b6122cd601f8401601f1916602001612876565b90508281528383830111156122e157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146113ad57600080fd5b803580151581146113ad57600080fd5b600082601f83011261232f578081fd5b611b4c838335602085016122a0565b60006020828403121561234f578081fd5b611b4c826122f8565b6000806040838503121561236a578081fd5b612373836122f8565b9150612381602084016122f8565b90509250929050565b60008060006060848603121561239e578081fd5b6123a7846122f8565b92506123b5602085016122f8565b9150604084013590509250925092565b600080600080608085870312156123da578081fd5b6123e3856122f8565b93506123f1602086016122f8565b925060408501359150606085013567ffffffffffffffff811115612413578182fd5b8501601f81018713612423578182fd5b612432878235602084016122a0565b91505092959194509250565b60008060408385031215612450578182fd5b612459836122f8565b91506123816020840161230f565b60008060408385031215612479578182fd5b612482836122f8565b946020939093013593505050565b600060208083850312156124a2578182fd5b823567ffffffffffffffff808211156124b9578384fd5b818501915085601f8301126124cc578384fd5b8135818111156124de576124de6129cb565b8060051b91506124ef848301612876565b8181528481019084860184860187018a1015612509578788fd5b8795505b838610156125325761251e816122f8565b83526001959095019491860191860161250d565b5098975050505050505050565b600060208284031215612550578081fd5b611b4c8261230f565b60006020828403121561256a578081fd5b8135611b4c816129e1565b600060208284031215612586578081fd5b8151611b4c816129e1565b600080604083850312156125a3578182fd5b823567ffffffffffffffff808211156125ba578384fd5b6125c68683870161231f565b935060208501359150808211156125db578283fd5b506125e88582860161231f565b9150509250929050565b600060208284031215612603578081fd5b5035919050565b60008151808452612622816020860160208601612909565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061265057607f831692505b602080841082141561267057634e487b7160e01b86526022600452602486fd5b8180156126845760018114612695576126c2565b60ff198616895284890196506126c2565b60008881526020902060005b868110156126ba5781548b8201529085019083016126a1565b505084890196505b50505050505092915050565b6000611b4c8284612636565b60006126e68285612636565b83516126f6818360208801612909565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127329083018461260a565b9695505050505050565b602081526000611b4c602083018461260a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561289f5761289f6129cb565b604052919050565b600082198211156128ba576128ba61299f565b500190565b6000826128ce576128ce6129b5565b500490565b60008160001904831182151516156128ed576128ed61299f565b500290565b6000828210156129045761290461299f565b500390565b60005b8381101561292457818101518382015260200161290c565b838111156112da5750506000910152565b600181811c9082168061294957607f821691505b6020821081141561296a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129845761298461299f565b5060010190565b60008261299a5761299a6129b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461149b57600080fdfea26469706673582212203c03e57dcd9282e9581b026f3ef717c0d68c66d8ca9137f14dc154c5d5a68f6064736f6c63430008040033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063b22d0c83116100a0578063e748e07c1161006f578063e748e07c146105e7578063e8254174146105fc578063e985e9c51461061c578063f2fde38b14610665578063ff99d8ce1461068557600080fd5b8063b22d0c8314610558578063b88d4fde14610591578063c87b56dd146105b1578063d1d80f30146105d157600080fd5b806395d89b41116100e757806395d89b41146104de578063a22cb465146104f3578063a38bffda14610513578063a475b5dd14610529578063aeb167681461054357600080fd5b8063715018a614610478578063740d73f31461048d5780638da5cb5b146104ad57806392642744146104cb57600080fd5b80633542aee21161019b57806351cff8d91161016a57806351cff8d9146103e35780635f0f45b21461040357806360d938dc146104185780636352211e1461043857806370a082311461045857600080fd5b80633542aee2146103635780633f8121a21461038357806342842e0e146103a35780634f6ccce7146103c357600080fd5b806318160ddd116101e257806318160ddd146102c557806322f3e2d4146102e457806323b872dd146103035780632750fc78146103235780632f745c591461034357600080fd5b806301ffc9a71461021457806306fdde0314610249578063081812fc1461026b578063095ea7b3146102a3575b600080fd5b34801561022057600080fd5b5061023461022f366004612559565b610698565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106a9565b604051610240919061273c565b34801561027757600080fd5b5061028b6102863660046125f2565b61073b565b6040516001600160a01b039091168152602001610240565b3480156102af57600080fd5b506102c36102be366004612467565b6107d5565b005b3480156102d157600080fd5b506008545b604051908152602001610240565b3480156102f057600080fd5b50600e5461023490610100900460ff1681565b34801561030f57600080fd5b506102c361031e36600461238a565b6108eb565b34801561032f57600080fd5b506102c361033e36600461253f565b61091c565b34801561034f57600080fd5b506102d661035e366004612467565b610960565b34801561036f57600080fd5b506102c361037e366004612467565b6109f6565b34801561038f57600080fd5b506102c361039e36600461253f565b610b1d565b3480156103af57600080fd5b506102c36103be36600461238a565b610b63565b3480156103cf57600080fd5b506102d66103de3660046125f2565b610b7e565b3480156103ef57600080fd5b506102c36103fe36600461233e565b610c1f565b34801561040f57600080fd5b506102c3610ccd565b34801561042457600080fd5b50600e546102349062010000900460ff1681565b34801561044457600080fd5b5061028b6104533660046125f2565b610d06565b34801561046457600080fd5b506102d661047336600461233e565b610d7d565b34801561048457600080fd5b506102c3610e04565b34801561049957600080fd5b506102c36104a8366004612490565b610e3a565b3480156104b957600080fd5b50600a546001600160a01b031661028b565b6102c36104d93660046125f2565b61101b565b3480156104ea57600080fd5b5061025e6111d4565b3480156104ff57600080fd5b506102c361050e36600461243e565b6111e3565b34801561051f57600080fd5b506102d6600d5481565b34801561053557600080fd5b50600e546102349060ff1681565b34801561054f57600080fd5b506102d6600281565b34801561056457600080fd5b5061023461057336600461233e565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561059d57600080fd5b506102c36105ac3660046123c5565b6112a8565b3480156105bd57600080fd5b5061025e6105cc3660046125f2565b6112e0565b3480156105dd57600080fd5b506102d6612ab381565b3480156105f357600080fd5b506102d6600a81565b34801561060857600080fd5b506102c3610617366004612591565b6113b2565b34801561062857600080fd5b50610234610637366004612358565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561067157600080fd5b506102c361068036600461233e565b611403565b6102c36106933660046125f2565b61149e565b60006106a38261179f565b92915050565b6060600080546106b890612935565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612935565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107e082610d06565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b0565b336001600160a01b038216148061086a575061086a8133610637565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b0565b6108e683836117c4565b505050565b6108f53382611832565b6109115760405162461bcd60e51b81526004016107b090612825565b6108e6838383611929565b600a546001600160a01b031633146109465760405162461bcd60e51b81526004016107b0906127a1565b600e80549115156101000261ff0019909216919091179055565b600061096b83610d7d565b82106109cd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a205760405162461bcd60e51b81526004016107b0906127a1565b612ab38111610a975760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e730000000000000060648201526084016107b0565b612b67811115610b0f5760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e73000000000000000060648201526084016107b0565b610b198282611ad4565b5050565b600a546001600160a01b03163314610b475760405162461bcd60e51b81526004016107b0906127a1565b600e8054911515620100000262ff000019909216919091179055565b6108e6838383604051806020016040528060008152506112a8565b6000610b8960085490565b8210610bec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b0565b60088281548110610c0d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610c495760405162461bcd60e51b81526004016107b0906127a1565b4780610c975760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f60448201526064016107b0565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156108e6573d6000803e3d6000fd5b600a546001600160a01b03163314610cf75760405162461bcd60e51b81526004016107b0906127a1565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806106a35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b0565b60006001600160a01b038216610de85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b0565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e2e5760405162461bcd60e51b81526004016107b0906127a1565b610e386000611aee565b565b600a546001600160a01b03163314610e645760405162461bcd60e51b81526004016107b0906127a1565b60005b8151811015610b195760006001600160a01b0316828281518110610e9b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610efa5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742061646420746865206e756c6c2061646472657373000000000060448201526064016107b0565b6001600f6000848481518110610f2057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600060106000848481518110610f8557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205411610fba576000611008565b60106000838381518110610fde57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020545b508061101381612970565b915050610e67565b600e54610100900460ff1661106b5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016107b0565b600e5462010000900460ff16156110c45760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c69737400000060448201526064016107b0565b600a8111156111155760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d697400000000000000000060448201526064016107b0565b612ab361112b8261112560085490565b90611b40565b11156111495760405162461bcd60e51b81526004016107b0906127d6565b600d5434906111589083611b53565b146111a55760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107b0565b60005b81811015610b19576111c2336111bd60085490565b611ad4565b806111cc81612970565b9150506111a8565b6060600180546106b890612935565b6001600160a01b03821633141561123c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112b23383611832565b6112ce5760405162461bcd60e51b81526004016107b090612825565b6112da84848484611b5f565b50505050565b6000818152600260205260409020546060906001600160a01b031661135f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b0565b600e5460ff1661139157600c60405160200161137b91906126ce565b6040516020818303038152906040529050919050565b600b61139c83611b92565b60405160200161137b9291906126da565b919050565b600a546001600160a01b031633146113dc5760405162461bcd60e51b81526004016107b0906127a1565b81516113ef90600c906020850190612207565b5080516108e690600b906020840190612207565b600a546001600160a01b0316331461142d5760405162461bcd60e51b81526004016107b0906127a1565b6001600160a01b0381166114925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b0565b61149b81611aee565b50565b600e54610100900460ff166114ee5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016107b0565b600e5462010000900460ff166115465760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c69737400000060448201526064016107b0565b336000908152600f602052604090205460ff166115a55760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e20746865205768697465204c69737400000060448201526064016107b0565b612ab36115b160085490565b106116095760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b60648201526084016107b0565b600281111561165a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360448201526064016107b0565b612ab361166a8261112560085490565b11156116885760405162461bcd60e51b81526004016107b0906127d6565b336000908152601060205260409020546002906116a59083611b40565b11156116f35760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820776869746565640000000060448201526064016107b0565b600d5434906117029083611b53565b1461174f5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107b0565b60005b81811015610b195733600090815260106020526040812080546001929061177a9084906128a7565b9091555061178d9050336111bd60085490565b8061179781612970565b915050611752565b60006001600160e01b0319821663780e9d6360e01b14806106a357506106a382611cac565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117f982610d06565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118ab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b0565b60006118b683610d06565b9050806001600160a01b0316846001600160a01b031614806118f15750836001600160a01b03166118e68461073b565b6001600160a01b0316145b8061192157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661193c82610d06565b6001600160a01b0316146119a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b0565b6001600160a01b038216611a065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b0565b611a11838383611cfc565b611a1c6000826117c4565b6001600160a01b0383166000908152600360205260408120805460019290611a459084906128f2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a739084906128a7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b19828260405180602001604052806000815250611d07565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b4c82846128a7565b9392505050565b6000611b4c82846128d3565b611b6a848484611929565b611b7684848484611d3a565b6112da5760405162461bcd60e51b81526004016107b09061274f565b606081611bb65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be05780611bca81612970565b9150611bd99050600a836128bf565b9150611bba565b60008167ffffffffffffffff811115611c0957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c33576020820181803683370190505b5090505b841561192157611c486001836128f2565b9150611c55600a8661298b565b611c609060306128a7565b60f81b818381518110611c8357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ca5600a866128bf565b9450611c37565b60006001600160e01b031982166380ac58cd60e01b1480611cdd57506001600160e01b03198216635b5e139f60e01b145b806106a357506301ffc9a760e01b6001600160e01b03198316146106a3565b6108e6838383611e47565b611d118383611eff565b611d1e6000848484611d3a565b6108e65760405162461bcd60e51b81526004016107b09061274f565b60006001600160a01b0384163b15611e3c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d7e9033908990889088906004016126ff565b602060405180830381600087803b158015611d9857600080fd5b505af1925050508015611dc8575060408051601f3d908101601f19168201909252611dc591810190612575565b60015b611e22573d808015611df6576040519150601f19603f3d011682016040523d82523d6000602084013e611dfb565b606091505b508051611e1a5760405162461bcd60e51b81526004016107b09061274f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611921565b506001949350505050565b6001600160a01b038316611ea257611e9d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ec5565b816001600160a01b0316836001600160a01b031614611ec557611ec5838261204d565b6001600160a01b038216611edc576108e6816120ea565b826001600160a01b0316826001600160a01b0316146108e6576108e682826121c3565b6001600160a01b038216611f555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b0565b6000818152600260205260409020546001600160a01b031615611fba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b0565b611fc660008383611cfc565b6001600160a01b0382166000908152600360205260408120805460019290611fef9084906128a7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161205a84610d7d565b61206491906128f2565b6000838152600760205260409020549091508082146120b7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120fc906001906128f2565b6000838152600960205260408120546008805493945090928490811061213257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061216157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121a757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121ce83610d7d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461221390612935565b90600052602060002090601f016020900481019282612235576000855561227b565b82601f1061224e57805160ff191683800117855561227b565b8280016001018555821561227b579182015b8281111561227b578251825591602001919060010190612260565b5061228792915061228b565b5090565b5b80821115612287576000815560010161228c565b600067ffffffffffffffff8311156122ba576122ba6129cb565b6122cd601f8401601f1916602001612876565b90508281528383830111156122e157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146113ad57600080fd5b803580151581146113ad57600080fd5b600082601f83011261232f578081fd5b611b4c838335602085016122a0565b60006020828403121561234f578081fd5b611b4c826122f8565b6000806040838503121561236a578081fd5b612373836122f8565b9150612381602084016122f8565b90509250929050565b60008060006060848603121561239e578081fd5b6123a7846122f8565b92506123b5602085016122f8565b9150604084013590509250925092565b600080600080608085870312156123da578081fd5b6123e3856122f8565b93506123f1602086016122f8565b925060408501359150606085013567ffffffffffffffff811115612413578182fd5b8501601f81018713612423578182fd5b612432878235602084016122a0565b91505092959194509250565b60008060408385031215612450578182fd5b612459836122f8565b91506123816020840161230f565b60008060408385031215612479578182fd5b612482836122f8565b946020939093013593505050565b600060208083850312156124a2578182fd5b823567ffffffffffffffff808211156124b9578384fd5b818501915085601f8301126124cc578384fd5b8135818111156124de576124de6129cb565b8060051b91506124ef848301612876565b8181528481019084860184860187018a1015612509578788fd5b8795505b838610156125325761251e816122f8565b83526001959095019491860191860161250d565b5098975050505050505050565b600060208284031215612550578081fd5b611b4c8261230f565b60006020828403121561256a578081fd5b8135611b4c816129e1565b600060208284031215612586578081fd5b8151611b4c816129e1565b600080604083850312156125a3578182fd5b823567ffffffffffffffff808211156125ba578384fd5b6125c68683870161231f565b935060208501359150808211156125db578283fd5b506125e88582860161231f565b9150509250929050565b600060208284031215612603578081fd5b5035919050565b60008151808452612622816020860160208601612909565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061265057607f831692505b602080841082141561267057634e487b7160e01b86526022600452602486fd5b8180156126845760018114612695576126c2565b60ff198616895284890196506126c2565b60008881526020902060005b868110156126ba5781548b8201529085019083016126a1565b505084890196505b50505050505092915050565b6000611b4c8284612636565b60006126e68285612636565b83516126f6818360208801612909565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127329083018461260a565b9695505050505050565b602081526000611b4c602083018461260a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561289f5761289f6129cb565b604052919050565b600082198211156128ba576128ba61299f565b500190565b6000826128ce576128ce6129b5565b500490565b60008160001904831182151516156128ed576128ed61299f565b500290565b6000828210156129045761290461299f565b500390565b60005b8381101561292457818101518382015260200161290c565b838111156112da5750506000910152565b600181811c9082168061294957607f821691505b6020821081141561296a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129845761298461299f565b5060010190565b60008261299a5761299a6129b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461149b57600080fdfea26469706673582212203c03e57dcd9282e9581b026f3ef717c0d68c66d8ca9137f14dc154c5d5a68f6064736f6c63430008040033

Deployed Bytecode Sourcemap

55310:6674:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61444:235;;;;;;;;;;-1:-1:-1;61444:235:0;;;;;:::i;:::-;;:::i;:::-;;;8260:14:1;;8253:22;8235:41;;8223:2;8208:18;61444:235:0;;;;;;;;26776:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28335:221::-;;;;;;;;;;-1:-1:-1;28335:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7558:32:1;;;7540:51;;7528:2;7513:18;28335:221:0;7495:102:1;27858:411:0;;;;;;;;;;-1:-1:-1;27858:411:0;;;;;:::i;:::-;;:::i;:::-;;40527:113;;;;;;;;;;-1:-1:-1;40615:10:0;:17;40527:113;;;20748:25:1;;;20736:2;20721:18;40527:113:0;20703:76:1;55998:20:0;;;;;;;;;;-1:-1:-1;55998:20:0;;;;;;;;;;;29225:339;;;;;;;;;;-1:-1:-1;29225:339:0;;;;;:::i;:::-;;:::i;57395:137::-;;;;;;;;;;-1:-1:-1;57395:137:0;;;;;:::i;:::-;;:::i;40195:256::-;;;;;;;;;;-1:-1:-1;40195:256:0;;;;;:::i;:::-;;:::i;60474:368::-;;;;;;;;;;-1:-1:-1;60474:368:0;;;;;:::i;:::-;;:::i;57632:149::-;;;;;;;;;;-1:-1:-1;57632:149:0;;;;;:::i;:::-;;:::i;29635:185::-;;;;;;;;;;-1:-1:-1;29635:185:0;;;;;:::i;:::-;;:::i;40717:233::-;;;;;;;;;;-1:-1:-1;40717:233:0;;;;;:::i;:::-;;:::i;58152:253::-;;;;;;;;;;-1:-1:-1;58152:253:0;;;;;:::i;:::-;;:::i;56278:98::-;;;;;;;;;;;;;:::i;56025:27::-;;;;;;;;;;-1:-1:-1;56025:27:0;;;;;;;;;;;26470:239;;;;;;;;;;-1:-1:-1;26470:239:0;;;;;:::i;:::-;;:::i;26200:208::-;;;;;;;;;;-1:-1:-1;26200:208:0;;;;;:::i;:::-;;:::i;54655:94::-;;;;;;;;;;;;;:::i;56476:562::-;;;;;;;;;;-1:-1:-1;56476:562:0;;;;;:::i;:::-;;:::i;54004:87::-;;;;;;;;;;-1:-1:-1;54077:6:0;;-1:-1:-1;;;;;54077:6:0;54004:87;;58570:648;;;;;;:::i;:::-;;:::i;26945:104::-;;;;;;;;;;;;;:::i;28628:295::-;;;;;;;;;;-1:-1:-1;28628:295:0;;;;;:::i;:::-;;:::i;55910:44::-;;;;;;;;;;;;;;;;55973:18;;;;;;;;;;-1:-1:-1;55973:18:0;;;;;;;;56059:46;;;;;;;;;;;;56104:1;56059:46;;57137:158;;;;;;;;;;-1:-1:-1;57137:158:0;;;;;:::i;:::-;-1:-1:-1;;;;;57271:16:0;57241:4;57271:16;;;:9;:16;;;;;;;;;57137:158;29891:328;;;;;;;;;;-1:-1:-1;29891:328:0;;;;;:::i;:::-;;:::i;60990:442::-;;;;;;;;;;-1:-1:-1;60990:442:0;;;;;:::i;:::-;;:::i;55810:46::-;;;;;;;;;;;;55851:5;55810:46;;55758:45;;;;;;;;;;;;55801:2;55758:45;;57853:197;;;;;;;;;;-1:-1:-1;57853:197:0;;;;;:::i;:::-;;:::i;28994:164::-;;;;;;;;;;-1:-1:-1;28994:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29115:25:0;;;29091:4;29115:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28994:164;54904:192;;;;;;;;;;-1:-1:-1;54904:192:0;;;;;:::i;:::-;;:::i;59380:1002::-;;;;;;:::i;:::-;;:::i;61444:235::-;61604:4;61634:37;61658:12;61634:23;:37::i;:::-;61627:44;61444:235;-1:-1:-1;;61444:235:0:o;26776:100::-;26830:13;26863:5;26856:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26776:100;:::o;28335:221::-;28411:7;31818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31818:16:0;28431:73;;;;-1:-1:-1;;;28431:73:0;;16007:2:1;28431:73:0;;;15989:21:1;16046:2;16026:18;;;16019:30;16085:34;16065:18;;;16058:62;-1:-1:-1;;;16136:18:1;;;16129:42;16188:19;;28431:73:0;;;;;;;;;-1:-1:-1;28524:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28524:24:0;;28335:221::o;27858:411::-;27939:13;27955:23;27970:7;27955:14;:23::i;:::-;27939:39;;28003:5;-1:-1:-1;;;;;27997:11:0;:2;-1:-1:-1;;;;;27997:11:0;;;27989:57;;;;-1:-1:-1;;;27989:57:0;;17607:2:1;27989:57:0;;;17589:21:1;17646:2;17626:18;;;17619:30;17685:34;17665:18;;;17658:62;-1:-1:-1;;;17736:18:1;;;17729:31;17777:19;;27989:57:0;17579:223:1;27989:57:0;21313:10;-1:-1:-1;;;;;28081:21:0;;;;:62;;-1:-1:-1;28106:37:0;28123:5;21313:10;28994:164;:::i;28106:37::-;28059:168;;;;-1:-1:-1;;;28059:168:0;;13624:2:1;28059:168:0;;;13606:21:1;13663:2;13643:18;;;13636:30;13702:34;13682:18;;;13675:62;13773:26;13753:18;;;13746:54;13817:19;;28059:168:0;13596:246:1;28059:168:0;28240:21;28249:2;28253:7;28240:8;:21::i;:::-;27858:411;;;:::o;29225:339::-;29420:41;21313:10;29453:7;29420:18;:41::i;:::-;29412:103;;;;-1:-1:-1;;;29412:103:0;;;;;;;:::i;:::-;29528:28;29538:4;29544:2;29548:7;29528:9;:28::i;57395:137::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;57504:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;57504:20:0;;::::1;::::0;;;::::1;::::0;;57395:137::o;40195:256::-;40292:7;40328:23;40345:5;40328:16;:23::i;:::-;40320:5;:31;40312:87;;;;-1:-1:-1;;;40312:87:0;;9071:2:1;40312:87:0;;;9053:21:1;9110:2;9090:18;;;9083:30;9149:34;9129:18;;;9122:62;-1:-1:-1;;;9200:18:1;;;9193:41;9251:19;;40312:87:0;9043:233:1;40312:87:0;-1:-1:-1;;;;;;40417:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40195:256::o;60474:368::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;55851:5:::1;60613:8;:25;60605:95;;;::::0;-1:-1:-1;;;60605:95:0;;19659:2:1;60605:95:0::1;::::0;::::1;19641:21:1::0;19698:2;19678:18;;;19671:30;19737:34;19717:18;;;19710:62;19808:27;19788:18;;;19781:55;19853:19;;60605:95:0::1;19631:247:1::0;60605:95:0::1;55898:5;60719:8;:19;;60711:88;;;::::0;-1:-1:-1;;;60711:88:0;;14460:2:1;60711:88:0::1;::::0;::::1;14442:21:1::0;14499:2;14479:18;;;14472:30;14538:34;14518:18;;;14511:62;14609:26;14589:18;;;14582:54;14653:19;;60711:88:0::1;14432:246:1::0;60711:88:0::1;60810:24;60820:3;60825:8;60810:9;:24::i;:::-;60474:368:::0;;:::o;57632:149::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;57746:15:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;57746:27:0;;::::1;::::0;;;::::1;::::0;;57632:149::o;29635:185::-;29773:39;29790:4;29796:2;29800:7;29773:39;;;;;;;;;;;;:16;:39::i;40717:233::-;40792:7;40828:30;40615:10;:17;;40527:113;40828:30;40820:5;:38;40812:95;;;;-1:-1:-1;;;40812:95:0;;18843:2:1;40812:95:0;;;18825:21:1;18882:2;18862:18;;;18855:30;18921:34;18901:18;;;18894:62;-1:-1:-1;;;18972:18:1;;;18965:42;19024:19;;40812:95:0;18815:234:1;40812:95:0;40925:10;40936:5;40925:17;;;;;;-1:-1:-1;;;40925:17:0;;;;;;;;;;;;;;;;;40918:24;;40717:233;;;:::o;58152:253::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;58268:21:::1;58308:11:::0;58300:56:::1;;;::::0;-1:-1:-1;;;58300:56:0;;12494:2:1;58300:56:0::1;::::0;::::1;12476:21:1::0;;;12513:18;;;12506:30;12572:34;12552:18;;;12545:62;12624:18;;58300:56:0::1;12466:182:1::0;58300:56:0::1;58367:30;::::0;-1:-1:-1;;;;;58367:21:0;::::1;::::0;:30;::::1;;;::::0;58389:7;;58367:30:::1;::::0;;;58389:7;58367:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;56278:98:::0;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;56355:6:::1;:13:::0;;-1:-1:-1;;56355:13:0::1;56364:4;56355:13;::::0;;56278:98::o;26470:239::-;26542:7;26578:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26578:16:0;26613:19;26605:73;;;;-1:-1:-1;;;26605:73:0;;14885:2:1;26605:73:0;;;14867:21:1;14924:2;14904:18;;;14897:30;14963:34;14943:18;;;14936:62;-1:-1:-1;;;15014:18:1;;;15007:39;15063:19;;26605:73:0;14857:231:1;26200:208:0;26272:7;-1:-1:-1;;;;;26300:19:0;;26292:74;;;;-1:-1:-1;;;26292:74:0;;14049:2:1;26292:74:0;;;14031:21:1;14088:2;14068:18;;;14061:30;14127:34;14107:18;;;14100:62;-1:-1:-1;;;14178:18:1;;;14171:40;14228:19;;26292:74:0;14021:232:1;26292:74:0;-1:-1:-1;;;;;;26384:16:0;;;;;:9;:16;;;;;;;26200:208::o;54655:94::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;54720:21:::1;54738:1;54720:9;:21::i;:::-;54655:94::o:0;56476:562::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;56604:9:::1;56599:432;56623:10;:17;56619:1;:21;56599:432;;;56695:1;-1:-1:-1::0;;;;;56670:27:0::1;:10;56681:1;56670:13;;;;;;-1:-1:-1::0;;;56670:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56670:27:0::1;;;56662:67;;;::::0;-1:-1:-1;;;56662:67:0;;13268:2:1;56662:67:0::1;::::0;::::1;13250:21:1::0;13307:2;13287:18;;;13280:30;13346:29;13326:18;;;13319:57;13393:18;;56662:67:0::1;13240:177:1::0;56662:67:0::1;56771:4;56744:9;:24;56754:10;56765:1;56754:13;;;;;;-1:-1:-1::0;;;56754:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56744:24:0::1;-1:-1:-1::0;;;;;56744:24:0::1;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;56980:1;56946:16;:31;56963:10;56974:1;56963:13;;;;;;-1:-1:-1::0;;;56963:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56946:31:0::1;-1:-1:-1::0;;;;;56946:31:0::1;;;;;;;;;;;;;:35;:73;;57018:1;56946:73;;;56984:16;:31;57001:10;57012:1;57001:13;;;;;;-1:-1:-1::0;;;57001:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56984:31:0::1;-1:-1:-1::0;;;;;56984:31:0::1;;;;;;;;;;;;;56946:73;-1:-1:-1::0;56642:3:0;::::1;::::0;::::1;:::i;:::-;;;;56599:432;;58570:648:::0;58691:8;;;;;;;58683:43;;;;-1:-1:-1;;;58683:43:0;;15656:2:1;58683:43:0;;;15638:21:1;15695:2;15675:18;;;15668:30;-1:-1:-1;;;15714:18:1;;;15707:52;15776:18;;58683:43:0;15628:172:1;58683:43:0;58746:15;;;;;;;58745:16;58737:58;;;;-1:-1:-1;;;58737:58:0;;20085:2:1;58737:58:0;;;20067:21:1;20124:2;20104:18;;;20097:30;20163:31;20143:18;;;20136:59;20212:18;;58737:58:0;20057:179:1;58737:58:0;55801:2;58814:12;:32;;58806:68;;;;-1:-1:-1;;;58806:68:0;;11023:2:1;58806:68:0;;;11005:21:1;11062:2;11042:18;;;11035:30;11101:25;11081:18;;;11074:53;11144:18;;58806:68:0;10995:173:1;58806:68:0;55851:5;58893:31;58911:12;58893:13;40615:10;:17;;40527:113;58893:13;:17;;:31::i;:::-;:49;;58885:109;;;;-1:-1:-1;;;58885:109:0;;;;;;;:::i;:::-;59013:8;;59043:9;;59013:26;;59026:12;59013;:26::i;:::-;:39;59005:83;;;;-1:-1:-1;;;59005:83:0;;12134:2:1;59005:83:0;;;12116:21:1;12173:2;12153:18;;;12146:30;12212:33;12192:18;;;12185:61;12263:18;;59005:83:0;12106:181:1;59005:83:0;59113:6;59109:102;59129:12;59125:1;:16;59109:102;;;59163:36;59173:10;59185:13;40615:10;:17;;40527:113;59185:13;59163:9;:36::i;:::-;59143:3;;;;:::i;:::-;;;;59109:102;;26945:104;27001:13;27034:7;27027:14;;;;;:::i;28628:295::-;-1:-1:-1;;;;;28731:24:0;;21313:10;28731:24;;28723:62;;;;-1:-1:-1;;;28723:62:0;;11780:2:1;28723:62:0;;;11762:21:1;11819:2;11799:18;;;11792:30;11858:27;11838:18;;;11831:55;11903:18;;28723:62:0;11752:175:1;28723:62:0;21313:10;28798:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28798:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28798:53:0;;;;;;;;;;28867:48;;8235:41:1;;;28798:42:0;;21313:10;28867:48;;8208:18:1;28867:48:0;;;;;;;28628:295;;:::o;29891:328::-;30066:41;21313:10;30099:7;30066:18;:41::i;:::-;30058:103;;;;-1:-1:-1;;;30058:103:0;;;;;;;:::i;:::-;30172:39;30186:4;30192:2;30196:7;30205:5;30172:13;:39::i;:::-;29891:328;;;;:::o;60990:442::-;31794:4;31818:16;;;:7;:16;;;;;;61130:13;;-1:-1:-1;;;;;31818:16:0;61162:77;;;;-1:-1:-1;;;61162:77:0;;17191:2:1;61162:77:0;;;17173:21:1;17230:2;17210:18;;;17203:30;17269:34;17249:18;;;17242:62;-1:-1:-1;;;17320:18:1;;;17313:45;17375:19;;61162:77:0;17163:237:1;61162:77:0;61255:6;;;;61250:175;;61309:8;61292:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61278:41;;60990:442;;;:::o;61250:175::-;61383:7;61392:19;:8;:17;:19::i;:::-;61366:46;;;;;;;;;:::i;61250:175::-;60990:442;;;:::o;57853:197::-;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;57997:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;58028:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;54904:192::-:0;54077:6;;-1:-1:-1;;;;;54077:6:0;21313:10;54224:23;54216:68;;;;-1:-1:-1;;;54216:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54993:22:0;::::1;54985:73;;;::::0;-1:-1:-1;;;54985:73:0;;10259:2:1;54985:73:0::1;::::0;::::1;10241:21:1::0;10298:2;10278:18;;;10271:30;10337:34;10317:18;;;10310:62;-1:-1:-1;;;10388:18:1;;;10381:36;10434:19;;54985:73:0::1;10231:228:1::0;54985:73:0::1;55069:19;55079:8;55069:9;:19::i;:::-;54904:192:::0;:::o;59380:1002::-;59507:8;;;;;;;59499:43;;;;-1:-1:-1;;;59499:43:0;;15656:2:1;59499:43:0;;;15638:21:1;15695:2;15675:18;;;15668:30;-1:-1:-1;;;15714:18:1;;;15707:52;15776:18;;59499:43:0;15628:172:1;59499:43:0;59561:15;;;;;;;59553:57;;;;-1:-1:-1;;;59553:57:0;;20085:2:1;59553:57:0;;;20067:21:1;20124:2;20104:18;;;20097:30;20163:31;20143:18;;;20136:59;20212:18;;59553:57:0;20057:179:1;59553:57:0;59639:10;59629:21;;;;:9;:21;;;;;;;;59621:63;;;;-1:-1:-1;;;59621:63:0;;8713:2:1;59621:63:0;;;8695:21:1;8752:2;8732:18;;;8725:30;8791:31;8771:18;;;8764:59;8840:18;;59621:63:0;8685:179:1;59621:63:0;55851:5;59703:13;40615:10;:17;;40527:113;59703:13;:30;59695:77;;;;-1:-1:-1;;;59695:77:0;;19256:2:1;59695:77:0;;;19238:21:1;19295:2;19275:18;;;19268:30;19334:34;19314:18;;;19307:62;-1:-1:-1;;;19385:18:1;;;19378:32;19427:19;;59695:77:0;19228:224:1;59695:77:0;56104:1;59791:12;:34;;59783:79;;;;-1:-1:-1;;;59783:79:0;;20443:2:1;59783:79:0;;;20425:21:1;;;20462:18;;;20455:30;20521:34;20501:18;;;20494:62;20573:18;;59783:79:0;20415:182:1;59783:79:0;55851:5;59881:31;59899:12;59881:13;40615:10;:17;;40527:113;59881:31;:49;;59873:109;;;;-1:-1:-1;;;59873:109:0;;;;;;;:::i;:::-;60018:10;60001:28;;;;:16;:28;;;;;;56104:1;;60001:46;;60034:12;60001:32;:46::i;:::-;:68;;59993:109;;;;-1:-1:-1;;;59993:109:0;;9902:2:1;59993:109:0;;;9884:21:1;9941:2;9921:18;;;9914:30;9980;9960:18;;;9953:58;10028:18;;59993:109:0;9874:178:1;59993:109:0;60121:8;;60151:9;;60121:26;;60134:12;60121;:26::i;:::-;:39;60113:83;;;;-1:-1:-1;;;60113:83:0;;12134:2:1;60113:83:0;;;12116:21:1;12173:2;12153:18;;;12146:30;12212:33;12192:18;;;12185:61;12263:18;;60113:83:0;12106:181:1;60113:83:0;60212:9;60207:168;60231:12;60227:1;:16;60207:168;;;60296:10;60279:28;;;;:16;:28;;;;;:33;;60311:1;;60279:28;:33;;60311:1;;60279:33;:::i;:::-;;;;-1:-1:-1;60327:36:0;;-1:-1:-1;60337:10:0;60349:13;40615:10;:17;;40527:113;60327:36;60245:3;;;;:::i;:::-;;;;60207:168;;39887:224;39989:4;-1:-1:-1;;;;;;40013:50:0;;-1:-1:-1;;;40013:50:0;;:90;;;40067:36;40091:11;40067:23;:36::i;35711:174::-;35786:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35786:29:0;-1:-1:-1;;;;;35786:29:0;;;;;;;;:24;;35840:23;35786:24;35840:14;:23::i;:::-;-1:-1:-1;;;;;35831:46:0;;;;;;;;;;;35711:174;;:::o;32023:348::-;32116:4;31818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31818:16:0;32133:73;;;;-1:-1:-1;;;32133:73:0;;12855:2:1;32133:73:0;;;12837:21:1;12894:2;12874:18;;;12867:30;12933:34;12913:18;;;12906:62;-1:-1:-1;;;12984:18:1;;;12977:42;13036:19;;32133:73:0;12827:234:1;32133:73:0;32217:13;32233:23;32248:7;32233:14;:23::i;:::-;32217:39;;32286:5;-1:-1:-1;;;;;32275:16:0;:7;-1:-1:-1;;;;;32275:16:0;;:51;;;;32319:7;-1:-1:-1;;;;;32295:31:0;:20;32307:7;32295:11;:20::i;:::-;-1:-1:-1;;;;;32295:31:0;;32275:51;:87;;;-1:-1:-1;;;;;;29115:25:0;;;29091:4;29115:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32330:32;32267:96;32023:348;-1:-1:-1;;;;32023:348:0:o;35015:578::-;35174:4;-1:-1:-1;;;;;35147:31:0;:23;35162:7;35147:14;:23::i;:::-;-1:-1:-1;;;;;35147:31:0;;35139:85;;;;-1:-1:-1;;;35139:85:0;;16781:2:1;35139:85:0;;;16763:21:1;16820:2;16800:18;;;16793:30;16859:34;16839:18;;;16832:62;-1:-1:-1;;;16910:18:1;;;16903:39;16959:19;;35139:85:0;16753:231:1;35139:85:0;-1:-1:-1;;;;;35243:16:0;;35235:65;;;;-1:-1:-1;;;35235:65:0;;11375:2:1;35235:65:0;;;11357:21:1;11414:2;11394:18;;;11387:30;11453:34;11433:18;;;11426:62;-1:-1:-1;;;11504:18:1;;;11497:34;11548:19;;35235:65:0;11347:226:1;35235:65:0;35313:39;35334:4;35340:2;35344:7;35313:20;:39::i;:::-;35417:29;35434:1;35438:7;35417:8;:29::i;:::-;-1:-1:-1;;;;;35459:15:0;;;;;;:9;:15;;;;;:20;;35478:1;;35459:15;:20;;35478:1;;35459:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35490:13:0;;;;;;:9;:13;;;;;:18;;35507:1;;35490:13;:18;;35507:1;;35490:18;:::i;:::-;;;;-1:-1:-1;;35519:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35519:21:0;-1:-1:-1;;;;;35519:21:0;;;;;;;;;35558:27;;35519:16;;35558:27;;;;;;;35015:578;;;:::o;32713:110::-;32789:26;32799:2;32803:7;32789:26;;;;;;;;;;;;:9;:26::i;55104:173::-;55179:6;;;-1:-1:-1;;;;;55196:17:0;;;-1:-1:-1;;;;;;55196:17:0;;;;;;;55229:40;;55179:6;;;55196:17;55179:6;;55229:40;;55160:16;;55229:40;55104:173;;:::o;48835:98::-;48893:7;48920:5;48924:1;48920;:5;:::i;:::-;48913:12;48835:98;-1:-1:-1;;;48835:98:0:o;49573:::-;49631:7;49658:5;49662:1;49658;:5;:::i;31101:315::-;31258:28;31268:4;31274:2;31278:7;31258:9;:28::i;:::-;31305:48;31328:4;31334:2;31338:7;31347:5;31305:22;:48::i;:::-;31297:111;;;;-1:-1:-1;;;31297:111:0;;;;;;;:::i;21766:723::-;21822:13;22043:10;22039:53;;-1:-1:-1;;22070:10:0;;;;;;;;;;;;-1:-1:-1;;;22070:10:0;;;;;21766:723::o;22039:53::-;22117:5;22102:12;22158:78;22165:9;;22158:78;;22191:8;;;;:::i;:::-;;-1:-1:-1;22214:10:0;;-1:-1:-1;22222:2:0;22214:10;;:::i;:::-;;;22158:78;;;22246:19;22278:6;22268:17;;;;;;-1:-1:-1;;;22268:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22268:17:0;;22246:39;;22296:154;22303:10;;22296:154;;22330:11;22340:1;22330:11;;:::i;:::-;;-1:-1:-1;22399:10:0;22407:2;22399:5;:10;:::i;:::-;22386:24;;:2;:24;:::i;:::-;22373:39;;22356:6;22363;22356:14;;;;;;-1:-1:-1;;;22356:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;22356:56:0;;;;;;;;-1:-1:-1;22427:11:0;22436:2;22427:11;;:::i;:::-;;;22296:154;;25831:305;25933:4;-1:-1:-1;;;;;;25970:40:0;;-1:-1:-1;;;25970:40:0;;:105;;-1:-1:-1;;;;;;;26027:48:0;;-1:-1:-1;;;26027:48:0;25970:105;:158;;;-1:-1:-1;;;;;;;;;;24438:40:0;;;26092:36;24329:157;61732:249;61925:48;61952:5;61959:3;61964:8;61925:26;:48::i;33050:321::-;33180:18;33186:2;33190:7;33180:5;:18::i;:::-;33231:54;33262:1;33266:2;33270:7;33279:5;33231:22;:54::i;:::-;33209:154;;;;-1:-1:-1;;;33209:154:0;;;;;;;:::i;36450:799::-;36605:4;-1:-1:-1;;;;;36626:13:0;;13592:20;13640:8;36622:620;;36662:72;;-1:-1:-1;;;36662:72:0;;-1:-1:-1;;;;;36662:36:0;;;;;:72;;21313:10;;36713:4;;36719:7;;36728:5;;36662:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36662:72:0;;;;;;;;-1:-1:-1;;36662:72:0;;;;;;;;;;;;:::i;:::-;;;36658:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36904:13:0;;36900:272;;36947:60;;-1:-1:-1;;;36947:60:0;;;;;;;:::i;36900:272::-;37122:6;37116:13;37107:6;37103:2;37099:15;37092:38;36658:529;-1:-1:-1;;;;;;36785:51:0;-1:-1:-1;;;36785:51:0;;-1:-1:-1;36778:58:0;;36622:620;-1:-1:-1;37226:4:0;36450:799;;;;;;:::o;41563:589::-;-1:-1:-1;;;;;41769:18:0;;41765:187;;41804:40;41836:7;42979:10;:17;;42952:24;;;;:15;:24;;;;;:44;;;43007:24;;;;;;;;;;;;42875:164;41804:40;41765:187;;;41874:2;-1:-1:-1;;;;;41866:10:0;:4;-1:-1:-1;;;;;41866:10:0;;41862:90;;41893:47;41926:4;41932:7;41893:32;:47::i;:::-;-1:-1:-1;;;;;41966:16:0;;41962:183;;41999:45;42036:7;41999:36;:45::i;41962:183::-;42072:4;-1:-1:-1;;;;;42066:10:0;:2;-1:-1:-1;;;;;42066:10:0;;42062:83;;42093:40;42121:2;42125:7;42093:27;:40::i;33707:382::-;-1:-1:-1;;;;;33787:16:0;;33779:61;;;;-1:-1:-1;;;33779:61:0;;15295:2:1;33779:61:0;;;15277:21:1;;;15314:18;;;15307:30;15373:34;15353:18;;;15346:62;15425:18;;33779:61:0;15267:182:1;33779:61:0;31794:4;31818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31818:16:0;:30;33851:58;;;;-1:-1:-1;;;33851:58:0;;10666:2:1;33851:58:0;;;10648:21:1;10705:2;10685:18;;;10678:30;10744;10724:18;;;10717:58;10792:18;;33851:58:0;10638:178:1;33851:58:0;33922:45;33951:1;33955:2;33959:7;33922:20;:45::i;:::-;-1:-1:-1;;;;;33980:13:0;;;;;;:9;:13;;;;;:18;;33997:1;;33980:13;:18;;33997:1;;33980:18;:::i;:::-;;;;-1:-1:-1;;34009:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34009:21:0;-1:-1:-1;;;;;34009:21:0;;;;;;;;34048:33;;34009:16;;;34048:33;;34009:16;;34048:33;33707:382;;:::o;43666:988::-;43932:22;43982:1;43957:22;43974:4;43957:16;:22::i;:::-;:26;;;;:::i;:::-;43994:18;44015:26;;;:17;:26;;;;;;43932:51;;-1:-1:-1;44148:28:0;;;44144:328;;-1:-1:-1;;;;;44215:18:0;;44193:19;44215:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44266:30;;;;;;:44;;;44383:30;;:17;:30;;;;;:43;;;44144:328;-1:-1:-1;44568:26:0;;;;:17;:26;;;;;;;;44561:33;;;-1:-1:-1;;;;;44612:18:0;;;;;:12;:18;;;;;:34;;;;;;;44605:41;43666:988::o;44949:1079::-;45227:10;:17;45202:22;;45227:21;;45247:1;;45227:21;:::i;:::-;45259:18;45280:24;;;:15;:24;;;;;;45653:10;:26;;45202:46;;-1:-1:-1;45280:24:0;;45202:46;;45653:26;;;;-1:-1:-1;;;45653:26:0;;;;;;;;;;;;;;;;;45631:48;;45717:11;45692:10;45703;45692:22;;;;;;-1:-1:-1;;;45692:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;45797:28;;;:15;:28;;;;;;;:41;;;45969:24;;;;;45962:31;46004:10;:16;;;;;-1:-1:-1;;;46004:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;44949:1079;;;;:::o;42453:221::-;42538:14;42555:20;42572:2;42555:16;:20::i;:::-;-1:-1:-1;;;;;42586:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42631:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42453:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;603:160;668:20;;724:13;;717:21;707:32;;697:2;;753:1;750;743:12;768:229;811:5;864:3;857:4;849:6;845:17;841:27;831:2;;886:5;879;872:20;831:2;912:79;987:3;978:6;965:20;958:4;950:6;946:17;912:79;:::i;1002:196::-;1061:6;1114:2;1102:9;1093:7;1089:23;1085:32;1082:2;;;1135:6;1127;1120:22;1082:2;1163:29;1182:9;1163:29;:::i;1203:270::-;1271:6;1279;1332:2;1320:9;1311:7;1307:23;1303:32;1300:2;;;1353:6;1345;1338:22;1300:2;1381:29;1400:9;1381:29;:::i;:::-;1371:39;;1429:38;1463:2;1452:9;1448:18;1429:38;:::i;:::-;1419:48;;1290:183;;;;;:::o;1478:338::-;1555:6;1563;1571;1624:2;1612:9;1603:7;1599:23;1595:32;1592:2;;;1645:6;1637;1630:22;1592:2;1673:29;1692:9;1673:29;:::i;:::-;1663:39;;1721:38;1755:2;1744:9;1740:18;1721:38;:::i;:::-;1711:48;;1806:2;1795:9;1791:18;1778:32;1768:42;;1582:234;;;;;:::o;1821:696::-;1916:6;1924;1932;1940;1993:3;1981:9;1972:7;1968:23;1964:33;1961:2;;;2015:6;2007;2000:22;1961:2;2043:29;2062:9;2043:29;:::i;:::-;2033:39;;2091:38;2125:2;2114:9;2110:18;2091:38;:::i;:::-;2081:48;;2176:2;2165:9;2161:18;2148:32;2138:42;;2231:2;2220:9;2216:18;2203:32;2258:18;2250:6;2247:30;2244:2;;;2295:6;2287;2280:22;2244:2;2323:22;;2376:4;2368:13;;2364:27;-1:-1:-1;2354:2:1;;2410:6;2402;2395:22;2354:2;2438:73;2503:7;2498:2;2485:16;2480:2;2476;2472:11;2438:73;:::i;:::-;2428:83;;;1951:566;;;;;;;:::o;2522:264::-;2587:6;2595;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2669:6;2661;2654:22;2616:2;2697:29;2716:9;2697:29;:::i;:::-;2687:39;;2745:35;2776:2;2765:9;2761:18;2745:35;:::i;2791:264::-;2859:6;2867;2920:2;2908:9;2899:7;2895:23;2891:32;2888:2;;;2941:6;2933;2926:22;2888:2;2969:29;2988:9;2969:29;:::i;:::-;2959:39;3045:2;3030:18;;;;3017:32;;-1:-1:-1;;;2878:177:1:o;3060:1008::-;3144:6;3175:2;3218;3206:9;3197:7;3193:23;3189:32;3186:2;;;3239:6;3231;3224:22;3186:2;3284:9;3271:23;3313:18;3354:2;3346:6;3343:14;3340:2;;;3375:6;3367;3360:22;3340:2;3418:6;3407:9;3403:22;3393:32;;3463:7;3456:4;3452:2;3448:13;3444:27;3434:2;;3490:6;3482;3475:22;3434:2;3531;3518:16;3553:2;3549;3546:10;3543:2;;;3559:18;;:::i;:::-;3605:2;3602:1;3598:10;3588:20;;3628:28;3652:2;3648;3644:11;3628:28;:::i;:::-;3690:15;;;3721:12;;;;3753:11;;;3783;;;3779:20;;3776:33;-1:-1:-1;3773:2:1;;;3827:6;3819;3812:22;3773:2;3854:6;3845:15;;3869:169;3883:2;3880:1;3877:9;3869:169;;;3940:23;3959:3;3940:23;:::i;:::-;3928:36;;3901:1;3894:9;;;;;3984:12;;;;4016;;3869:169;;;-1:-1:-1;4057:5:1;3155:913;-1:-1:-1;;;;;;;;3155:913:1:o;4073:190::-;4129:6;4182:2;4170:9;4161:7;4157:23;4153:32;4150:2;;;4203:6;4195;4188:22;4150:2;4231:26;4247:9;4231:26;:::i;4268:255::-;4326:6;4379:2;4367:9;4358:7;4354:23;4350:32;4347:2;;;4400:6;4392;4385:22;4347:2;4444:9;4431:23;4463:30;4487:5;4463:30;:::i;4528:259::-;4597:6;4650:2;4638:9;4629:7;4625:23;4621:32;4618:2;;;4671:6;4663;4656:22;4618:2;4708:9;4702:16;4727:30;4751:5;4727:30;:::i;4792:573::-;4880:6;4888;4941:2;4929:9;4920:7;4916:23;4912:32;4909:2;;;4962:6;4954;4947:22;4909:2;5007:9;4994:23;5036:18;5077:2;5069:6;5066:14;5063:2;;;5098:6;5090;5083:22;5063:2;5126:50;5168:7;5159:6;5148:9;5144:22;5126:50;:::i;:::-;5116:60;;5229:2;5218:9;5214:18;5201:32;5185:48;;5258:2;5248:8;5245:16;5242:2;;;5279:6;5271;5264:22;5242:2;;5307:52;5351:7;5340:8;5329:9;5325:24;5307:52;:::i;:::-;5297:62;;;4899:466;;;;;:::o;5370:190::-;5429:6;5482:2;5470:9;5461:7;5457:23;5453:32;5450:2;;;5503:6;5495;5488:22;5450:2;-1:-1:-1;5531:23:1;;5440:120;-1:-1:-1;5440:120:1:o;5565:257::-;5606:3;5644:5;5638:12;5671:6;5666:3;5659:19;5687:63;5743:6;5736:4;5731:3;5727:14;5720:4;5713:5;5709:16;5687:63;:::i;:::-;5804:2;5783:15;-1:-1:-1;;5779:29:1;5770:39;;;;5811:4;5766:50;;5614:208;-1:-1:-1;;5614:208:1:o;5827:979::-;5912:12;;5877:3;;5969:1;5989:18;;;;6042;;;;6069:2;;6123:4;6115:6;6111:17;6101:27;;6069:2;6149;6197;6189:6;6186:14;6166:18;6163:38;6160:2;;;-1:-1:-1;;;6224:33:1;;6280:4;6277:1;6270:15;6310:4;6231:3;6298:17;6160:2;6341:18;6368:104;;;;6486:1;6481:319;;;;6334:466;;6368:104;-1:-1:-1;;6401:24:1;;6389:37;;6446:16;;;;-1:-1:-1;6368:104:1;;6481:319;21111:4;21130:17;;;21180:4;21164:21;;6575:1;6589:165;6603:6;6600:1;6597:13;6589:165;;;6681:14;;6668:11;;;6661:35;6724:16;;;;6618:10;;6589:165;;;6593:3;;6783:6;6778:3;6774:16;6767:23;;6334:466;;;;;;;5885:921;;;;:::o;6811:197::-;6939:3;6964:38;6998:3;6990:6;6964:38;:::i;7013:376::-;7189:3;7217:38;7251:3;7243:6;7217:38;:::i;:::-;7284:6;7278:13;7300:52;7345:6;7341:2;7334:4;7326:6;7322:17;7300:52;:::i;:::-;7368:15;;7197:192;-1:-1:-1;;;;7197:192:1:o;7602:488::-;-1:-1:-1;;;;;7871:15:1;;;7853:34;;7923:15;;7918:2;7903:18;;7896:43;7970:2;7955:18;;7948:34;;;8018:3;8013:2;7998:18;;7991:31;;;7796:4;;8039:45;;8064:19;;8056:6;8039:45;:::i;:::-;8031:53;7805:285;-1:-1:-1;;;;;;7805:285:1:o;8287:219::-;8436:2;8425:9;8418:21;8399:4;8456:44;8496:2;8485:9;8481:18;8473:6;8456:44;:::i;9281:414::-;9483:2;9465:21;;;9522:2;9502:18;;;9495:30;9561:34;9556:2;9541:18;;9534:62;-1:-1:-1;;;9627:2:1;9612:18;;9605:48;9685:3;9670:19;;9455:240::o;16218:356::-;16420:2;16402:21;;;16439:18;;;16432:30;16498:34;16493:2;16478:18;;16471:62;16565:2;16550:18;;16392:182::o;17807:411::-;18009:2;17991:21;;;18048:2;18028:18;;;18021:30;18087:34;18082:2;18067:18;;18060:62;-1:-1:-1;;;18153:2:1;18138:18;;18131:45;18208:3;18193:19;;17981:237::o;18223:413::-;18425:2;18407:21;;;18464:2;18444:18;;;18437:30;18503:34;18498:2;18483:18;;18476:62;-1:-1:-1;;;18569:2:1;18554:18;;18547:47;18626:3;18611:19;;18397:239::o;20784:275::-;20855:2;20849:9;20920:2;20901:13;;-1:-1:-1;;20897:27:1;20885:40;;20955:18;20940:34;;20976:22;;;20937:62;20934:2;;;21002:18;;:::i;:::-;21038:2;21031:22;20829:230;;-1:-1:-1;20829:230:1:o;21196:128::-;21236:3;21267:1;21263:6;21260:1;21257:13;21254:2;;;21273:18;;:::i;:::-;-1:-1:-1;21309:9:1;;21244:80::o;21329:120::-;21369:1;21395;21385:2;;21400:18;;:::i;:::-;-1:-1:-1;21434:9:1;;21375:74::o;21454:168::-;21494:7;21560:1;21556;21552:6;21548:14;21545:1;21542:21;21537:1;21530:9;21523:17;21519:45;21516:2;;;21567:18;;:::i;:::-;-1:-1:-1;21607:9:1;;21506:116::o;21627:125::-;21667:4;21695:1;21692;21689:8;21686:2;;;21700:18;;:::i;:::-;-1:-1:-1;21737:9:1;;21676:76::o;21757:258::-;21829:1;21839:113;21853:6;21850:1;21847:13;21839:113;;;21929:11;;;21923:18;21910:11;;;21903:39;21875:2;21868:10;21839:113;;;21970:6;21967:1;21964:13;21961:2;;;-1:-1:-1;;22005:1:1;21987:16;;21980:27;21810:205::o;22020:380::-;22099:1;22095:12;;;;22142;;;22163:2;;22217:4;22209:6;22205:17;22195:27;;22163:2;22270;22262:6;22259:14;22239:18;22236:38;22233:2;;;22316:10;22311:3;22307:20;22304:1;22297:31;22351:4;22348:1;22341:15;22379:4;22376:1;22369:15;22233:2;;22075:325;;;:::o;22405:135::-;22444:3;-1:-1:-1;;22465:17:1;;22462:2;;;22485:18;;:::i;:::-;-1:-1:-1;22532:1:1;22521:13;;22452:88::o;22545:112::-;22577:1;22603;22593:2;;22608:18;;:::i;:::-;-1:-1:-1;22642:9:1;;22583:74::o;22662:127::-;22723:10;22718:3;22714:20;22711:1;22704:31;22754:4;22751:1;22744:15;22778:4;22775:1;22768:15;22794:127;22855:10;22850:3;22846:20;22843:1;22836:31;22886:4;22883:1;22876:15;22910:4;22907:1;22900:15;22926:127;22987:10;22982:3;22978:20;22975:1;22968:31;23018:4;23015:1;23008:15;23042:4;23039:1;23032:15;23058:131;-1:-1:-1;;;;;;23132:32:1;;23122:43;;23112:2;;23179:1;23176;23169:12

Swarm Source

ipfs://3c03e57dcd9282e9581b026f3ef717c0d68c66d8ca9137f14dc154c5d5a68f60
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.