ETH Price: $3,108.10 (-1.63%)

Token

GlobalRegistrarsWrapper (GRSW)
 

Overview

Max Total Supply

0 GRSW

Holders

168

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GRSW
0x99ae5557d37e36000904f04bdba6ed5d55eee04b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GlobalRegistrarsWrapper

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-01
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev 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 have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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


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

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

    /**
     * @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: contracts/GlobalRegistrarsWrapper.sol


pragma solidity ^0.8.7;







interface GlobalRegistrar {
	function reserve(bytes32 _name) external;
	function transfer(bytes32 _name, address _newOwner) external;
//	function disown(bytes32 _name) external;
	function setAddress(bytes32 _name, address _a, bool _primary) external;
	function setSubRegistrar(bytes32 _name, address _registrar) external;
	function setContent(bytes32 _name, bytes32 _content) external;
	
    function owner(bytes32 _name) external view returns(address);
    function addr(bytes32 _name) external view returns(address);
    function subRegistrar(bytes32 _name) external view returns(address);
    function content(bytes32 _name) external view returns (bytes32);
//    function name(address _owner) external view returns (bytes32);
}

contract GlobalRegistrarsWrapper is Ownable, ERC721 {

    address[] public _globalRegistrarAddresses = [
    	0x5564886ca2C518d1964E5FCea4f423b41Db9F561, // Aug-08-2015 05:20:23 AM +UTC // "linagee"
    	0x2272D8d4dEc7DF90a36f03EFF778DECc6918F1A9, // Aug-10-2015 10:31:45 AM +UTC
    	0xAefd94F2b04B219ae2156B3a00A5E415Bff061C0, // Aug-19-2015 07:42:24 AM +UTC
    	0x32FBA3C059bB9DC91227F102E708cC0255fEB8Ee, // Aug-25-2015 03:33:33 AM +UTC
    	0xeFeF5a487410f7ba8B034cDB5a08cc1e3Ba89B3c, // Aug-25-2015 03:30:03 PM +UTC
    	0x2AB516c9a76461F6cbE18F6A6836d05D9E02cEfF, // Aug-28-2015 02:47:53 PM +UTC
    	0x822964bF8402477833837c86Ccff926c169bA550, // Aug-30-2015 09:09:43 AM +UTC
    	0xf4E1Aa70A22148A317D551194cbC7c92D586298F, // Sep-06-2015 06:17:33 PM +UTC
    	0x3A354AC32d303Bb0562842cfe2f5Fb07D9ca845A, // Sep-15-2015 08:07:57 PM +UTC
    	0x33990122638b9132cA29c723BDF037F1a891a70C, // Sep-24-2015 11:06:02 AM +UTC // official, hardcoded into geth
    	0x92c7143b1A11Dc199Cb0C58311f7c37395546615, // Sep-24-2015 10:10:00 PM +UTC
    	0xE121c78bD4DC097Bd949ba94e2a4621c32700630, // Sep-24-2015 10:10:06 PM +UTC
    	0x2B794737af0F32C30696d48563866E5e3bf7008a, // Sep-24-2015 10:10:51 PM +UTC
    	0xb829C107E7BeEdF9D97694860E99eFa66fD2eD3a, // Sep-24-2015 10:56:05 PM +UTC
    	0xA5715A1cB7572EeaEEC2855d4B85A8aFeC84dc28, // Oct-01-2015 08:27:04 PM +UTC
    	0x205162f8A65F9DC1B9778127Bf6182da40f44276, // Oct-07-2015 01:05:05 PM +UTC
    	0x6B22586AB58D39e1D700cAd989f9b2aAE1fD863F, // Oct-18-2015 04:26:46 AM +UTC
    	0xB278F342B2cc98de7762F579A0b41DC522bf8092, // Jan-09-2016 04:01:18 AM +UTC
    	0x07408Af8Ca23Cdd4Fc7C09d47AA91bbe5A308525  // Feb-06-2016 07:29:47 PM +UTC
   	];
    
    GlobalRegistrar[] public _globalRegistrars = [
    	GlobalRegistrar(_globalRegistrarAddresses[0]),
    	GlobalRegistrar(_globalRegistrarAddresses[1]),
    	GlobalRegistrar(_globalRegistrarAddresses[2]),
    	GlobalRegistrar(_globalRegistrarAddresses[3]),
    	GlobalRegistrar(_globalRegistrarAddresses[4]),
    	GlobalRegistrar(_globalRegistrarAddresses[5]),
    	GlobalRegistrar(_globalRegistrarAddresses[6]),
    	GlobalRegistrar(_globalRegistrarAddresses[7]),
    	GlobalRegistrar(_globalRegistrarAddresses[8]),
    	GlobalRegistrar(_globalRegistrarAddresses[9]),
    	GlobalRegistrar(_globalRegistrarAddresses[10]),
    	GlobalRegistrar(_globalRegistrarAddresses[11]),
    	GlobalRegistrar(_globalRegistrarAddresses[12]),
    	GlobalRegistrar(_globalRegistrarAddresses[13]),
    	GlobalRegistrar(_globalRegistrarAddresses[14]),
    	GlobalRegistrar(_globalRegistrarAddresses[15]),
    	GlobalRegistrar(_globalRegistrarAddresses[16]),
    	GlobalRegistrar(_globalRegistrarAddresses[17]),
    	GlobalRegistrar(_globalRegistrarAddresses[18])
    ];

	mapping (uint256 => address) public wrapInitializers;

    constructor() payable ERC721("GlobalRegistrarsWrapper", "GRSW") {
        _baseTokenURI = "https://d165ylpu1h6r2p.cloudfront.net/metadata/";
		_baseTokenExtension = ".json";
    }
    
    event NameReserved(address indexed claimant, uint256 indexed versionIndex, bytes32 name);
    event WrapStarted(address indexed claimant, uint256 indexed versionIndex, bytes32 name);
    event WrapFinished(address indexed claimant, uint256 indexed versionIndex, bytes32 name);
    event Unwrapped(address indexed claimant, uint256 indexed versionIndex, bytes32 name);

	event AddressSet(uint256 indexed versionIndex, bytes32 indexed name, address target, bool primary);
	event SubRegistrarSet(uint256 indexed versionIndex, bytes32 indexed name, address subRegistrar);
	event ContentSet(uint256 indexed versionIndex, bytes32 indexed name, bytes32 content);

    function reserveViaWrapper(uint256 versionIndex, bytes32 name) external {
        require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
        require(_globalRegistrars[versionIndex].owner(name) == address(0), "GRSW: That name is already taken.");
		uint256 nameUint = uint256(name);
		require(nameUint % 256 == 0, "GRSW: Name is outside scope of wrapper");
		_globalRegistrars[versionIndex].reserve(name);
        _mint(msg.sender, nameUint+versionIndex); // adds version index at beginning of hex string
        emit NameReserved(msg.sender, versionIndex, name);
    }

	function getCombinedTokenId(uint256 versionIndex, bytes32 name) external pure returns (uint256) {
        uint256 nameUint = uint256(name);
        return nameUint+versionIndex;
    }

    function getWrapInitializer(uint256 versionIndex, bytes32 name) external view returns (address) {
	    require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
        uint256 nameUint = uint256(name);
        require(nameUint % 256 == 0, "GRSW: Name is outside scope of wrapper");
		return wrapInitializers[nameUint+versionIndex];
    }
    
    function beginWrap(uint256 versionIndex, bytes32 name) external {
    	require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
        require(_globalRegistrars[versionIndex].owner(name) == msg.sender, "GRSW: You don't own the underlying token.");
        uint256 nameUint = uint256(name);
        require(nameUint % 256 == 0, "GRSW: Name is outside scope of wrapper");
		wrapInitializers[nameUint+versionIndex] = msg.sender;
      	emit WrapStarted(msg.sender, versionIndex, name);
    }
    
    // after successful beginWrap and confirmation via getWrapInitializer, send tile to wrapper via .transfer on the base contract
    
    function finishWrap(uint256 versionIndex, bytes32 name) external {
    	require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
    	uint256 nameUint = uint256(name);
    	require(wrapInitializers[nameUint+versionIndex] == msg.sender, "GRSW: You have not yet initialized this wrap with beginWrap.");
        require(_globalRegistrars[versionIndex].owner(name) == address(this), "GRSW: This wrapper must own the tile to finishWrap.");
        _mint(msg.sender, nameUint+versionIndex); // automatically checks to see if token doesn't yet exist
        require(_exists(nameUint+versionIndex), "GRSW: 721 was not created as it should have been. Reverting.");
        delete wrapInitializers[nameUint+versionIndex]; // done minting, remove from wrapInitializers array
        emit WrapFinished(msg.sender, versionIndex, name);
    }
    
	function unwrap(uint256 versionIndex, bytes32 name) external {
		require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
		uint256 nameUint = uint256(name);
		require(_exists(nameUint+versionIndex), "GRSW: That 721 does not exist");
		address owner = ERC721.ownerOf(nameUint+versionIndex);
		require(owner == msg.sender, "GRSW: You must be the 721-ownerOf the tile.");
		_globalRegistrars[versionIndex].transfer(name, msg.sender);
		_burn(nameUint+versionIndex);
		emit Unwrapped(msg.sender, versionIndex, name);
	}
    
    // disown skipped. if someone wants to disown, they can unwrap first
    
    ////////////////////
    
    function setAddressViaWrapper(uint256 versionIndex, bytes32 name, address target, bool primary) external {
        require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
		uint256 nameUint = uint256(name);
		require(_exists(nameUint+versionIndex), "GRSW: That 721 does not exist");
		address owner = ERC721.ownerOf(nameUint+versionIndex);
		require(owner == msg.sender, "GRSW: You must be the 721-ownerOf the tile.");
		_globalRegistrars[versionIndex].setAddress(name, target, primary);
		require(_globalRegistrars[versionIndex].addr(name) == target, "GRSW: address target of the underlying token didn't set. Reverting.");
		emit AddressSet(versionIndex, name, target, primary);
	}
	
    function setSubRegistrarViaWrapper(uint256 versionIndex, bytes32 name, address subRegistrar) external {
        require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
		uint256 nameUint = uint256(name);
		require(_exists(nameUint+versionIndex), "GRSW: That 721 does not exist");
		address owner = ERC721.ownerOf(nameUint+versionIndex);
		require(owner == msg.sender, "GRSW: You must be the 721-ownerOf the tile.");
		_globalRegistrars[versionIndex].setSubRegistrar(name, subRegistrar);
		require(_globalRegistrars[versionIndex].subRegistrar(name) == subRegistrar, "GRSW: subRegistrar of the underlying token didn't set. Reverting.");
		emit SubRegistrarSet(versionIndex, name, subRegistrar);
	}
	
	function setContentViaWrapper(uint256 versionIndex, bytes32 name, bytes32 content) external {
        require(versionIndex < _globalRegistrars.length, "GRSW: Invalid version index");
		uint256 nameUint = uint256(name);
		require(_exists(nameUint+versionIndex), "GRSW: That 721 does not exist");
		address owner = ERC721.ownerOf(nameUint+versionIndex);
		require(owner == msg.sender, "GRSW: You must be the 721-ownerOf the tile.");
		_globalRegistrars[versionIndex].setContent(name, content);
		require(_globalRegistrars[versionIndex].content(name) == content, "GRSW: content of the underlying token didn't set. Reverting.");
		emit ContentSet(versionIndex, name, content);
	}
   
    /**
     * @dev sets base token URI and the token extension...
     */

    string public _baseTokenURI;
    string public _baseTokenExtension; 

    function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner {
        _baseTokenURI = __baseTokenURI;
    }

    function setTokenExtension(string memory __baseTokenExtension) public onlyOwner {
        _baseTokenExtension = __baseTokenExtension;
    }    
     
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {  // complete URI = base +  token + token extension
        return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId), _baseTokenExtension));
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"primary","type":"bool"}],"name":"AddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"content","type":"bytes32"}],"name":"ContentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"NameReserved","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":"uint256","name":"versionIndex","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"address","name":"subRegistrar","type":"address"}],"name":"SubRegistrarSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"WrapFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"uint256","name":"versionIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"WrapStarted","type":"event"},{"inputs":[],"name":"_baseTokenExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_globalRegistrarAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_globalRegistrars","outputs":[{"internalType":"contract GlobalRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"beginWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"empty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"finishWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"getCombinedTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"getWrapInitializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"reserveViaWrapper","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":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"primary","type":"bool"}],"name":"setAddressViaWrapper","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":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"bytes32","name":"content","type":"bytes32"}],"name":"setContentViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"address","name":"subRegistrar","type":"address"}],"name":"setSubRegistrarViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenExtension","type":"string"}],"name":"setTokenExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"versionIndex","type":"uint256"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrapInitializers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6102e0604052735564886ca2c518d1964e5fcea4f423b41db9f5616080908152732272d8d4dec7df90a36f03eff778decc6918f1a960a05273aefd94f2b04b219ae2156b3a00a5e415bff061c060c0527332fba3c059bb9dc91227f102e708cc0255feb8ee60e05273efef5a487410f7ba8b034cdb5a08cc1e3ba89b3c61010052732ab516c9a76461f6cbe18f6a6836d05d9e02ceff6101205273822964bf8402477833837c86ccff926c169ba5506101405273f4e1aa70a22148a317d551194cbc7c92d586298f61016052733a354ac32d303bb0562842cfe2f5fb07d9ca845a610180527333990122638b9132ca29c723bdf037f1a891a70c6101a0527392c7143b1a11dc199cb0c58311f7c373955466156101c05273e121c78bd4dc097bd949ba94e2a4621c327006306101e052732b794737af0f32c30696d48563866e5e3bf7008a6102005273b829c107e7beedf9d97694860e99efa66fd2ed3a6102205273a5715a1cb7572eeaeec2855d4b85a8afec84dc286102405273205162f8a65f9dc1b9778127bf6182da40f4427661026052736b22586ab58d39e1d700cad989f9b2aae1fd863f6102805273b278f342b2cc98de7762f579a0b41dc522bf80926102a0527307408af8ca23cdd4fc7c09d47aa91bbe5a3085256102c052620001ee90600790601362000748565b50604051806102600160405280600760008154811062000212576200021262000883565b600091825260209182902001546001600160a01b03168252600780549290910191600190811062000247576200024762000883565b600091825260209182902001546001600160a01b0316825260078054929091019160029081106200027c576200027c62000883565b600091825260209182902001546001600160a01b031682526007805492909101916003908110620002b157620002b162000883565b600091825260209182902001546001600160a01b031682526007805492909101916004908110620002e657620002e662000883565b600091825260209182902001546001600160a01b0316825260078054929091019160059081106200031b576200031b62000883565b600091825260209182902001546001600160a01b03168252600780549290910191600690811062000350576200035062000883565b600091825260209182902001546001600160a01b031682526007805492909101918190811062000384576200038462000883565b600091825260209182902001546001600160a01b031682526007805492909101916008908110620003b957620003b962000883565b600091825260209182902001546001600160a01b031682526007805492909101916009908110620003ee57620003ee62000883565b600091825260209182902001546001600160a01b03168252600780549290910191600a90811062000423576200042362000883565b600091825260209182902001546001600160a01b03168252600780549290910191600b90811062000458576200045862000883565b600091825260209182902001546001600160a01b03168252600780549290910191600c9081106200048d576200048d62000883565b600091825260209182902001546001600160a01b03168252600780549290910191600d908110620004c257620004c262000883565b600091825260209182902001546001600160a01b03168252600780549290910191600e908110620004f757620004f762000883565b600091825260209182902001546001600160a01b03168252600780549290910191600f9081106200052c576200052c62000883565b600091825260209182902001546001600160a01b03168252600780549290910191601090811062000561576200056162000883565b600091825260209182902001546001600160a01b03168252600780549290910191601190811062000596576200059662000883565b600091825260209182902001546001600160a01b031682526007805492909101916012908110620005cb57620005cb62000883565b6000918252602090912001546001600160a01b03169052620005f290600890601362000748565b506040518060400160405280601781526020017f476c6f62616c5265676973747261727357726170706572000000000000000000815250604051806040016040528060048152602001634752535760e01b815250620006606200065a620006f460201b60201c565b620006f8565b815162000675906001906020850190620007b2565b5080516200068b906002906020840190620007b2565b5050506040518060600160405280602f815260200162003436602f91398051620006be91600a91602090910190620007b2565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620006ed91600b91620007b2565b5062000899565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620007a0579160200282015b82811115620007a057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000769565b50620007ae9291506200082f565b5090565b828054620007c09062000846565b90600052602060002090601f016020900481019282620007e45760008555620007a0565b82601f10620007ff57805160ff1916838001178555620007a0565b82800160010185558215620007a0579182015b82811115620007a057825182559160200191906001019062000812565b5b80821115620007ae576000815560010162000830565b600181811c908216806200085b57607f821691505b602082108114156200087d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b612b8d80620008a96000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638da5cb5b1161011a578063bc034ff0116100ad578063d94df3ab1161007c578063d94df3ab14610445578063e985e9c514610458578063ec34082614610494578063f2a75fe41461049c578063f2fde38b146104a457600080fd5b8063bc034ff014610404578063c87b56dd14610417578063cde691261461042a578063cfc86f7b1461043d57600080fd5b8063a3bf55cd116100e9578063a3bf55cd146103b8578063a973c9d1146103cb578063aaae922b146103de578063b88d4fde146103f157600080fd5b80638da5cb5b1461036357806395d89b411461037457806398caef281461037c578063a22cb465146103a557600080fd5b806342842e0e11610192578063715018a611610161578063715018a6146103225780637f5441531461032a57806382d1ba891461033d57806387126e551461035057600080fd5b806342842e0e146102c857806348c3a7f5146102db5780636352211e146102ee57806370a082311461030157600080fd5b8063095ea7b3116101ce578063095ea7b31461027c578063147c07181461028f57806323b872dd146102a257806330176e13146102b557600080fd5b8062a839b7146101ff57806301ffc9a71461021457806306fdde031461023c578063081812fc14610251575b600080fd5b61021261020d36600461269f565b6104b7565b005b6102276102223660046125a8565b610764565b60405190151581526020015b60405180910390f35b6102446107b6565b6040516102339190612849565b61026461025f36600461262b565b610848565b6040516001600160a01b039091168152602001610233565b61021261028a366004612563565b61086f565b61021261029d3660046125e2565b610985565b6102126102b036600461246d565b6109a4565b6102126102c33660046125e2565b6109d5565b6102126102d636600461246d565b6109f0565b6102126102e9366004612644565b610a0b565b6102646102fc36600461262b565b610cd7565b61031461030f3660046123f3565b610d37565b604051908152602001610233565b610212610dbd565b610314610338366004612644565b610dd1565b61021261034b366004612666565b610de6565b61021261035e366004612644565b61105c565b6000546001600160a01b0316610264565b61024461122e565b61026461038a36600461262b565b6009602052600090815260409020546001600160a01b031681565b6102126103b336600461252e565b61123d565b6102646103c636600461262b565b611248565b6102126103d9366004612644565b611272565b6102126103ec3660046126e7565b6113c7565b6102126103ff3660046124ae565b61160b565b610264610412366004612644565b611643565b61024461042536600461262b565b6116c1565b61026461043836600461262b565b6116f8565b610244611708565b610212610453366004612644565b611796565b610227610466366004612434565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102446119a2565b6102126119af565b6102126104b23660046123f3565b6119e6565b60085484106104e15760405162461bcd60e51b81526004016104d8906128f4565b60405180910390fd5b8261050c6104ef86836129fb565b6000908152600360205260409020546001600160a01b0316151590565b6105285760405162461bcd60e51b81526004016104d89061292b565b60006105376102fc87846129fb565b90506001600160a01b03811633146105615760405162461bcd60e51b81526004016104d8906129b0565b6008868154811061057457610574612b00565b60009182526020909120015460405163017d335360e71b8152600481018790526001600160a01b03868116602483015285151560448301529091169063be99a98090606401600060405180830381600087803b1580156105d357600080fd5b505af11580156105e7573d6000803e3d6000fd5b50505050836001600160a01b03166008878154811061060857610608612b00565b600091825260209091200154604051631d9dabef60e11b8152600481018890526001600160a01b0390911690633b3b57de9060240160206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d9190612417565b6001600160a01b0316146107155760405162461bcd60e51b815260206004820152604360248201527f475253573a206164647265737320746172676574206f662074686520756e646560448201527f726c79696e6720746f6b656e206469646e2774207365742e205265766572746960648201526237339760e91b608482015260a4016104d8565b604080516001600160a01b03861681528415156020820152869188917f527f057e675d88f9fc1b2394159b6f779002bd14b0a24bd0a9bd4fde17bc5bc4910160405180910390a3505050505050565b60006001600160e01b031982166380ac58cd60e01b148061079557506001600160e01b03198216635b5e139f60e01b145b806107b057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107c590612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190612a6a565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b5050505050905090565b600061085382611a5c565b506000908152600560205260409020546001600160a01b031690565b600061087a82610cd7565b9050806001600160a01b0316836001600160a01b031614156108e85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104d8565b336001600160a01b038216148061090457506109048133610466565b6109765760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104d8565b6109808383611abb565b505050565b61098d611b29565b80516109a090600b9060208401906122cf565b5050565b6109ae3382611b83565b6109ca5760405162461bcd60e51b81526004016104d890612962565b610980838383611c01565b6109dd611b29565b80516109a090600a9060208401906122cf565b6109808383836040518060200160405280600081525061160b565b6008548210610a2c5760405162461bcd60e51b81526004016104d8906128f4565b803360096000610a3c86856129fb565b81526020810191909152604001600020546001600160a01b031614610ac95760405162461bcd60e51b815260206004820152603c60248201527f475253573a20596f752068617665206e6f742079657420696e697469616c697a60448201527f656420746869732077726170207769746820626567696e577261702e0000000060648201526084016104d8565b306001600160a01b031660088481548110610ae657610ae6612b00565b6000918252602090912001546040516302571be360e01b8152600481018590526001600160a01b03909116906302571be39060240160206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190612417565b6001600160a01b031614610bdd5760405162461bcd60e51b815260206004820152603360248201527f475253573a20546869732077726170706572206d757374206f776e20746865206044820152723a34b632903a37903334b734b9b42bb930b81760691b60648201526084016104d8565b610bf033610beb85846129fb565b611d9d565b610bfd6104ef84836129fb565b610c6f5760405162461bcd60e51b815260206004820152603c60248201527f475253573a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e0000000060648201526084016104d8565b60096000610c7d85846129fb565b8152602080820192909252604090810160002080546001600160a01b031916905551838152849133917f58ba513fb6d5b9aa4fd15eef2f2e3e0ee3f21c61e7934ebf5707237ab419aeb591015b60405180910390a3505050565b6000818152600360205260408120546001600160a01b0316806107b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104d8565b60006001600160a01b038216610da15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104d8565b506001600160a01b031660009081526004602052604090205490565b610dc5611b29565b610dcf6000611edf565b565b600081610dde84826129fb565b949350505050565b6008548310610e075760405162461bcd60e51b81526004016104d8906128f4565b81610e156104ef85836129fb565b610e315760405162461bcd60e51b81526004016104d89061292b565b6000610e406102fc86846129fb565b90506001600160a01b0381163314610e6a5760405162461bcd60e51b81526004016104d8906129b0565b60088581548110610e7d57610e7d612b00565b6000918252602090912001546040516344d34e0760e11b8152600481018690526001600160a01b038581166024830152909116906389a69c0e90604401600060405180830381600087803b158015610ed457600080fd5b505af1158015610ee8573d6000803e3d6000fd5b50505050826001600160a01b031660088681548110610f0957610f09612b00565b600091825260209091200154604051635a3a05bd60e01b8152600481018790526001600160a01b0390911690635a3a05bd9060240160206040518083038186803b158015610f5657600080fd5b505afa158015610f6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8e9190612417565b6001600160a01b0316146110145760405162461bcd60e51b815260206004820152604160248201527f475253573a20737562526567697374726172206f662074686520756e6465726c60448201527f79696e6720746f6b656e206469646e2774207365742e20526576657274696e676064820152601760f91b608482015260a4016104d8565b6040516001600160a01b0384168152849086907fd68b53aa9f7195f9ce94328612dbe0b3fcd0c8f11ba1646feb320ed10645c1d1906020015b60405180910390a35050505050565b600854821061107d5760405162461bcd60e51b81526004016104d8906128f4565b336001600160a01b03166008838154811061109a5761109a612b00565b6000918252602090912001546040516302571be360e01b8152600481018490526001600160a01b03909116906302571be39060240160206040518083038186803b1580156110e757600080fd5b505afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190612417565b6001600160a01b0316146111875760405162461bcd60e51b815260206004820152602960248201527f475253573a20596f7520646f6e2774206f776e2074686520756e6465726c79696044820152683733903a37b5b2b71760b91b60648201526084016104d8565b8061119461010082612ac0565b156111b15760405162461bcd60e51b81526004016104d89061285c565b33600960006111c086856129fb565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082336001600160a01b03167f9c7ba9e292255b508436efaaa342e74e13248c46174221f59e09661593c5125b84604051610cca91815260200190565b6060600280546107c590612a6a565b6109a0338383611f2f565b6007818154811061125857600080fd5b6000918252602090912001546001600160a01b0316905081565b60085482106112935760405162461bcd60e51b81526004016104d8906128f4565b806112a16104ef84836129fb565b6112bd5760405162461bcd60e51b81526004016104d89061292b565b60006112cc6102fc85846129fb565b90506001600160a01b03811633146112f65760405162461bcd60e51b81526004016104d8906129b0565b6008848154811061130957611309612b00565b600091825260209091200154604051631e73a7eb60e21b8152600481018590523360248201526001600160a01b03909116906379ce9fac90604401600060405180830381600087803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505061138a848361138591906129fb565b611ff6565b604051838152849033907fae25f87914054656dbf8cbda9f0d5f9ea3158f579ef799e033bb26059f2a4ef09060200160405180910390a350505050565b60085483106113e85760405162461bcd60e51b81526004016104d8906128f4565b816113f66104ef85836129fb565b6114125760405162461bcd60e51b81526004016104d89061292b565b60006114216102fc86846129fb565b90506001600160a01b038116331461144b5760405162461bcd60e51b81526004016104d8906129b0565b6008858154811061145e5761145e612b00565b6000918252602090912001546040516361e80a6b60e11b815260048101869052602481018590526001600160a01b039091169063c3d014d690604401600060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b5050505082600886815481106114e0576114e0612b00565b600091825260209091200154604051632dff694160e01b8152600481018790526001600160a01b0390911690632dff69419060240160206040518083038186803b15801561152d57600080fd5b505afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611565919061258f565b146115d85760405162461bcd60e51b815260206004820152603c60248201527f475253573a20636f6e74656e74206f662074686520756e6465726c79696e672060448201527f746f6b656e206469646e2774207365742e20526576657274696e672e0000000060648201526084016104d8565b83857fc36deda630c4e49c222a9d5842f8d19b778cba66128b164e1a90563235e0cc978560405161104d91815260200190565b6116153383611b83565b6116315760405162461bcd60e51b81526004016104d890612962565b61163d84848484612091565b50505050565b60085460009083106116675760405162461bcd60e51b81526004016104d8906128f4565b8161167461010082612ac0565b156116915760405162461bcd60e51b81526004016104d89061285c565b6009600061169f86846129fb565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600a6116ce836120c4565b600b6040516020016116e2939291906127d9565b6040516020818303038152906040529050919050565b6008818154811061125857600080fd5b600a805461171590612a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461174190612a6a565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b505050505081565b60085482106117b75760405162461bcd60e51b81526004016104d8906128f4565b60006001600160a01b0316600883815481106117d5576117d5612b00565b6000918252602090912001546040516302571be360e01b8152600481018490526001600160a01b03909116906302571be39060240160206040518083038186803b15801561182257600080fd5b505afa158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190612417565b6001600160a01b0316146118ba5760405162461bcd60e51b815260206004820152602160248201527f475253573a2054686174206e616d6520697320616c72656164792074616b656e6044820152601760f91b60648201526084016104d8565b806118c761010082612ac0565b156118e45760405162461bcd60e51b81526004016104d89061285c565b600883815481106118f7576118f7612b00565b6000918252602090912001546040516310cb3b4160e21b8152600481018490526001600160a01b039091169063432ced0490602401600060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b5050505061196e338483610beb91906129fb565b604051828152839033907fa8b620fb8b3e80b25f2233ac473a799b51cef40f3dead8418441e19d238f86d290602001610cca565b600b805461171590612a6a565b6119b7611b29565b60405133904780156108fc02916000818181858888f193505050501580156119e3573d6000803e3d6000fd5b50565b6119ee611b29565b6001600160a01b038116611a535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d8565b6119e381611edf565b6000818152600360205260409020546001600160a01b03166119e35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104d8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611af082610cd7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000546001600160a01b03163314610dcf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b600080611b8f83610cd7565b9050806001600160a01b0316846001600160a01b03161480611bd657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dde5750836001600160a01b0316611bef84610848565b6001600160a01b031614949350505050565b826001600160a01b0316611c1482610cd7565b6001600160a01b031614611c785760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104d8565b6001600160a01b038216611cda5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b611ce5600082611abb565b6001600160a01b0383166000908152600460205260408120805460019290611d0e908490612a27565b90915550506001600160a01b0382166000908152600460205260408120805460019290611d3c9084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216611df35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104d8565b6000818152600360205260409020546001600160a01b031615611e585760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104d8565b6001600160a01b0382166000908152600460205260408120805460019290611e819084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611f915760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104d8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610cca565b600061200182610cd7565b905061200e600083611abb565b6001600160a01b0381166000908152600460205260408120805460019290612037908490612a27565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61209c848484611c01565b6120a8848484846121c2565b61163d5760405162461bcd60e51b81526004016104d8906128a2565b6060816120e85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561211257806120fc81612aa5565b915061210b9050600a83612a13565b91506120ec565b60008167ffffffffffffffff81111561212d5761212d612b16565b6040519080825280601f01601f191660200182016040528015612157576020820181803683370190505b5090505b8415610dde5761216c600183612a27565b9150612179600a86612ac0565b6121849060306129fb565b60f81b81838151811061219957612199612b00565b60200101906001600160f81b031916908160001a9053506121bb600a86612a13565b945061215b565b60006001600160a01b0384163b156122c457604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061220690339089908890889060040161280c565b602060405180830381600087803b15801561222057600080fd5b505af1925050508015612250575060408051601f3d908101601f1916820190925261224d918101906125c5565b60015b6122aa573d80801561227e576040519150601f19603f3d011682016040523d82523d6000602084013e612283565b606091505b5080516122a25760405162461bcd60e51b81526004016104d8906128a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dde565b506001949350505050565b8280546122db90612a6a565b90600052602060002090601f0160209004810192826122fd5760008555612343565b82601f1061231657805160ff1916838001178555612343565b82800160010185558215612343579182015b82811115612343578251825591602001919060010190612328565b5061234f929150612353565b5090565b5b8082111561234f5760008155600101612354565b600067ffffffffffffffff8084111561238357612383612b16565b604051601f8501601f19908116603f011681019082821181831017156123ab576123ab612b16565b816040528093508581528686860111156123c457600080fd5b858560208301376000602087830101525050509392505050565b803580151581146123ee57600080fd5b919050565b60006020828403121561240557600080fd5b813561241081612b2c565b9392505050565b60006020828403121561242957600080fd5b815161241081612b2c565b6000806040838503121561244757600080fd5b823561245281612b2c565b9150602083013561246281612b2c565b809150509250929050565b60008060006060848603121561248257600080fd5b833561248d81612b2c565b9250602084013561249d81612b2c565b929592945050506040919091013590565b600080600080608085870312156124c457600080fd5b84356124cf81612b2c565b935060208501356124df81612b2c565b925060408501359150606085013567ffffffffffffffff81111561250257600080fd5b8501601f8101871361251357600080fd5b61252287823560208401612368565b91505092959194509250565b6000806040838503121561254157600080fd5b823561254c81612b2c565b915061255a602084016123de565b90509250929050565b6000806040838503121561257657600080fd5b823561258181612b2c565b946020939093013593505050565b6000602082840312156125a157600080fd5b5051919050565b6000602082840312156125ba57600080fd5b813561241081612b41565b6000602082840312156125d757600080fd5b815161241081612b41565b6000602082840312156125f457600080fd5b813567ffffffffffffffff81111561260b57600080fd5b8201601f8101841361261c57600080fd5b610dde84823560208401612368565b60006020828403121561263d57600080fd5b5035919050565b6000806040838503121561265757600080fd5b50508035926020909101359150565b60008060006060848603121561267b57600080fd5b8335925060208401359150604084013561269481612b2c565b809150509250925092565b600080600080608085870312156126b557600080fd5b843593506020850135925060408501356126ce81612b2c565b91506126dc606086016123de565b905092959194509250565b6000806000606084860312156126fc57600080fd5b505081359360208301359350604090920135919050565b6000815180845261272b816020860160208601612a3e565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061275957607f831692505b602080841082141561277b57634e487b7160e01b600052602260045260246000fd5b81801561278f57600181146127a0576127cd565b60ff198616895284890196506127cd565b60008881526020902060005b868110156127c55781548b8201529085019083016127ac565b505084890196505b50505050505092915050565b60006127e5828661273f565b84516127f5818360208901612a3e565b6128018183018661273f565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061283f90830184612713565b9695505050505050565b6020815260006124106020830184612713565b60208082526026908201527f475253573a204e616d65206973206f7574736964652073636f7065206f6620776040820152653930b83832b960d11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f475253573a20496e76616c69642076657273696f6e20696e6465780000000000604082015260600190565b6020808252601d908201527f475253573a20546861742037323120646f6573206e6f74206578697374000000604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602b908201527f475253573a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b60008219821115612a0e57612a0e612ad4565b500190565b600082612a2257612a22612aea565b500490565b600082821015612a3957612a39612ad4565b500390565b60005b83811015612a59578181015183820152602001612a41565b8381111561163d5750506000910152565b600181811c90821680612a7e57607f821691505b60208210811415612a9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab957612ab9612ad4565b5060010190565b600082612acf57612acf612aea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146119e357600080fd5b6001600160e01b0319811681146119e357600080fdfea26469706673582212201177b06dcc6397eb07a40f201dafb1e3a051a294860dfddc866af90eedbf22dc64736f6c6343000807003368747470733a2f2f64313635796c70753168367232702e636c6f756466726f6e742e6e65742f6d657461646174612f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638da5cb5b1161011a578063bc034ff0116100ad578063d94df3ab1161007c578063d94df3ab14610445578063e985e9c514610458578063ec34082614610494578063f2a75fe41461049c578063f2fde38b146104a457600080fd5b8063bc034ff014610404578063c87b56dd14610417578063cde691261461042a578063cfc86f7b1461043d57600080fd5b8063a3bf55cd116100e9578063a3bf55cd146103b8578063a973c9d1146103cb578063aaae922b146103de578063b88d4fde146103f157600080fd5b80638da5cb5b1461036357806395d89b411461037457806398caef281461037c578063a22cb465146103a557600080fd5b806342842e0e11610192578063715018a611610161578063715018a6146103225780637f5441531461032a57806382d1ba891461033d57806387126e551461035057600080fd5b806342842e0e146102c857806348c3a7f5146102db5780636352211e146102ee57806370a082311461030157600080fd5b8063095ea7b3116101ce578063095ea7b31461027c578063147c07181461028f57806323b872dd146102a257806330176e13146102b557600080fd5b8062a839b7146101ff57806301ffc9a71461021457806306fdde031461023c578063081812fc14610251575b600080fd5b61021261020d36600461269f565b6104b7565b005b6102276102223660046125a8565b610764565b60405190151581526020015b60405180910390f35b6102446107b6565b6040516102339190612849565b61026461025f36600461262b565b610848565b6040516001600160a01b039091168152602001610233565b61021261028a366004612563565b61086f565b61021261029d3660046125e2565b610985565b6102126102b036600461246d565b6109a4565b6102126102c33660046125e2565b6109d5565b6102126102d636600461246d565b6109f0565b6102126102e9366004612644565b610a0b565b6102646102fc36600461262b565b610cd7565b61031461030f3660046123f3565b610d37565b604051908152602001610233565b610212610dbd565b610314610338366004612644565b610dd1565b61021261034b366004612666565b610de6565b61021261035e366004612644565b61105c565b6000546001600160a01b0316610264565b61024461122e565b61026461038a36600461262b565b6009602052600090815260409020546001600160a01b031681565b6102126103b336600461252e565b61123d565b6102646103c636600461262b565b611248565b6102126103d9366004612644565b611272565b6102126103ec3660046126e7565b6113c7565b6102126103ff3660046124ae565b61160b565b610264610412366004612644565b611643565b61024461042536600461262b565b6116c1565b61026461043836600461262b565b6116f8565b610244611708565b610212610453366004612644565b611796565b610227610466366004612434565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102446119a2565b6102126119af565b6102126104b23660046123f3565b6119e6565b60085484106104e15760405162461bcd60e51b81526004016104d8906128f4565b60405180910390fd5b8261050c6104ef86836129fb565b6000908152600360205260409020546001600160a01b0316151590565b6105285760405162461bcd60e51b81526004016104d89061292b565b60006105376102fc87846129fb565b90506001600160a01b03811633146105615760405162461bcd60e51b81526004016104d8906129b0565b6008868154811061057457610574612b00565b60009182526020909120015460405163017d335360e71b8152600481018790526001600160a01b03868116602483015285151560448301529091169063be99a98090606401600060405180830381600087803b1580156105d357600080fd5b505af11580156105e7573d6000803e3d6000fd5b50505050836001600160a01b03166008878154811061060857610608612b00565b600091825260209091200154604051631d9dabef60e11b8152600481018890526001600160a01b0390911690633b3b57de9060240160206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d9190612417565b6001600160a01b0316146107155760405162461bcd60e51b815260206004820152604360248201527f475253573a206164647265737320746172676574206f662074686520756e646560448201527f726c79696e6720746f6b656e206469646e2774207365742e205265766572746960648201526237339760e91b608482015260a4016104d8565b604080516001600160a01b03861681528415156020820152869188917f527f057e675d88f9fc1b2394159b6f779002bd14b0a24bd0a9bd4fde17bc5bc4910160405180910390a3505050505050565b60006001600160e01b031982166380ac58cd60e01b148061079557506001600160e01b03198216635b5e139f60e01b145b806107b057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107c590612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190612a6a565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b5050505050905090565b600061085382611a5c565b506000908152600560205260409020546001600160a01b031690565b600061087a82610cd7565b9050806001600160a01b0316836001600160a01b031614156108e85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104d8565b336001600160a01b038216148061090457506109048133610466565b6109765760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104d8565b6109808383611abb565b505050565b61098d611b29565b80516109a090600b9060208401906122cf565b5050565b6109ae3382611b83565b6109ca5760405162461bcd60e51b81526004016104d890612962565b610980838383611c01565b6109dd611b29565b80516109a090600a9060208401906122cf565b6109808383836040518060200160405280600081525061160b565b6008548210610a2c5760405162461bcd60e51b81526004016104d8906128f4565b803360096000610a3c86856129fb565b81526020810191909152604001600020546001600160a01b031614610ac95760405162461bcd60e51b815260206004820152603c60248201527f475253573a20596f752068617665206e6f742079657420696e697469616c697a60448201527f656420746869732077726170207769746820626567696e577261702e0000000060648201526084016104d8565b306001600160a01b031660088481548110610ae657610ae6612b00565b6000918252602090912001546040516302571be360e01b8152600481018590526001600160a01b03909116906302571be39060240160206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190612417565b6001600160a01b031614610bdd5760405162461bcd60e51b815260206004820152603360248201527f475253573a20546869732077726170706572206d757374206f776e20746865206044820152723a34b632903a37903334b734b9b42bb930b81760691b60648201526084016104d8565b610bf033610beb85846129fb565b611d9d565b610bfd6104ef84836129fb565b610c6f5760405162461bcd60e51b815260206004820152603c60248201527f475253573a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e0000000060648201526084016104d8565b60096000610c7d85846129fb565b8152602080820192909252604090810160002080546001600160a01b031916905551838152849133917f58ba513fb6d5b9aa4fd15eef2f2e3e0ee3f21c61e7934ebf5707237ab419aeb591015b60405180910390a3505050565b6000818152600360205260408120546001600160a01b0316806107b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104d8565b60006001600160a01b038216610da15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104d8565b506001600160a01b031660009081526004602052604090205490565b610dc5611b29565b610dcf6000611edf565b565b600081610dde84826129fb565b949350505050565b6008548310610e075760405162461bcd60e51b81526004016104d8906128f4565b81610e156104ef85836129fb565b610e315760405162461bcd60e51b81526004016104d89061292b565b6000610e406102fc86846129fb565b90506001600160a01b0381163314610e6a5760405162461bcd60e51b81526004016104d8906129b0565b60088581548110610e7d57610e7d612b00565b6000918252602090912001546040516344d34e0760e11b8152600481018690526001600160a01b038581166024830152909116906389a69c0e90604401600060405180830381600087803b158015610ed457600080fd5b505af1158015610ee8573d6000803e3d6000fd5b50505050826001600160a01b031660088681548110610f0957610f09612b00565b600091825260209091200154604051635a3a05bd60e01b8152600481018790526001600160a01b0390911690635a3a05bd9060240160206040518083038186803b158015610f5657600080fd5b505afa158015610f6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8e9190612417565b6001600160a01b0316146110145760405162461bcd60e51b815260206004820152604160248201527f475253573a20737562526567697374726172206f662074686520756e6465726c60448201527f79696e6720746f6b656e206469646e2774207365742e20526576657274696e676064820152601760f91b608482015260a4016104d8565b6040516001600160a01b0384168152849086907fd68b53aa9f7195f9ce94328612dbe0b3fcd0c8f11ba1646feb320ed10645c1d1906020015b60405180910390a35050505050565b600854821061107d5760405162461bcd60e51b81526004016104d8906128f4565b336001600160a01b03166008838154811061109a5761109a612b00565b6000918252602090912001546040516302571be360e01b8152600481018490526001600160a01b03909116906302571be39060240160206040518083038186803b1580156110e757600080fd5b505afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190612417565b6001600160a01b0316146111875760405162461bcd60e51b815260206004820152602960248201527f475253573a20596f7520646f6e2774206f776e2074686520756e6465726c79696044820152683733903a37b5b2b71760b91b60648201526084016104d8565b8061119461010082612ac0565b156111b15760405162461bcd60e51b81526004016104d89061285c565b33600960006111c086856129fb565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082336001600160a01b03167f9c7ba9e292255b508436efaaa342e74e13248c46174221f59e09661593c5125b84604051610cca91815260200190565b6060600280546107c590612a6a565b6109a0338383611f2f565b6007818154811061125857600080fd5b6000918252602090912001546001600160a01b0316905081565b60085482106112935760405162461bcd60e51b81526004016104d8906128f4565b806112a16104ef84836129fb565b6112bd5760405162461bcd60e51b81526004016104d89061292b565b60006112cc6102fc85846129fb565b90506001600160a01b03811633146112f65760405162461bcd60e51b81526004016104d8906129b0565b6008848154811061130957611309612b00565b600091825260209091200154604051631e73a7eb60e21b8152600481018590523360248201526001600160a01b03909116906379ce9fac90604401600060405180830381600087803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505061138a848361138591906129fb565b611ff6565b604051838152849033907fae25f87914054656dbf8cbda9f0d5f9ea3158f579ef799e033bb26059f2a4ef09060200160405180910390a350505050565b60085483106113e85760405162461bcd60e51b81526004016104d8906128f4565b816113f66104ef85836129fb565b6114125760405162461bcd60e51b81526004016104d89061292b565b60006114216102fc86846129fb565b90506001600160a01b038116331461144b5760405162461bcd60e51b81526004016104d8906129b0565b6008858154811061145e5761145e612b00565b6000918252602090912001546040516361e80a6b60e11b815260048101869052602481018590526001600160a01b039091169063c3d014d690604401600060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b5050505082600886815481106114e0576114e0612b00565b600091825260209091200154604051632dff694160e01b8152600481018790526001600160a01b0390911690632dff69419060240160206040518083038186803b15801561152d57600080fd5b505afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611565919061258f565b146115d85760405162461bcd60e51b815260206004820152603c60248201527f475253573a20636f6e74656e74206f662074686520756e6465726c79696e672060448201527f746f6b656e206469646e2774207365742e20526576657274696e672e0000000060648201526084016104d8565b83857fc36deda630c4e49c222a9d5842f8d19b778cba66128b164e1a90563235e0cc978560405161104d91815260200190565b6116153383611b83565b6116315760405162461bcd60e51b81526004016104d890612962565b61163d84848484612091565b50505050565b60085460009083106116675760405162461bcd60e51b81526004016104d8906128f4565b8161167461010082612ac0565b156116915760405162461bcd60e51b81526004016104d89061285c565b6009600061169f86846129fb565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600a6116ce836120c4565b600b6040516020016116e2939291906127d9565b6040516020818303038152906040529050919050565b6008818154811061125857600080fd5b600a805461171590612a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461174190612a6a565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b505050505081565b60085482106117b75760405162461bcd60e51b81526004016104d8906128f4565b60006001600160a01b0316600883815481106117d5576117d5612b00565b6000918252602090912001546040516302571be360e01b8152600481018490526001600160a01b03909116906302571be39060240160206040518083038186803b15801561182257600080fd5b505afa158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190612417565b6001600160a01b0316146118ba5760405162461bcd60e51b815260206004820152602160248201527f475253573a2054686174206e616d6520697320616c72656164792074616b656e6044820152601760f91b60648201526084016104d8565b806118c761010082612ac0565b156118e45760405162461bcd60e51b81526004016104d89061285c565b600883815481106118f7576118f7612b00565b6000918252602090912001546040516310cb3b4160e21b8152600481018490526001600160a01b039091169063432ced0490602401600060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b5050505061196e338483610beb91906129fb565b604051828152839033907fa8b620fb8b3e80b25f2233ac473a799b51cef40f3dead8418441e19d238f86d290602001610cca565b600b805461171590612a6a565b6119b7611b29565b60405133904780156108fc02916000818181858888f193505050501580156119e3573d6000803e3d6000fd5b50565b6119ee611b29565b6001600160a01b038116611a535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d8565b6119e381611edf565b6000818152600360205260409020546001600160a01b03166119e35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104d8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611af082610cd7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000546001600160a01b03163314610dcf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b600080611b8f83610cd7565b9050806001600160a01b0316846001600160a01b03161480611bd657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dde5750836001600160a01b0316611bef84610848565b6001600160a01b031614949350505050565b826001600160a01b0316611c1482610cd7565b6001600160a01b031614611c785760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104d8565b6001600160a01b038216611cda5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b611ce5600082611abb565b6001600160a01b0383166000908152600460205260408120805460019290611d0e908490612a27565b90915550506001600160a01b0382166000908152600460205260408120805460019290611d3c9084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216611df35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104d8565b6000818152600360205260409020546001600160a01b031615611e585760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104d8565b6001600160a01b0382166000908152600460205260408120805460019290611e819084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611f915760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104d8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610cca565b600061200182610cd7565b905061200e600083611abb565b6001600160a01b0381166000908152600460205260408120805460019290612037908490612a27565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61209c848484611c01565b6120a8848484846121c2565b61163d5760405162461bcd60e51b81526004016104d8906128a2565b6060816120e85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561211257806120fc81612aa5565b915061210b9050600a83612a13565b91506120ec565b60008167ffffffffffffffff81111561212d5761212d612b16565b6040519080825280601f01601f191660200182016040528015612157576020820181803683370190505b5090505b8415610dde5761216c600183612a27565b9150612179600a86612ac0565b6121849060306129fb565b60f81b81838151811061219957612199612b00565b60200101906001600160f81b031916908160001a9053506121bb600a86612a13565b945061215b565b60006001600160a01b0384163b156122c457604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061220690339089908890889060040161280c565b602060405180830381600087803b15801561222057600080fd5b505af1925050508015612250575060408051601f3d908101601f1916820190925261224d918101906125c5565b60015b6122aa573d80801561227e576040519150601f19603f3d011682016040523d82523d6000602084013e612283565b606091505b5080516122a25760405162461bcd60e51b81526004016104d8906128a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dde565b506001949350505050565b8280546122db90612a6a565b90600052602060002090601f0160209004810192826122fd5760008555612343565b82601f1061231657805160ff1916838001178555612343565b82800160010185558215612343579182015b82811115612343578251825591602001919060010190612328565b5061234f929150612353565b5090565b5b8082111561234f5760008155600101612354565b600067ffffffffffffffff8084111561238357612383612b16565b604051601f8501601f19908116603f011681019082821181831017156123ab576123ab612b16565b816040528093508581528686860111156123c457600080fd5b858560208301376000602087830101525050509392505050565b803580151581146123ee57600080fd5b919050565b60006020828403121561240557600080fd5b813561241081612b2c565b9392505050565b60006020828403121561242957600080fd5b815161241081612b2c565b6000806040838503121561244757600080fd5b823561245281612b2c565b9150602083013561246281612b2c565b809150509250929050565b60008060006060848603121561248257600080fd5b833561248d81612b2c565b9250602084013561249d81612b2c565b929592945050506040919091013590565b600080600080608085870312156124c457600080fd5b84356124cf81612b2c565b935060208501356124df81612b2c565b925060408501359150606085013567ffffffffffffffff81111561250257600080fd5b8501601f8101871361251357600080fd5b61252287823560208401612368565b91505092959194509250565b6000806040838503121561254157600080fd5b823561254c81612b2c565b915061255a602084016123de565b90509250929050565b6000806040838503121561257657600080fd5b823561258181612b2c565b946020939093013593505050565b6000602082840312156125a157600080fd5b5051919050565b6000602082840312156125ba57600080fd5b813561241081612b41565b6000602082840312156125d757600080fd5b815161241081612b41565b6000602082840312156125f457600080fd5b813567ffffffffffffffff81111561260b57600080fd5b8201601f8101841361261c57600080fd5b610dde84823560208401612368565b60006020828403121561263d57600080fd5b5035919050565b6000806040838503121561265757600080fd5b50508035926020909101359150565b60008060006060848603121561267b57600080fd5b8335925060208401359150604084013561269481612b2c565b809150509250925092565b600080600080608085870312156126b557600080fd5b843593506020850135925060408501356126ce81612b2c565b91506126dc606086016123de565b905092959194509250565b6000806000606084860312156126fc57600080fd5b505081359360208301359350604090920135919050565b6000815180845261272b816020860160208601612a3e565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061275957607f831692505b602080841082141561277b57634e487b7160e01b600052602260045260246000fd5b81801561278f57600181146127a0576127cd565b60ff198616895284890196506127cd565b60008881526020902060005b868110156127c55781548b8201529085019083016127ac565b505084890196505b50505050505092915050565b60006127e5828661273f565b84516127f5818360208901612a3e565b6128018183018661273f565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061283f90830184612713565b9695505050505050565b6020815260006124106020830184612713565b60208082526026908201527f475253573a204e616d65206973206f7574736964652073636f7065206f6620776040820152653930b83832b960d11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f475253573a20496e76616c69642076657273696f6e20696e6465780000000000604082015260600190565b6020808252601d908201527f475253573a20546861742037323120646f6573206e6f74206578697374000000604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602b908201527f475253573a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b60008219821115612a0e57612a0e612ad4565b500190565b600082612a2257612a22612aea565b500490565b600082821015612a3957612a39612ad4565b500390565b60005b83811015612a59578181015183820152602001612a41565b8381111561163d5750506000910152565b600181811c90821680612a7e57607f821691505b60208210811415612a9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab957612ab9612ad4565b5060010190565b600082612acf57612acf612aea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146119e357600080fd5b6001600160e01b0319811681146119e357600080fdfea26469706673582212201177b06dcc6397eb07a40f201dafb1e3a051a294860dfddc866af90eedbf22dc64736f6c63430008070033

Deployed Bytecode Sourcemap

39838:10094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46964:716;;;;;;:::i;:::-;;:::i;:::-;;24737:305;;;;;;:::i;:::-;;:::i;:::-;;;9224:14:1;;9217:22;9199:41;;9187:2;9172:18;24737:305:0;;;;;;;;25664:100;;;:::i;:::-;;;;;;;:::i;27177:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8233:32:1;;;8215:51;;8203:2;8188:18;27177:171:0;8069:203:1;26694:417:0;;;;;;:::i;:::-;;:::i;49405:141::-;;;;;;:::i;:::-;;:::i;27877:336::-;;;;;;:::i;:::-;;:::i;49276:121::-;;;;;;:::i;:::-;;:::i;28284:185::-;;;;;;:::i;:::-;;:::i;45421:861::-;;;;;;:::i;:::-;;:::i;25375:222::-;;;;;;:::i;:::-;;:::i;25106:207::-;;;;;;:::i;:::-;;:::i;:::-;;;9397:25:1;;;9385:2;9370:18;25106:207:0;9251:177:1;5273:103:0;;;:::i;44179:186::-;;;;;;:::i;:::-;;:::i;47689:729::-;;;;;;:::i;:::-;;:::i;44751:520::-;;;;;;:::i;:::-;;:::i;4625:87::-;4671:7;4698:6;-1:-1:-1;;;;;4698:6:0;4625:87;;25833:104;;;:::i;42643:52::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;42643:52:0;;;27420:155;;;;;;:::i;:::-;;:::i;39899:1657::-;;;;;;:::i;:::-;;:::i;46291:549::-;;;;;;:::i;:::-;;:::i;48424:684::-;;;;;;:::i;:::-;;:::i;28540:323::-;;;;;;:::i;:::-;;:::i;44373:366::-;;;;;;:::i;:::-;;:::i;49563:246::-;;;;;;:::i;:::-;;:::i;41569:1068::-;;;;;;:::i;:::-;;:::i;49199:27::-;;;:::i;43568:606::-;;;;;;:::i;:::-;;:::i;27646:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;27767:25:0;;;27743:4;27767:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27646:164;49233:33;;;:::i;49817:112::-;;;:::i;5531:201::-;;;;;;:::i;:::-;;:::i;46964:716::-;47103:17;:24;47088:39;;47080:79;;;;-1:-1:-1;;;47080:79:0;;;;;;;:::i;:::-;;;;;;;;;47191:4;47209:30;47217:21;47226:12;47191:4;47217:21;:::i;:::-;30435:4;30459:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30459:16:0;:30;;;30370:127;47209:30;47201:72;;;;-1:-1:-1;;;47201:72:0;;;;;;;:::i;:::-;47278:13;47294:37;47309:21;47318:12;47309:8;:21;:::i;47294:37::-;47278:53;-1:-1:-1;;;;;;47344:19:0;;47353:10;47344:19;47336:75;;;;-1:-1:-1;;;47336:75:0;;;;;;;:::i;:::-;47416:17;47434:12;47416:31;;;;;;;;:::i;:::-;;;;;;;;;;;:65;;-1:-1:-1;;;47416:65:0;;;;;9908:25:1;;;-1:-1:-1;;;;;9969:32:1;;;9949:18;;;9942:60;10045:14;;10038:22;10018:18;;;10011:50;47416:31:0;;;;:42;;9881:18:1;;47416:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47540:6;-1:-1:-1;;;;;47494:52:0;:17;47512:12;47494:31;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;-1:-1:-1;;;47494:42:0;;;;;9397:25:1;;;-1:-1:-1;;;;;47494:31:0;;;;:36;;9370:18:1;;47494:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47494:52:0;;47486:132;;;;-1:-1:-1;;;47486:132:0;;19289:2:1;47486:132:0;;;19271:21:1;19328:2;19308:18;;;19301:30;19367:34;19347:18;;;19340:62;19438:34;19418:18;;;19411:62;-1:-1:-1;;;19489:19:1;;;19482:34;19533:19;;47486:132:0;19087:471:1;47486:132:0;47628:47;;;-1:-1:-1;;;;;8956:32:1;;8938:51;;9032:14;;9025:22;9020:2;9005:18;;8998:50;47653:4:0;;47639:12;;47628:47;;8911:18:1;47628:47:0;;;;;;;47069:611;;46964:716;;;;:::o;24737:305::-;24839:4;-1:-1:-1;;;;;;24876:40:0;;-1:-1:-1;;;24876:40:0;;:105;;-1:-1:-1;;;;;;;24933:48:0;;-1:-1:-1;;;24933:48:0;24876:105;:158;;;-1:-1:-1;;;;;;;;;;17588:40:0;;;24998:36;24856:178;24737:305;-1:-1:-1;;24737:305:0:o;25664:100::-;25718:13;25751:5;25744:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25664:100;:::o;27177:171::-;27253:7;27273:23;27288:7;27273:14;:23::i;:::-;-1:-1:-1;27316:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27316:24:0;;27177:171::o;26694:417::-;26775:13;26791:23;26806:7;26791:14;:23::i;:::-;26775:39;;26839:5;-1:-1:-1;;;;;26833:11:0;:2;-1:-1:-1;;;;;26833:11:0;;;26825:57;;;;-1:-1:-1;;;26825:57:0;;18458:2:1;26825:57:0;;;18440:21:1;18497:2;18477:18;;;18470:30;18536:34;18516:18;;;18509:62;-1:-1:-1;;;18587:18:1;;;18580:31;18628:19;;26825:57:0;18256:397:1;26825:57:0;3256:10;-1:-1:-1;;;;;26917:21:0;;;;:62;;-1:-1:-1;26942:37:0;26959:5;3256:10;27646:164;:::i;26942:37::-;26895:174;;;;-1:-1:-1;;;26895:174:0;;15745:2:1;26895:174:0;;;15727:21:1;15784:2;15764:18;;;15757:30;15823:34;15803:18;;;15796:62;15894:32;15874:18;;;15867:60;15944:19;;26895:174:0;15543:426:1;26895:174:0;27082:21;27091:2;27095:7;27082:8;:21::i;:::-;26764:347;26694:417;;:::o;49405:141::-;4511:13;:11;:13::i;:::-;49496:42;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49405:141:::0;:::o;27877:336::-;28072:41;3256:10;28105:7;28072:18;:41::i;:::-;28064:100;;;;-1:-1:-1;;;28064:100:0;;;;;;;:::i;:::-;28177:28;28187:4;28193:2;28197:7;28177:9;:28::i;49276:121::-;4511:13;:11;:13::i;:::-;49359:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;28284:185::-:0;28422:39;28439:4;28445:2;28449:7;28422:39;;;;;;;;;;;;:16;:39::i;45421:861::-;45517:17;:24;45502:39;;45494:79;;;;-1:-1:-1;;;45494:79:0;;;;;;;:::i;:::-;45608:4;45672:10;45629:16;45581;45646:21;45655:12;45608:4;45646:21;:::i;:::-;45629:39;;;;;;;;;;;-1:-1:-1;45629:39:0;;-1:-1:-1;;;;;45629:39:0;:53;45621:126;;;;-1:-1:-1;;;45621:126:0;;18860:2:1;45621:126:0;;;18842:21:1;18899:2;18879:18;;;18872:30;18938:34;18918:18;;;18911:62;19009:30;18989:18;;;18982:58;19057:19;;45621:126:0;18658:424:1;45621:126:0;45821:4;-1:-1:-1;;;;;45766:60:0;:17;45784:12;45766:31;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;-1:-1:-1;;;45766:43:0;;;;;9397:25:1;;;-1:-1:-1;;;;;45766:31:0;;;;:37;;9370:18:1;;45766:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45766:60:0;;45758:124;;;;-1:-1:-1;;;45758:124:0;;16895:2:1;45758:124:0;;;16877:21:1;16934:2;16914:18;;;16907:30;16973:34;16953:18;;;16946:62;-1:-1:-1;;;17024:18:1;;;17017:49;17083:19;;45758:124:0;16693:415:1;45758:124:0;45893:40;45899:10;45911:21;45920:12;45911:8;:21;:::i;:::-;45893:5;:40::i;:::-;46010:30;46018:21;46027:12;46018:8;:21;:::i;46010:30::-;46002:103;;;;-1:-1:-1;;;46002:103:0;;17676:2:1;46002:103:0;;;17658:21:1;17715:2;17695:18;;;17688:30;17754:34;17734:18;;;17727:62;17825:30;17805:18;;;17798:58;17873:19;;46002:103:0;17474:424:1;46002:103:0;46123:16;:39;46140:21;46149:12;46140:8;:21;:::i;:::-;46123:39;;;;;;;;;;;;;;-1:-1:-1;46123:39:0;46116:46;;-1:-1:-1;;;;;;46116:46:0;;;46230:44;9397:25:1;;;46255:12:0;;46243:10;;46230:44;;9370:18:1;46230:44:0;;;;;;;;45486:796;45421:861;;:::o;25375:222::-;25447:7;25483:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25483:16:0;25518:19;25510:56;;;;-1:-1:-1;;;25510:56:0;;18105:2:1;25510:56:0;;;18087:21:1;18144:2;18124:18;;;18117:30;-1:-1:-1;;;18163:18:1;;;18156:54;18227:18;;25510:56:0;17903:348:1;25106:207:0;25178:7;-1:-1:-1;;;;;25206:19:0;;25198:73;;;;-1:-1:-1;;;25198:73:0;;14925:2:1;25198:73:0;;;14907:21:1;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;-1:-1:-1;;;15054:18:1;;;15047:39;15103:19;;25198:73:0;14723:405:1;25198:73:0;-1:-1:-1;;;;;;25289:16:0;;;;;:9;:16;;;;;;;25106:207::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;44179:186::-;44266:7;44313:4;44336:21;44345:12;44313:4;44336:21;:::i;:::-;44329:28;44179:186;-1:-1:-1;;;;44179:186:0:o;47689:729::-;47825:17;:24;47810:39;;47802:79;;;;-1:-1:-1;;;47802:79:0;;;;;;;:::i;:::-;47913:4;47931:30;47939:21;47948:12;47913:4;47939:21;:::i;47931:30::-;47923:72;;;;-1:-1:-1;;;47923:72:0;;;;;;;:::i;:::-;48000:13;48016:37;48031:21;48040:12;48031:8;:21;:::i;48016:37::-;48000:53;-1:-1:-1;;;;;;48066:19:0;;48075:10;48066:19;48058:75;;;;-1:-1:-1;;;48058:75:0;;;;;;;:::i;:::-;48138:17;48156:12;48138:31;;;;;;;;:::i;:::-;;;;;;;;;;;:67;;-1:-1:-1;;;48138:67:0;;;;;9607:25:1;;;-1:-1:-1;;;;;9668:32:1;;;9648:18;;;9641:60;48138:31:0;;;;:47;;9580:18:1;;48138:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48272:12;-1:-1:-1;;;;;48218:66:0;:17;48236:12;48218:31;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;-1:-1:-1;;;48218:50:0;;;;;9397:25:1;;;-1:-1:-1;;;;;48218:31:0;;;;:44;;9370:18:1;;48218:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48218:66:0;;48210:144;;;;-1:-1:-1;;;48210:144:0;;19765:2:1;48210:144:0;;;19747:21:1;19804:2;19784:18;;;19777:30;19843:34;19823:18;;;19816:62;19914:34;19894:18;;;19887:62;-1:-1:-1;;;19965:19:1;;;19958:32;20007:19;;48210:144:0;19563:469:1;48210:144:0;48364:49;;-1:-1:-1;;;;;8233:32:1;;8215:51;;48394:4:0;;48380:12;;48364:49;;8203:2:1;8188:18;48364:49:0;;;;;;;;47791:627;;47689:729;;;:::o;44751:520::-;44846:17;:24;44831:39;;44823:79;;;;-1:-1:-1;;;44823:79:0;;;;;;;:::i;:::-;44968:10;-1:-1:-1;;;;;44921:57:0;:17;44939:12;44921:31;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;-1:-1:-1;;;44921:43:0;;;;;9397:25:1;;;-1:-1:-1;;;;;44921:31:0;;;;:37;;9370:18:1;;44921:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44921:57:0;;44913:111;;;;-1:-1:-1;;;44913:111:0;;15335:2:1;44913:111:0;;;15317:21:1;15374:2;15354:18;;;15347:30;15413:34;15393:18;;;15386:62;-1:-1:-1;;;15464:18:1;;;15457:39;15513:19;;44913:111:0;15133:405:1;44913:111:0;45062:4;45086:14;45097:3;45062:4;45086:14;:::i;:::-;:19;45078:70;;;;-1:-1:-1;;;45078:70:0;;;;;;;:::i;:::-;45195:10;45153:16;:39;45170:21;45179:12;45170:8;:21;:::i;:::-;45153:39;;;;;;;;;;;;:52;;;;;-1:-1:-1;;;;;45153:52:0;;;;;-1:-1:-1;;;;;45153:52:0;;;;;;45244:12;45232:10;-1:-1:-1;;;;;45220:43:0;;45258:4;45220:43;;;;9397:25:1;;9385:2;9370:18;;9251:177;25833:104:0;25889:13;25922:7;25915:14;;;;;:::i;27420:155::-;27515:52;3256:10;27548:8;27558;27515:18;:52::i;39899:1657::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39899:1657:0;;-1:-1:-1;39899:1657:0;:::o;46291:549::-;46380:17;:24;46365:39;;46357:79;;;;-1:-1:-1;;;46357:79:0;;;;;;;:::i;:::-;46468:4;46486:30;46494:21;46503:12;46468:4;46494:21;:::i;46486:30::-;46478:72;;;;-1:-1:-1;;;46478:72:0;;;;;;;:::i;:::-;46555:13;46571:37;46586:21;46595:12;46586:8;:21;:::i;46571:37::-;46555:53;-1:-1:-1;;;;;;46621:19:0;;46630:10;46621:19;46613:75;;;;-1:-1:-1;;;46613:75:0;;;;;;;:::i;:::-;46693:17;46711:12;46693:31;;;;;;;;:::i;:::-;;;;;;;;;;;:58;;-1:-1:-1;;;46693:58:0;;;;;9607:25:1;;;46740:10:0;9648:18:1;;;9641:60;-1:-1:-1;;;;;46693:31:0;;;;:40;;9580:18:1;;46693:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46756:28;46771:12;46762:8;:21;;;;:::i;:::-;46756:5;:28::i;:::-;46794:41;;9397:25:1;;;46816:12:0;;46804:10;;46794:41;;9385:2:1;9370:18;46794:41:0;;;;;;;46352:488;;46291:549;;:::o;48424:684::-;48550:17;:24;48535:39;;48527:79;;;;-1:-1:-1;;;48527:79:0;;;;;;;:::i;:::-;48638:4;48656:30;48664:21;48673:12;48638:4;48664:21;:::i;48656:30::-;48648:72;;;;-1:-1:-1;;;48648:72:0;;;;;;;:::i;:::-;48725:13;48741:37;48756:21;48765:12;48756:8;:21;:::i;48741:37::-;48725:53;-1:-1:-1;;;;;;48791:19:0;;48800:10;48791:19;48783:75;;;;-1:-1:-1;;;48783:75:0;;;;;;;:::i;:::-;48863:17;48881:12;48863:31;;;;;;;;:::i;:::-;;;;;;;;;;;:57;;-1:-1:-1;;;48863:57:0;;;;;10246:25:1;;;10287:18;;;10280:34;;;-1:-1:-1;;;;;48863:31:0;;;;:42;;10219:18:1;;48863:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48982:7;48933:17;48951:12;48933:31;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;-1:-1:-1;;;48933:45:0;;;;;9397:25:1;;;-1:-1:-1;;;;;48933:31:0;;;;:39;;9370:18:1;;48933:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;48925:129;;;;-1:-1:-1;;;48925:129:0;;10983:2:1;48925:129:0;;;10965:21:1;11022:2;11002:18;;;10995:30;11061:34;11041:18;;;11034:62;11132:30;11112:18;;;11105:58;11180:19;;48925:129:0;10781:424:1;48925:129:0;49089:4;49075:12;49064:39;49095:7;49064:39;;;;9397:25:1;;9385:2;9370:18;;9251:177;28540:323:0;28714:41;3256:10;28747:7;28714:18;:41::i;:::-;28706:100;;;;-1:-1:-1;;;28706:100:0;;;;;;;:::i;:::-;28817:38;28831:4;28837:2;28841:7;28850:4;28817:13;:38::i;:::-;28540:323;;;;:::o;44373:366::-;44500:17;:24;44460:7;;44485:39;;44477:79;;;;-1:-1:-1;;;44477:79:0;;;;;;;:::i;:::-;44594:4;44618:14;44629:3;44594:4;44618:14;:::i;:::-;:19;44610:70;;;;-1:-1:-1;;;44610:70:0;;;;;;;:::i;:::-;44692:16;:39;44709:21;44718:12;44709:8;:21;:::i;:::-;44692:39;;;;;;;;;;;-1:-1:-1;44692:39:0;;-1:-1:-1;;;;;44692:39:0;;44373:366;-1:-1:-1;;;;44373:366:0:o;49563:246::-;49629:13;49737;49752:26;49769:8;49752:16;:26::i;:::-;49780:19;49720:80;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49706:95;;49563:246;;;:::o;41569:1068::-;;;;;;;;;;;;49199:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43568:606::-;43674:17;:24;43659:39;;43651:79;;;;-1:-1:-1;;;43651:79:0;;;;;;;:::i;:::-;43804:1;-1:-1:-1;;;;;43749:57:0;:17;43767:12;43749:31;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;-1:-1:-1;;;43749:43:0;;;;;9397:25:1;;;-1:-1:-1;;;;;43749:31:0;;;;:37;;9370:18:1;;43749:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43749:57:0;;43741:103;;;;-1:-1:-1;;;43741:103:0;;12238:2:1;43741:103:0;;;12220:21:1;12277:2;12257:18;;;12250:30;12316:34;12296:18;;;12289:62;-1:-1:-1;;;12367:18:1;;;12360:31;12408:19;;43741:103:0;12036:397:1;43741:103:0;43876:4;43894:14;43905:3;43876:4;43894:14;:::i;:::-;:19;43886:70;;;;-1:-1:-1;;;43886:70:0;;;;;;;:::i;:::-;43961:17;43979:12;43961:31;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;-1:-1:-1;;;43961:45:0;;;;;9397:25:1;;;-1:-1:-1;;;;;43961:31:0;;;;:39;;9370:18:1;;43961:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44017:40;44023:10;44044:12;44035:8;:21;;;;:::i;44017:40::-;44122:44;;9397:25:1;;;44147:12:0;;44135:10;;44122:44;;9385:2:1;9370:18;44122:44:0;9251:177:1;49233:33:0;;;;;;;:::i;49817:112::-;4511:13;:11;:13::i;:::-;49869:51:::1;::::0;49877:10:::1;::::0;49898:21:::1;49869:51:::0;::::1;;;::::0;::::1;::::0;;;49898:21;49877:10;49869:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49817:112::o:0;5531:201::-;4511:13;:11;:13::i;:::-;-1:-1:-1;;;;;5620:22:0;::::1;5612:73;;;::::0;-1:-1:-1;;;5612:73:0;;12640:2:1;5612:73:0::1;::::0;::::1;12622:21:1::0;12679:2;12659:18;;;12652:30;12718:34;12698:18;;;12691:62;-1:-1:-1;;;12769:18:1;;;12762:36;12815:19;;5612:73:0::1;12438:402:1::0;5612:73:0::1;5696:28;5715:8;5696:18;:28::i;35152:135::-:0;30435:4;30459:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30459:16:0;35226:53;;;;-1:-1:-1;;;35226:53:0;;18105:2:1;35226:53:0;;;18087:21:1;18144:2;18124:18;;;18117:30;-1:-1:-1;;;18163:18:1;;;18156:54;18227:18;;35226:53:0;17903:348:1;34431:174:0;34506:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34506:29:0;-1:-1:-1;;;;;34506:29:0;;;;;;;;:24;;34560:23;34506:24;34560:14;:23::i;:::-;-1:-1:-1;;;;;34551:46:0;;;;;;;;;;;34431:174;;:::o;4790:132::-;4671:7;4698:6;-1:-1:-1;;;;;4698:6:0;3256:10;4854:23;4846:68;;;;-1:-1:-1;;;4846:68:0;;17315:2:1;4846:68:0;;;17297:21:1;;;17334:18;;;17327:30;17393:34;17373:18;;;17366:62;17445:18;;4846:68:0;17113:356:1;30664:264:0;30757:4;30774:13;30790:23;30805:7;30790:14;:23::i;:::-;30774:39;;30843:5;-1:-1:-1;;;;;30832:16:0;:7;-1:-1:-1;;;;;30832:16:0;;:52;;;-1:-1:-1;;;;;;27767:25:0;;;27743:4;27767:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30852:32;30832:87;;;;30912:7;-1:-1:-1;;;;;30888:31:0;:20;30900:7;30888:11;:20::i;:::-;-1:-1:-1;;;;;30888:31:0;;;30664:264;-1:-1:-1;;;;30664:264:0:o;33687:625::-;33846:4;-1:-1:-1;;;;;33819:31:0;:23;33834:7;33819:14;:23::i;:::-;-1:-1:-1;;;;;33819:31:0;;33811:81;;;;-1:-1:-1;;;33811:81:0;;13047:2:1;33811:81:0;;;13029:21:1;13086:2;13066:18;;;13059:30;13125:34;13105:18;;;13098:62;-1:-1:-1;;;13176:18:1;;;13169:35;13221:19;;33811:81:0;12845:401:1;33811:81:0;-1:-1:-1;;;;;33911:16:0;;33903:65;;;;-1:-1:-1;;;33903:65:0;;14166:2:1;33903:65:0;;;14148:21:1;14205:2;14185:18;;;14178:30;14244:34;14224:18;;;14217:62;-1:-1:-1;;;14295:18:1;;;14288:34;14339:19;;33903:65:0;13964:400:1;33903:65:0;34085:29;34102:1;34106:7;34085:8;:29::i;:::-;-1:-1:-1;;;;;34127:15:0;;;;;;:9;:15;;;;;:20;;34146:1;;34127:15;:20;;34146:1;;34127:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34158:13:0;;;;;;:9;:13;;;;;:18;;34175:1;;34158:13;:18;;34175:1;;34158:18;:::i;:::-;;;;-1:-1:-1;;34187:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34187:21:0;-1:-1:-1;;;;;34187:21:0;;;;;;;;;34226:27;;34187:16;;34226:27;;;;;;;26764:347;26694:417;;:::o;32262:439::-;-1:-1:-1;;;;;32342:16:0;;32334:61;;;;-1:-1:-1;;;32334:61:0;;16176:2:1;32334:61:0;;;16158:21:1;;;16195:18;;;16188:30;16254:34;16234:18;;;16227:62;16306:18;;32334:61:0;15974:356:1;32334:61:0;30435:4;30459:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30459:16:0;:30;32406:58;;;;-1:-1:-1;;;32406:58:0;;13809:2:1;32406:58:0;;;13791:21:1;13848:2;13828:18;;;13821:30;13887;13867:18;;;13860:58;13935:18;;32406:58:0;13607:352:1;32406:58:0;-1:-1:-1;;;;;32535:13:0;;;;;;:9;:13;;;;;:18;;32552:1;;32535:13;:18;;32552:1;;32535:18;:::i;:::-;;;;-1:-1:-1;;32564:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32564:21:0;-1:-1:-1;;;;;32564:21:0;;;;;;;;32603:33;;32564:16;;;32603:33;;32564:16;;32603:33;49496:42:::1;49405:141:::0;:::o;5892:191::-;5966:16;5985:6;;-1:-1:-1;;;;;6002:17:0;;;-1:-1:-1;;;;;;6002:17:0;;;;;;6035:40;;5985:6;;;;;;;6035:40;;5966:16;6035:40;5955:128;5892:191;:::o;34748:315::-;34903:8;-1:-1:-1;;;;;34894:17:0;:5;-1:-1:-1;;;;;34894:17:0;;;34886:55;;;;-1:-1:-1;;;34886:55:0;;14571:2:1;34886:55:0;;;14553:21:1;14610:2;14590:18;;;14583:30;14649:27;14629:18;;;14622:55;14694:18;;34886:55:0;14369:349:1;34886:55:0;-1:-1:-1;;;;;34952:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34952:46:0;;;;;;;;;;35014:41;;9199::1;;;35014::0;;9172:18:1;35014:41:0;9059:187:1;32930:420:0;32990:13;33006:23;33021:7;33006:14;:23::i;:::-;32990:39;;33131:29;33148:1;33152:7;33131:8;:29::i;:::-;-1:-1:-1;;;;;33173:16:0;;;;;;:9;:16;;;;;:21;;33193:1;;33173:16;:21;;33193:1;;33173:21;:::i;:::-;;;;-1:-1:-1;;33212:16:0;;;;:7;:16;;;;;;33205:23;;-1:-1:-1;;;;;;33205:23:0;;;33246:36;33220:7;;33212:16;-1:-1:-1;;;;;33246:36:0;;;;;33212:16;;33246:36;49496:42:::1;49405:141:::0;:::o;29744:313::-;29900:28;29910:4;29916:2;29920:7;29900:9;:28::i;:::-;29947:47;29970:4;29976:2;29980:7;29989:4;29947:22;:47::i;:::-;29939:110;;;;-1:-1:-1;;;29939:110:0;;;;;;;:::i;430:723::-;486:13;707:10;703:53;;-1:-1:-1;;734:10:0;;;;;;;;;;;;-1:-1:-1;;;734:10:0;;;;;430:723::o;703:53::-;781:5;766:12;822:78;829:9;;822:78;;855:8;;;;:::i;:::-;;-1:-1:-1;878:10:0;;-1:-1:-1;886:2:0;878:10;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;932:17:0;;910:39;;960:154;967:10;;960:154;;994:11;1004:1;994:11;;:::i;:::-;;-1:-1:-1;1063:10:0;1071:2;1063:5;:10;:::i;:::-;1050:24;;:2;:24;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1020:56:0;;;;;;;;-1:-1:-1;1091:11:0;1100:2;1091:11;;:::i;:::-;;;960:154;;35851:853;36005:4;-1:-1:-1;;;;;36026:13:0;;7618:19;:23;36022:675;;36062:71;;-1:-1:-1;;;36062:71:0;;-1:-1:-1;;;;;36062:36:0;;;;;:71;;3256:10;;36113:4;;36119:7;;36128:4;;36062:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36062:71:0;;;;;;;;-1:-1:-1;;36062:71:0;;;;;;;;;;;;:::i;:::-;;;36058:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36303:13:0;;36299:328;;36346:60;;-1:-1:-1;;;36346:60:0;;;;;;;:::i;36299:328::-;36577:6;36571:13;36562:6;36558:2;36554:15;36547:38;36058:584;-1:-1:-1;;;;;;36184:51:0;-1:-1:-1;;;36184:51:0;;-1:-1:-1;36177:58:0;;36022:675;-1:-1:-1;36681:4:0;35851:853;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:247::-;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;:::-;1051:5;815:247;-1:-1:-1;;;815:247:1:o;1067:251::-;1137:6;1190:2;1178:9;1169:7;1165:23;1161:32;1158:52;;;1206:1;1203;1196:12;1158:52;1238:9;1232:16;1257:31;1282:5;1257:31;:::i;1323:388::-;1391:6;1399;1452:2;1440:9;1431:7;1427:23;1423:32;1420:52;;;1468:1;1465;1458:12;1420:52;1507:9;1494:23;1526:31;1551:5;1526:31;:::i;:::-;1576:5;-1:-1:-1;1633:2:1;1618:18;;1605:32;1646:33;1605:32;1646:33;:::i;:::-;1698:7;1688:17;;;1323:388;;;;;:::o;1716:456::-;1793:6;1801;1809;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1917:9;1904:23;1936:31;1961:5;1936:31;:::i;:::-;1986:5;-1:-1:-1;2043:2:1;2028:18;;2015:32;2056:33;2015:32;2056:33;:::i;:::-;1716:456;;2108:7;;-1:-1:-1;;;2162:2:1;2147:18;;;;2134:32;;1716:456::o;2177:794::-;2272:6;2280;2288;2296;2349:3;2337:9;2328:7;2324:23;2320:33;2317:53;;;2366:1;2363;2356:12;2317:53;2405:9;2392:23;2424:31;2449:5;2424:31;:::i;:::-;2474:5;-1:-1:-1;2531:2:1;2516:18;;2503:32;2544:33;2503:32;2544:33;:::i;:::-;2596:7;-1:-1:-1;2650:2:1;2635:18;;2622:32;;-1:-1:-1;2705:2:1;2690:18;;2677:32;2732:18;2721:30;;2718:50;;;2764:1;2761;2754:12;2718:50;2787:22;;2840:4;2832:13;;2828:27;-1:-1:-1;2818:55:1;;2869:1;2866;2859:12;2818:55;2892:73;2957:7;2952:2;2939:16;2934:2;2930;2926:11;2892:73;:::i;:::-;2882:83;;;2177:794;;;;;;;:::o;2976:315::-;3041:6;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:52;;;3118:1;3115;3108:12;3070:52;3157:9;3144:23;3176:31;3201:5;3176:31;:::i;:::-;3226:5;-1:-1:-1;3250:35:1;3281:2;3266:18;;3250:35;:::i;:::-;3240:45;;2976:315;;;;;:::o;3296:::-;3364:6;3372;3425:2;3413:9;3404:7;3400:23;3396:32;3393:52;;;3441:1;3438;3431:12;3393:52;3480:9;3467:23;3499:31;3524:5;3499:31;:::i;:::-;3549:5;3601:2;3586:18;;;;3573:32;;-1:-1:-1;;;3296:315:1:o;3616:184::-;3686:6;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;-1:-1:-1;3778:16:1;;3616:184;-1:-1:-1;3616:184:1:o;3805:245::-;3863:6;3916:2;3904:9;3895:7;3891:23;3887:32;3884:52;;;3932:1;3929;3922:12;3884:52;3971:9;3958:23;3990:30;4014:5;3990:30;:::i;4055:249::-;4124:6;4177:2;4165:9;4156:7;4152:23;4148:32;4145:52;;;4193:1;4190;4183:12;4145:52;4225:9;4219:16;4244:30;4268:5;4244:30;:::i;4309:450::-;4378:6;4431:2;4419:9;4410:7;4406:23;4402:32;4399:52;;;4447:1;4444;4437:12;4399:52;4487:9;4474:23;4520:18;4512:6;4509:30;4506:50;;;4552:1;4549;4542:12;4506:50;4575:22;;4628:4;4620:13;;4616:27;-1:-1:-1;4606:55:1;;4657:1;4654;4647:12;4606:55;4680:73;4745:7;4740:2;4727:16;4722:2;4718;4714:11;4680:73;:::i;4764:180::-;4823:6;4876:2;4864:9;4855:7;4851:23;4847:32;4844:52;;;4892:1;4889;4882:12;4844:52;-1:-1:-1;4915:23:1;;4764:180;-1:-1:-1;4764:180:1:o;4949:248::-;5017:6;5025;5078:2;5066:9;5057:7;5053:23;5049:32;5046:52;;;5094:1;5091;5084:12;5046:52;-1:-1:-1;;5117:23:1;;;5187:2;5172:18;;;5159:32;;-1:-1:-1;4949:248:1:o;5202:383::-;5279:6;5287;5295;5348:2;5336:9;5327:7;5323:23;5319:32;5316:52;;;5364:1;5361;5354:12;5316:52;5400:9;5387:23;5377:33;;5457:2;5446:9;5442:18;5429:32;5419:42;;5511:2;5500:9;5496:18;5483:32;5524:31;5549:5;5524:31;:::i;:::-;5574:5;5564:15;;;5202:383;;;;;:::o;5590:452::-;5673:6;5681;5689;5697;5750:3;5738:9;5729:7;5725:23;5721:33;5718:53;;;5767:1;5764;5757:12;5718:53;5803:9;5790:23;5780:33;;5860:2;5849:9;5845:18;5832:32;5822:42;;5914:2;5903:9;5899:18;5886:32;5927:31;5952:5;5927:31;:::i;:::-;5977:5;-1:-1:-1;6001:35:1;6032:2;6017:18;;6001:35;:::i;:::-;5991:45;;5590:452;;;;;;;:::o;6047:316::-;6124:6;6132;6140;6193:2;6181:9;6172:7;6168:23;6164:32;6161:52;;;6209:1;6206;6199:12;6161:52;-1:-1:-1;;6232:23:1;;;6302:2;6287:18;;6274:32;;-1:-1:-1;6353:2:1;6338:18;;;6325:32;;6047:316;-1:-1:-1;6047:316:1:o;6368:257::-;6409:3;6447:5;6441:12;6474:6;6469:3;6462:19;6490:63;6546:6;6539:4;6534:3;6530:14;6523:4;6516:5;6512:16;6490:63;:::i;:::-;6607:2;6586:15;-1:-1:-1;;6582:29:1;6573:39;;;;6614:4;6569:50;;6368:257;-1:-1:-1;;6368:257:1:o;6630:973::-;6715:12;;6680:3;;6770:1;6790:18;;;;6843;;;;6870:61;;6924:4;6916:6;6912:17;6902:27;;6870:61;6950:2;6998;6990:6;6987:14;6967:18;6964:38;6961:161;;;7044:10;7039:3;7035:20;7032:1;7025:31;7079:4;7076:1;7069:15;7107:4;7104:1;7097:15;6961:161;7138:18;7165:104;;;;7283:1;7278:319;;;;7131:466;;7165:104;-1:-1:-1;;7198:24:1;;7186:37;;7243:16;;;;-1:-1:-1;7165:104:1;;7278:319;21119:1;21112:14;;;21156:4;21143:18;;7372:1;7386:165;7400:6;7397:1;7394:13;7386:165;;;7478:14;;7465:11;;;7458:35;7521:16;;;;7415:10;;7386:165;;;7390:3;;7580:6;7575:3;7571:16;7564:23;;7131:466;;;;;;;6630:973;;;;:::o;7608:456::-;7829:3;7857:38;7891:3;7883:6;7857:38;:::i;:::-;7924:6;7918:13;7940:52;7985:6;7981:2;7974:4;7966:6;7962:17;7940:52;:::i;:::-;8008:50;8050:6;8046:2;8042:15;8034:6;8008:50;:::i;:::-;8001:57;7608:456;-1:-1:-1;;;;;;;7608:456:1:o;8277:488::-;-1:-1:-1;;;;;8546:15:1;;;8528:34;;8598:15;;8593:2;8578:18;;8571:43;8645:2;8630:18;;8623:34;;;8693:3;8688:2;8673:18;;8666:31;;;8471:4;;8714:45;;8739:19;;8731:6;8714:45;:::i;:::-;8706:53;8277:488;-1:-1:-1;;;;;;8277:488:1:o;10557:219::-;10706:2;10695:9;10688:21;10669:4;10726:44;10766:2;10755:9;10751:18;10743:6;10726:44;:::i;11210:402::-;11412:2;11394:21;;;11451:2;11431:18;;;11424:30;11490:34;11485:2;11470:18;;11463:62;-1:-1:-1;;;11556:2:1;11541:18;;11534:36;11602:3;11587:19;;11210:402::o;11617:414::-;11819:2;11801:21;;;11858:2;11838:18;;;11831:30;11897:34;11892:2;11877:18;;11870:62;-1:-1:-1;;;11963:2:1;11948:18;;11941:48;12021:3;12006:19;;11617:414::o;13251:351::-;13453:2;13435:21;;;13492:2;13472:18;;;13465:30;13531:29;13526:2;13511:18;;13504:57;13593:2;13578:18;;13251:351::o;16335:353::-;16537:2;16519:21;;;16576:2;16556:18;;;16549:30;16615:31;16610:2;16595:18;;16588:59;16679:2;16664:18;;16335:353::o;20037:410::-;20239:2;20221:21;;;20278:2;20258:18;;;20251:30;20317:34;20312:2;20297:18;;20290:62;-1:-1:-1;;;20383:2:1;20368:18;;20361:44;20437:3;20422:19;;20037:410::o;20452:407::-;20654:2;20636:21;;;20693:2;20673:18;;;20666:30;20732:34;20727:2;20712:18;;20705:62;-1:-1:-1;;;20798:2:1;20783:18;;20776:41;20849:3;20834:19;;20452:407::o;21172:128::-;21212:3;21243:1;21239:6;21236:1;21233:13;21230:39;;;21249:18;;:::i;:::-;-1:-1:-1;21285:9:1;;21172:128::o;21305:120::-;21345:1;21371;21361:35;;21376:18;;:::i;:::-;-1:-1:-1;21410:9:1;;21305:120::o;21430:125::-;21470:4;21498:1;21495;21492:8;21489:34;;;21503:18;;:::i;:::-;-1:-1:-1;21540:9:1;;21430:125::o;21560:258::-;21632:1;21642:113;21656:6;21653:1;21650:13;21642:113;;;21732:11;;;21726:18;21713:11;;;21706:39;21678:2;21671:10;21642:113;;;21773:6;21770:1;21767:13;21764:48;;;-1:-1:-1;;21808:1:1;21790:16;;21783:27;21560:258::o;21823:380::-;21902:1;21898:12;;;;21945;;;21966:61;;22020:4;22012:6;22008:17;21998:27;;21966:61;22073:2;22065:6;22062:14;22042:18;22039:38;22036:161;;;22119:10;22114:3;22110:20;22107:1;22100:31;22154:4;22151:1;22144:15;22182:4;22179:1;22172:15;22036:161;;21823:380;;;:::o;22208:135::-;22247:3;-1:-1:-1;;22268:17:1;;22265:43;;;22288:18;;:::i;:::-;-1:-1:-1;22335:1:1;22324:13;;22208:135::o;22348:112::-;22380:1;22406;22396:35;;22411:18;;:::i;:::-;-1:-1:-1;22445:9:1;;22348:112::o;22465:127::-;22526:10;22521:3;22517:20;22514:1;22507:31;22557:4;22554:1;22547:15;22581:4;22578:1;22571:15;22597:127;22658:10;22653:3;22649:20;22646:1;22639:31;22689:4;22686:1;22679:15;22713:4;22710:1;22703:15;22729:127;22790:10;22785:3;22781:20;22778:1;22771:31;22821:4;22818:1;22811:15;22845:4;22842:1;22835:15;22861:127;22922:10;22917:3;22913:20;22910:1;22903:31;22953:4;22950:1;22943:15;22977:4;22974:1;22967:15;22993:131;-1:-1:-1;;;;;23068:31:1;;23058:42;;23048:70;;23114:1;23111;23104:12;23129:131;-1:-1:-1;;;;;;23203:32:1;;23193:43;;23183:71;;23250:1;23247;23240:12

Swarm Source

ipfs://1177b06dcc6397eb07a40f201dafb1e3a051a294860dfddc866af90eedbf22dc
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.