ETH Price: $3,467.14 (+2.34%)
Gas: 9 Gwei

Token

GG Particles (PRTCLGG)
 

Overview

Max Total Supply

2,208 PRTCLGG

Holders

847

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
laceyboy.eth
Balance
1 PRTCLGG
0x120949b827191e8ab0064901cd995973a7640039
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:
GG

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-26
*/

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

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

// SPDX-License-Identifier: MIT
// 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/token/ERC721/[email protected]


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


// 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/token/ERC721/extensions/[email protected]


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


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


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


// 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/introspection/[email protected]


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


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


// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


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


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File contracts/Manageable.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 are several accounts (managers) that can be granted exclusive access to
 * specific functions.
 *
 * By default the deployer of the contract will be added as the first manager.
 * 
 * This module is used through inheritance. It will make available the modifier
 * `onlyManagers`, which can be applied to your functions to restrict their use to
 * the managers.
 */
abstract contract Manageable is Context {
    mapping (address => bool) public managers;

    event ManagersAdded(address[] indexed newManagers);
    event ManagersRemoved(address[] indexed oldManagers);

    /**
     * @dev Initializes the contract setting the deployer as the initial manager.
     */
    constructor() {
        managers[_msgSender()] = true;
    }

    /**
     * @dev Throws if called by any account other than the managers.
     */
    modifier onlyManagers() {
        _checkManager();
        _;
    }

    /**
     * @dev Throws if the sender is not a manager.
     */
    function _checkManager() internal view virtual {
        require(managers[_msgSender()], "Manageable: caller is not a manager");
    }

    /**
     * @dev Adds manager role to new accounts (`newManagers`).
     * Can only be called by a current manager.
     */
    function addManagers(address[] memory newManagers) public virtual onlyManagers {
        _addManagers(newManagers);
    }

    /**
     * @dev Remove manager role from old accounts (`oldManagers`).
     * Can only be called by a current manager.
     */
    function removeManagers(address[] memory oldManagers) public virtual onlyManagers {
        _removeManagers(oldManagers);
    }

    /**
     * @dev Adds new managers of the contract (`newManagers`).
     * Internal function without access restriction.
     */
    function _addManagers(address[] memory newManagers) internal virtual {
        _setManagersState(newManagers, true);

        emit ManagersAdded(newManagers);
    }

    /**
     * @dev Removes old managers of the contract (`oldManagers`).
     * Internal function without access restriction.
     */
    function _removeManagers(address[] memory oldManagers) internal virtual {
        _setManagersState(oldManagers, false);

        emit ManagersRemoved(oldManagers);
    }

    /**
     * @dev Changes managers of the contract state (`setManagers`).
     * Internal function without access restriction.
     */
    function _setManagersState(address[] memory setManagers, bool newState) internal virtual {
        for (uint i = 0; i < setManagers.length; i++) {
            managers[setManagers[i]] = newState;
        }
    }
}


// File contracts/GG.sol


pragma solidity ^0.8.4;



/// @custom:security-contact [email protected]
/// @title GG
/// @notice GG contract for Particle NFTs representing a surprise drop for LIITA holders
/// @dev Using ERC721Enumerable from OpenZeppelin for ERC-721 standard
contract GG is ERC721, ERC721Enumerable, ERC2981, Manageable {
    using Strings for uint256;

    string public GGBaseURI;

    constructor(string memory ggURI) ERC721("GG Particles", "PRTCLGG") {
        GGBaseURI = ggURI;
    }

    /// @dev Sets baseURI for GG
    /// @notice Only managers can call this function
    /// @param newURI new base URI for NFT metadata
    function setBaseGGURI(string memory newURI) external onlyManagers {
        GGBaseURI = newURI;
    }

    /// @dev Override base ERC-721 tokenURI function to retun URI depndent on the tokenId
    /// @notice Only managers can call this function
    /// @param tokenId the token id beig queried
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        return bytes(GGBaseURI).length > 0 ? string(abi.encodePacked(GGBaseURI, tokenId.toString())) : "";
    }

    /// @dev Sets the default royalty info for both collections
    /// @notice Only managers can call this function
    /// @param receiver royalties receiver
    /// @param feeNumerator royalties fee numerator (has to be smaller than denominator: 10000)
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyManagers {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    /// @dev Mints new tokens bridged from old contract
    /// @notice Only managers can call this function
    /// @param owners new token owners
    /// @param tokenIds Array of arrays, where each array contains the tokenIds to be minted for the corresponding owner
    function mint(address[] calldata owners, uint256[][] calldata tokenIds) public onlyManagers {
        require(owners.length == tokenIds.length, "Mint: Owners and tokensIds length mismatch");

        for (uint i = 0; i < owners.length; i++) {
            for (uint j = 0; j < tokenIds[i].length; j++) {
                // Mint GG Particle NFT
                _safeMint(owners[i], tokenIds[i][j]);
            }
        }
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"ggURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"newManagers","type":"address[]"}],"name":"ManagersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"oldManagers","type":"address[]"}],"name":"ManagersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GGBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newManagers","type":"address[]"}],"name":"addManagers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"oldManagers","type":"address[]"}],"name":"removeManagers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseGGURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004377380380620043778339818101604052810190620000379190620003b3565b6040518060400160405280600c81526020017f4747205061727469636c657300000000000000000000000000000000000000008152506040518060400160405280600781526020017f505254434c4747000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000166565b508060019080519060200190620000d492919062000166565b5050506001600c6000620000ed6200015e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600d90805190602001906200015692919062000166565b505062000469565b600033905090565b828054620001749062000433565b90600052602060002090601f016020900481019282620001985760008555620001e4565b82601f10620001b357805160ff1916838001178555620001e4565b82800160010185558215620001e4579182015b82811115620001e3578251825591602001919060010190620001c6565b5b509050620001f39190620001f7565b5090565b5b8082111562000212576000816000905550600101620001f8565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200027f8262000234565b810181811067ffffffffffffffff82111715620002a157620002a062000245565b5b80604052505050565b6000620002b662000216565b9050620002c4828262000274565b919050565b600067ffffffffffffffff821115620002e757620002e662000245565b5b620002f28262000234565b9050602081019050919050565b60005b838110156200031f57808201518184015260208101905062000302565b838111156200032f576000848401525b50505050565b60006200034c6200034684620002c9565b620002aa565b9050828152602081018484840111156200036b576200036a6200022f565b5b62000378848285620002ff565b509392505050565b600082601f8301126200039857620003976200022a565b5b8151620003aa84826020860162000335565b91505092915050565b600060208284031215620003cc57620003cb62000220565b5b600082015167ffffffffffffffff811115620003ed57620003ec62000225565b5b620003fb8482850162000380565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044c57607f821691505b6020821081141562000463576200046262000404565b5b50919050565b613efe80620004796000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806330bbd525116100c357806395d89b411161007c57806395d89b41146103e8578063a22cb46514610406578063b88d4fde14610422578063c87b56dd1461043e578063e985e9c51461046e578063fdff9b4d1461049e57610158565b806330bbd5251461030457806342842e0e146103205780634f6ccce71461033c5780636352211e1461036c57806370a082311461039c5780638c5f9e74146103cc57610158565b806310f3ee291161011557806310f3ee291461022f5780631675359c1461024b57806318160ddd1461026957806323b872dd146102875780632a55205a146102a35780632f745c59146102d457610158565b806301ffc9a71461015d57806304634d8d1461018d57806306fdde03146101a9578063081812fc146101c7578063095ea7b3146101f75780630ab8c84414610213575b600080fd5b6101776004803603810190610172919061269f565b6104ce565b60405161018491906126e7565b60405180910390f35b6101a760048036038101906101a291906127a4565b6104e0565b005b6101b16104f6565b6040516101be919061287d565b60405180910390f35b6101e160048036038101906101dc91906128d5565b610588565b6040516101ee9190612911565b60405180910390f35b610211600480360381019061020c919061292c565b6105ce565b005b61022d60048036038101906102289190612a27565b6106e6565b005b61024960048036038101906102449190612be6565b610810565b005b610253610824565b604051610260919061287d565b60405180910390f35b6102716108b2565b60405161027e9190612c3e565b60405180910390f35b6102a1600480360381019061029c9190612c59565b6108bf565b005b6102bd60048036038101906102b89190612cac565b61091f565b6040516102cb929190612cec565b60405180910390f35b6102ee60048036038101906102e9919061292c565b610b0a565b6040516102fb9190612c3e565b60405180910390f35b61031e60048036038101906103199190612dca565b610baf565b005b61033a60048036038101906103359190612c59565b610bd1565b005b610356600480360381019061035191906128d5565b610bf1565b6040516103639190612c3e565b60405180910390f35b610386600480360381019061038191906128d5565b610c62565b6040516103939190612911565b60405180910390f35b6103b660048036038101906103b19190612e13565b610d14565b6040516103c39190612c3e565b60405180910390f35b6103e660048036038101906103e19190612be6565b610dcc565b005b6103f0610de0565b6040516103fd919061287d565b60405180910390f35b610420600480360381019061041b9190612e6c565b610e72565b005b61043c60048036038101906104379190612f4d565b610e88565b005b610458600480360381019061045391906128d5565b610eea565b604051610465919061287d565b60405180910390f35b61048860048036038101906104839190612fd0565b610f53565b60405161049591906126e7565b60405180910390f35b6104b860048036038101906104b39190612e13565b610fe7565b6040516104c591906126e7565b60405180910390f35b60006104d982611007565b9050919050565b6104e8611081565b6104f28282611116565b5050565b6060600080546105059061303f565b80601f01602080910402602001604051908101604052809291908181526020018280546105319061303f565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b6000610593826112ac565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d982610c62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561064a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906130e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106696112f7565b73ffffffffffffffffffffffffffffffffffffffff1614806106985750610697816106926112f7565b610f53565b5b6106d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ce90613175565b60405180910390fd5b6106e183836112ff565b505050565b6106ee611081565b818190508484905014610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d90613207565b60405180910390fd5b60005b848490508110156108095760005b83838381811061075a57610759613227565b5b905060200281019061076c9190613265565b90508110156107f5576107e286868481811061078b5761078a613227565b5b90506020020160208101906107a09190612e13565b8585858181106107b3576107b2613227565b5b90506020028101906107c59190613265565b848181106107d6576107d5613227565b5b905060200201356113b8565b80806107ed906132f7565b915050610747565b508080610801906132f7565b915050610739565b5050505050565b610818611081565b610821816113d6565b50565b600d80546108319061303f565b80601f016020809104026020016040519081016040528092919081815260200182805461085d9061303f565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081565b6000600880549050905090565b6108d06108ca6112f7565b82611426565b61090f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610906906133b2565b60405180910390fd5b61091a8383836114bb565b505050565b6000806000600b60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ab557600a6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610abf611722565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610aeb91906133d2565b610af5919061345b565b90508160000151819350935050509250929050565b6000610b1583610d14565b8210610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d906134fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb7611081565b80600d9080519060200190610bcd929190612590565b5050565b610bec83838360405180602001604052806000815250610e88565b505050565b6000610bfb6108b2565b8210610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3390613590565b60405180910390fd5b60088281548110610c5057610c4f613227565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d02906135fc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061368e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd4611081565b610ddd8161172c565b50565b606060018054610def9061303f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1b9061303f565b8015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b5050505050905090565b610e84610e7d6112f7565b838361177c565b5050565b610e99610e936112f7565b83611426565b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf906133b2565b60405180910390fd5b610ee4848484846118e9565b50505050565b6060610ef5826112ac565b6000600d8054610f049061303f565b905011610f205760405180602001604052806000815250610f4c565b600d610f2b83611945565b604051602001610f3c92919061377e565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061107a575061107982611aa6565b5b9050919050565b600c600061108d6112f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613814565b60405180910390fd5b565b61111e611722565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561117c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611173906138a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613912565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6112b581611b20565b6112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb906135fc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661137283610c62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113d2828260405180602001604052806000815250611b8c565b5050565b6113e1816000611be7565b806040516113ef91906139ea565b60405180910390207faf222ad3bece4835a4d5575aaf4b9b0a2d8bd1b1a0288ac550913ae90349433c60405160405180910390a250565b60008061143283610c62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147457506114738185610f53565b5b806114b257508373ffffffffffffffffffffffffffffffffffffffff1661149a84610588565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114db82610c62565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613a73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613b05565b60405180910390fd5b6115ac838383611c7c565b6115b76000826112ff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116079190613b25565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165e9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461171d838383611c8c565b505050565b6000612710905090565b611737816001611be7565b8060405161174591906139ea565b60405180910390207f65ecfc038b084527da839d7e9eaf5fba7a2454ef583bc16369747b241bd68df860405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290613bfb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118dc91906126e7565b60405180910390a3505050565b6118f48484846114bb565b61190084848484611c91565b61193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193690613c8d565b60405180910390fd5b50505050565b6060600082141561198d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aa1565b600082905060005b600082146119bf5780806119a8906132f7565b915050600a826119b8919061345b565b9150611995565b60008167ffffffffffffffff8111156119db576119da612aa8565b5b6040519080825280601f01601f191660200182016040528015611a0d5781602001600182028036833780820191505090505b5090505b60008514611a9a57600182611a269190613b25565b9150600a85611a359190613cad565b6030611a419190613b59565b60f81b818381518110611a5757611a56613227565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a93919061345b565b9450611a11565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b195750611b1882611e28565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b968383611f0a565b611ba36000848484611c91565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613c8d565b60405180910390fd5b505050565b60005b8251811015611c775781600c6000858481518110611c0b57611c0a613227565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c6f906132f7565b915050611bea565b505050565b611c878383836120e4565b505050565b505050565b6000611cb28473ffffffffffffffffffffffffffffffffffffffff166121f8565b15611e1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cdb6112f7565b8786866040518563ffffffff1660e01b8152600401611cfd9493929190613d33565b602060405180830381600087803b158015611d1757600080fd5b505af1925050508015611d4857506040513d601f19601f82011682018060405250810190611d459190613d94565b60015b611dcb573d8060008114611d78576040519150601f19603f3d011682016040523d82523d6000602084013e611d7d565b606091505b50600081511415611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba90613c8d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e20565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f035750611f028261221b565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613e0d565b60405180910390fd5b611f8381611b20565b15611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90613e79565b60405180910390fd5b611fcf60008383611c7c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201f9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120e060008383611c8c565b5050565b6120ef838383612285565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121325761212d8161228a565b612171565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121705761216f83826122d3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b4576121af81612440565b6121f3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121f2576121f18282612511565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122e084610d14565b6122ea9190613b25565b90506000600760008481526020019081526020016000205490508181146123cf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506124549190613b25565b905060006009600084815260200190815260200160002054905060006008838154811061248457612483613227565b5b9060005260206000200154905080600883815481106124a6576124a5613227565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124f5576124f4613e99565b5b6001900381819060005260206000200160009055905550505050565b600061251c83610d14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461259c9061303f565b90600052602060002090601f0160209004810192826125be5760008555612605565b82601f106125d757805160ff1916838001178555612605565b82800160010185558215612605579182015b828111156126045782518255916020019190600101906125e9565b5b5090506126129190612616565b5090565b5b8082111561262f576000816000905550600101612617565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61267c81612647565b811461268757600080fd5b50565b60008135905061269981612673565b92915050565b6000602082840312156126b5576126b461263d565b5b60006126c38482850161268a565b91505092915050565b60008115159050919050565b6126e1816126cc565b82525050565b60006020820190506126fc60008301846126d8565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061272d82612702565b9050919050565b61273d81612722565b811461274857600080fd5b50565b60008135905061275a81612734565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61278181612760565b811461278c57600080fd5b50565b60008135905061279e81612778565b92915050565b600080604083850312156127bb576127ba61263d565b5b60006127c98582860161274b565b92505060206127da8582860161278f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281e578082015181840152602081019050612803565b8381111561282d576000848401525b50505050565b6000601f19601f8301169050919050565b600061284f826127e4565b61285981856127ef565b9350612869818560208601612800565b61287281612833565b840191505092915050565b600060208201905081810360008301526128978184612844565b905092915050565b6000819050919050565b6128b28161289f565b81146128bd57600080fd5b50565b6000813590506128cf816128a9565b92915050565b6000602082840312156128eb576128ea61263d565b5b60006128f9848285016128c0565b91505092915050565b61290b81612722565b82525050565b60006020820190506129266000830184612902565b92915050565b600080604083850312156129435761294261263d565b5b60006129518582860161274b565b9250506020612962858286016128c0565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129915761299061296c565b5b8235905067ffffffffffffffff8111156129ae576129ad612971565b5b6020830191508360208202830111156129ca576129c9612976565b5b9250929050565b60008083601f8401126129e7576129e661296c565b5b8235905067ffffffffffffffff811115612a0457612a03612971565b5b602083019150836020820283011115612a2057612a1f612976565b5b9250929050565b60008060008060408587031215612a4157612a4061263d565b5b600085013567ffffffffffffffff811115612a5f57612a5e612642565b5b612a6b8782880161297b565b9450945050602085013567ffffffffffffffff811115612a8e57612a8d612642565b5b612a9a878288016129d1565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ae082612833565b810181811067ffffffffffffffff82111715612aff57612afe612aa8565b5b80604052505050565b6000612b12612633565b9050612b1e8282612ad7565b919050565b600067ffffffffffffffff821115612b3e57612b3d612aa8565b5b602082029050602081019050919050565b6000612b62612b5d84612b23565b612b08565b90508083825260208201905060208402830185811115612b8557612b84612976565b5b835b81811015612bae5780612b9a888261274b565b845260208401935050602081019050612b87565b5050509392505050565b600082601f830112612bcd57612bcc61296c565b5b8135612bdd848260208601612b4f565b91505092915050565b600060208284031215612bfc57612bfb61263d565b5b600082013567ffffffffffffffff811115612c1a57612c19612642565b5b612c2684828501612bb8565b91505092915050565b612c388161289f565b82525050565b6000602082019050612c536000830184612c2f565b92915050565b600080600060608486031215612c7257612c7161263d565b5b6000612c808682870161274b565b9350506020612c918682870161274b565b9250506040612ca2868287016128c0565b9150509250925092565b60008060408385031215612cc357612cc261263d565b5b6000612cd1858286016128c0565b9250506020612ce2858286016128c0565b9150509250929050565b6000604082019050612d016000830185612902565b612d0e6020830184612c2f565b9392505050565b600080fd5b600067ffffffffffffffff821115612d3557612d34612aa8565b5b612d3e82612833565b9050602081019050919050565b82818337600083830152505050565b6000612d6d612d6884612d1a565b612b08565b905082815260208101848484011115612d8957612d88612d15565b5b612d94848285612d4b565b509392505050565b600082601f830112612db157612db061296c565b5b8135612dc1848260208601612d5a565b91505092915050565b600060208284031215612de057612ddf61263d565b5b600082013567ffffffffffffffff811115612dfe57612dfd612642565b5b612e0a84828501612d9c565b91505092915050565b600060208284031215612e2957612e2861263d565b5b6000612e378482850161274b565b91505092915050565b612e49816126cc565b8114612e5457600080fd5b50565b600081359050612e6681612e40565b92915050565b60008060408385031215612e8357612e8261263d565b5b6000612e918582860161274b565b9250506020612ea285828601612e57565b9150509250929050565b600067ffffffffffffffff821115612ec757612ec6612aa8565b5b612ed082612833565b9050602081019050919050565b6000612ef0612eeb84612eac565b612b08565b905082815260208101848484011115612f0c57612f0b612d15565b5b612f17848285612d4b565b509392505050565b600082601f830112612f3457612f3361296c565b5b8135612f44848260208601612edd565b91505092915050565b60008060008060808587031215612f6757612f6661263d565b5b6000612f758782880161274b565b9450506020612f868782880161274b565b9350506040612f97878288016128c0565b925050606085013567ffffffffffffffff811115612fb857612fb7612642565b5b612fc487828801612f1f565b91505092959194509250565b60008060408385031215612fe757612fe661263d565b5b6000612ff58582860161274b565b92505060206130068582860161274b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061305757607f821691505b6020821081141561306b5761306a613010565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130cd6021836127ef565b91506130d882613071565b604082019050919050565b600060208201905081810360008301526130fc816130c0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061315f603e836127ef565b915061316a82613103565b604082019050919050565b6000602082019050818103600083015261318e81613152565b9050919050565b7f4d696e743a204f776e65727320616e6420746f6b656e73496473206c656e677460008201527f68206d69736d6174636800000000000000000000000000000000000000000000602082015250565b60006131f1602a836127ef565b91506131fc82613195565b604082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261328257613281613256565b5b80840192508235915067ffffffffffffffff8211156132a4576132a361325b565b5b6020830192506020820236038313156132c0576132bf613260565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133028261289f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613335576133346132c8565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061339c602e836127ef565b91506133a782613340565b604082019050919050565b600060208201905081810360008301526133cb8161338f565b9050919050565b60006133dd8261289f565b91506133e88361289f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613421576134206132c8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134668261289f565b91506134718361289f565b9250826134815761348061342c565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134e8602b836127ef565b91506134f38261348c565b604082019050919050565b60006020820190508181036000830152613517816134db565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061357a602c836127ef565b91506135858261351e565b604082019050919050565b600060208201905081810360008301526135a98161356d565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006135e66018836127ef565b91506135f1826135b0565b602082019050919050565b60006020820190508181036000830152613615816135d9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136786029836127ef565b91506136838261361c565b604082019050919050565b600060208201905081810360008301526136a78161366b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546136db8161303f565b6136e581866136ae565b94506001821660008114613700576001811461371157613744565b60ff19831686528186019350613744565b61371a856136b9565b60005b8381101561373c5781548189015260018201915060208101905061371d565b838801955050505b50505092915050565b6000613758826127e4565b61376281856136ae565b9350613772818560208601612800565b80840191505092915050565b600061378a82856136ce565b9150613796828461374d565b91508190509392505050565b7f4d616e61676561626c653a2063616c6c6572206973206e6f742061206d616e6160008201527f6765720000000000000000000000000000000000000000000000000000000000602082015250565b60006137fe6023836127ef565b9150613809826137a2565b604082019050919050565b6000602082019050818103600083015261382d816137f1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613890602a836127ef565b915061389b82613834565b604082019050919050565b600060208201905081810360008301526138bf81613883565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006138fc6019836127ef565b9150613907826138c6565b602082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b600081519050919050565b600081905092915050565b6000819050602082019050919050565b61396181612722565b82525050565b60006139738383613958565b60208301905092915050565b6000602082019050919050565b600061399782613932565b6139a1818561393d565b93506139ac83613948565b8060005b838110156139dd5781516139c48882613967565b97506139cf8361397f565b9250506001810190506139b0565b5085935050505092915050565b60006139f6828461398c565b915081905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613a5d6025836127ef565b9150613a6882613a01565b604082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613aef6024836127ef565b9150613afa82613a93565b604082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b6000613b308261289f565b9150613b3b8361289f565b925082821015613b4e57613b4d6132c8565b5b828203905092915050565b6000613b648261289f565b9150613b6f8361289f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba36132c8565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be56019836127ef565b9150613bf082613baf565b602082019050919050565b60006020820190508181036000830152613c1481613bd8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613c776032836127ef565b9150613c8282613c1b565b604082019050919050565b60006020820190508181036000830152613ca681613c6a565b9050919050565b6000613cb88261289f565b9150613cc38361289f565b925082613cd357613cd261342c565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613d0582613cde565b613d0f8185613ce9565b9350613d1f818560208601612800565b613d2881612833565b840191505092915050565b6000608082019050613d486000830187612902565b613d556020830186612902565b613d626040830185612c2f565b8181036060830152613d748184613cfa565b905095945050505050565b600081519050613d8e81612673565b92915050565b600060208284031215613daa57613da961263d565b5b6000613db884828501613d7f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613df76020836127ef565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613e63601c836127ef565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b48e0b85567c69f251f1b7a8e2f3640698f1f94245fda985e8acf91bee7309b064736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f6170692d70726f642e7061727469636c65636f6c6c656374696f6e2e636f6d2f6170692f76312f7061727469636c652d6d657461646174612f477563636947686f73742f0000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806330bbd525116100c357806395d89b411161007c57806395d89b41146103e8578063a22cb46514610406578063b88d4fde14610422578063c87b56dd1461043e578063e985e9c51461046e578063fdff9b4d1461049e57610158565b806330bbd5251461030457806342842e0e146103205780634f6ccce71461033c5780636352211e1461036c57806370a082311461039c5780638c5f9e74146103cc57610158565b806310f3ee291161011557806310f3ee291461022f5780631675359c1461024b57806318160ddd1461026957806323b872dd146102875780632a55205a146102a35780632f745c59146102d457610158565b806301ffc9a71461015d57806304634d8d1461018d57806306fdde03146101a9578063081812fc146101c7578063095ea7b3146101f75780630ab8c84414610213575b600080fd5b6101776004803603810190610172919061269f565b6104ce565b60405161018491906126e7565b60405180910390f35b6101a760048036038101906101a291906127a4565b6104e0565b005b6101b16104f6565b6040516101be919061287d565b60405180910390f35b6101e160048036038101906101dc91906128d5565b610588565b6040516101ee9190612911565b60405180910390f35b610211600480360381019061020c919061292c565b6105ce565b005b61022d60048036038101906102289190612a27565b6106e6565b005b61024960048036038101906102449190612be6565b610810565b005b610253610824565b604051610260919061287d565b60405180910390f35b6102716108b2565b60405161027e9190612c3e565b60405180910390f35b6102a1600480360381019061029c9190612c59565b6108bf565b005b6102bd60048036038101906102b89190612cac565b61091f565b6040516102cb929190612cec565b60405180910390f35b6102ee60048036038101906102e9919061292c565b610b0a565b6040516102fb9190612c3e565b60405180910390f35b61031e60048036038101906103199190612dca565b610baf565b005b61033a60048036038101906103359190612c59565b610bd1565b005b610356600480360381019061035191906128d5565b610bf1565b6040516103639190612c3e565b60405180910390f35b610386600480360381019061038191906128d5565b610c62565b6040516103939190612911565b60405180910390f35b6103b660048036038101906103b19190612e13565b610d14565b6040516103c39190612c3e565b60405180910390f35b6103e660048036038101906103e19190612be6565b610dcc565b005b6103f0610de0565b6040516103fd919061287d565b60405180910390f35b610420600480360381019061041b9190612e6c565b610e72565b005b61043c60048036038101906104379190612f4d565b610e88565b005b610458600480360381019061045391906128d5565b610eea565b604051610465919061287d565b60405180910390f35b61048860048036038101906104839190612fd0565b610f53565b60405161049591906126e7565b60405180910390f35b6104b860048036038101906104b39190612e13565b610fe7565b6040516104c591906126e7565b60405180910390f35b60006104d982611007565b9050919050565b6104e8611081565b6104f28282611116565b5050565b6060600080546105059061303f565b80601f01602080910402602001604051908101604052809291908181526020018280546105319061303f565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b6000610593826112ac565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d982610c62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561064a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906130e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106696112f7565b73ffffffffffffffffffffffffffffffffffffffff1614806106985750610697816106926112f7565b610f53565b5b6106d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ce90613175565b60405180910390fd5b6106e183836112ff565b505050565b6106ee611081565b818190508484905014610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d90613207565b60405180910390fd5b60005b848490508110156108095760005b83838381811061075a57610759613227565b5b905060200281019061076c9190613265565b90508110156107f5576107e286868481811061078b5761078a613227565b5b90506020020160208101906107a09190612e13565b8585858181106107b3576107b2613227565b5b90506020028101906107c59190613265565b848181106107d6576107d5613227565b5b905060200201356113b8565b80806107ed906132f7565b915050610747565b508080610801906132f7565b915050610739565b5050505050565b610818611081565b610821816113d6565b50565b600d80546108319061303f565b80601f016020809104026020016040519081016040528092919081815260200182805461085d9061303f565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081565b6000600880549050905090565b6108d06108ca6112f7565b82611426565b61090f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610906906133b2565b60405180910390fd5b61091a8383836114bb565b505050565b6000806000600b60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ab557600a6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610abf611722565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610aeb91906133d2565b610af5919061345b565b90508160000151819350935050509250929050565b6000610b1583610d14565b8210610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d906134fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb7611081565b80600d9080519060200190610bcd929190612590565b5050565b610bec83838360405180602001604052806000815250610e88565b505050565b6000610bfb6108b2565b8210610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3390613590565b60405180910390fd5b60088281548110610c5057610c4f613227565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d02906135fc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061368e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd4611081565b610ddd8161172c565b50565b606060018054610def9061303f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1b9061303f565b8015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b5050505050905090565b610e84610e7d6112f7565b838361177c565b5050565b610e99610e936112f7565b83611426565b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf906133b2565b60405180910390fd5b610ee4848484846118e9565b50505050565b6060610ef5826112ac565b6000600d8054610f049061303f565b905011610f205760405180602001604052806000815250610f4c565b600d610f2b83611945565b604051602001610f3c92919061377e565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061107a575061107982611aa6565b5b9050919050565b600c600061108d6112f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613814565b60405180910390fd5b565b61111e611722565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561117c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611173906138a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613912565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6112b581611b20565b6112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb906135fc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661137283610c62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113d2828260405180602001604052806000815250611b8c565b5050565b6113e1816000611be7565b806040516113ef91906139ea565b60405180910390207faf222ad3bece4835a4d5575aaf4b9b0a2d8bd1b1a0288ac550913ae90349433c60405160405180910390a250565b60008061143283610c62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147457506114738185610f53565b5b806114b257508373ffffffffffffffffffffffffffffffffffffffff1661149a84610588565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114db82610c62565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613a73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613b05565b60405180910390fd5b6115ac838383611c7c565b6115b76000826112ff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116079190613b25565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165e9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461171d838383611c8c565b505050565b6000612710905090565b611737816001611be7565b8060405161174591906139ea565b60405180910390207f65ecfc038b084527da839d7e9eaf5fba7a2454ef583bc16369747b241bd68df860405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290613bfb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118dc91906126e7565b60405180910390a3505050565b6118f48484846114bb565b61190084848484611c91565b61193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193690613c8d565b60405180910390fd5b50505050565b6060600082141561198d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aa1565b600082905060005b600082146119bf5780806119a8906132f7565b915050600a826119b8919061345b565b9150611995565b60008167ffffffffffffffff8111156119db576119da612aa8565b5b6040519080825280601f01601f191660200182016040528015611a0d5781602001600182028036833780820191505090505b5090505b60008514611a9a57600182611a269190613b25565b9150600a85611a359190613cad565b6030611a419190613b59565b60f81b818381518110611a5757611a56613227565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a93919061345b565b9450611a11565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b195750611b1882611e28565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b968383611f0a565b611ba36000848484611c91565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613c8d565b60405180910390fd5b505050565b60005b8251811015611c775781600c6000858481518110611c0b57611c0a613227565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c6f906132f7565b915050611bea565b505050565b611c878383836120e4565b505050565b505050565b6000611cb28473ffffffffffffffffffffffffffffffffffffffff166121f8565b15611e1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cdb6112f7565b8786866040518563ffffffff1660e01b8152600401611cfd9493929190613d33565b602060405180830381600087803b158015611d1757600080fd5b505af1925050508015611d4857506040513d601f19601f82011682018060405250810190611d459190613d94565b60015b611dcb573d8060008114611d78576040519150601f19603f3d011682016040523d82523d6000602084013e611d7d565b606091505b50600081511415611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba90613c8d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e20565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f035750611f028261221b565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613e0d565b60405180910390fd5b611f8381611b20565b15611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90613e79565b60405180910390fd5b611fcf60008383611c7c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201f9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120e060008383611c8c565b5050565b6120ef838383612285565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121325761212d8161228a565b612171565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121705761216f83826122d3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b4576121af81612440565b6121f3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121f2576121f18282612511565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122e084610d14565b6122ea9190613b25565b90506000600760008481526020019081526020016000205490508181146123cf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506124549190613b25565b905060006009600084815260200190815260200160002054905060006008838154811061248457612483613227565b5b9060005260206000200154905080600883815481106124a6576124a5613227565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124f5576124f4613e99565b5b6001900381819060005260206000200160009055905550505050565b600061251c83610d14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461259c9061303f565b90600052602060002090601f0160209004810192826125be5760008555612605565b82601f106125d757805160ff1916838001178555612605565b82800160010185558215612605579182015b828111156126045782518255916020019190600101906125e9565b5b5090506126129190612616565b5090565b5b8082111561262f576000816000905550600101612617565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61267c81612647565b811461268757600080fd5b50565b60008135905061269981612673565b92915050565b6000602082840312156126b5576126b461263d565b5b60006126c38482850161268a565b91505092915050565b60008115159050919050565b6126e1816126cc565b82525050565b60006020820190506126fc60008301846126d8565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061272d82612702565b9050919050565b61273d81612722565b811461274857600080fd5b50565b60008135905061275a81612734565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61278181612760565b811461278c57600080fd5b50565b60008135905061279e81612778565b92915050565b600080604083850312156127bb576127ba61263d565b5b60006127c98582860161274b565b92505060206127da8582860161278f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281e578082015181840152602081019050612803565b8381111561282d576000848401525b50505050565b6000601f19601f8301169050919050565b600061284f826127e4565b61285981856127ef565b9350612869818560208601612800565b61287281612833565b840191505092915050565b600060208201905081810360008301526128978184612844565b905092915050565b6000819050919050565b6128b28161289f565b81146128bd57600080fd5b50565b6000813590506128cf816128a9565b92915050565b6000602082840312156128eb576128ea61263d565b5b60006128f9848285016128c0565b91505092915050565b61290b81612722565b82525050565b60006020820190506129266000830184612902565b92915050565b600080604083850312156129435761294261263d565b5b60006129518582860161274b565b9250506020612962858286016128c0565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129915761299061296c565b5b8235905067ffffffffffffffff8111156129ae576129ad612971565b5b6020830191508360208202830111156129ca576129c9612976565b5b9250929050565b60008083601f8401126129e7576129e661296c565b5b8235905067ffffffffffffffff811115612a0457612a03612971565b5b602083019150836020820283011115612a2057612a1f612976565b5b9250929050565b60008060008060408587031215612a4157612a4061263d565b5b600085013567ffffffffffffffff811115612a5f57612a5e612642565b5b612a6b8782880161297b565b9450945050602085013567ffffffffffffffff811115612a8e57612a8d612642565b5b612a9a878288016129d1565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ae082612833565b810181811067ffffffffffffffff82111715612aff57612afe612aa8565b5b80604052505050565b6000612b12612633565b9050612b1e8282612ad7565b919050565b600067ffffffffffffffff821115612b3e57612b3d612aa8565b5b602082029050602081019050919050565b6000612b62612b5d84612b23565b612b08565b90508083825260208201905060208402830185811115612b8557612b84612976565b5b835b81811015612bae5780612b9a888261274b565b845260208401935050602081019050612b87565b5050509392505050565b600082601f830112612bcd57612bcc61296c565b5b8135612bdd848260208601612b4f565b91505092915050565b600060208284031215612bfc57612bfb61263d565b5b600082013567ffffffffffffffff811115612c1a57612c19612642565b5b612c2684828501612bb8565b91505092915050565b612c388161289f565b82525050565b6000602082019050612c536000830184612c2f565b92915050565b600080600060608486031215612c7257612c7161263d565b5b6000612c808682870161274b565b9350506020612c918682870161274b565b9250506040612ca2868287016128c0565b9150509250925092565b60008060408385031215612cc357612cc261263d565b5b6000612cd1858286016128c0565b9250506020612ce2858286016128c0565b9150509250929050565b6000604082019050612d016000830185612902565b612d0e6020830184612c2f565b9392505050565b600080fd5b600067ffffffffffffffff821115612d3557612d34612aa8565b5b612d3e82612833565b9050602081019050919050565b82818337600083830152505050565b6000612d6d612d6884612d1a565b612b08565b905082815260208101848484011115612d8957612d88612d15565b5b612d94848285612d4b565b509392505050565b600082601f830112612db157612db061296c565b5b8135612dc1848260208601612d5a565b91505092915050565b600060208284031215612de057612ddf61263d565b5b600082013567ffffffffffffffff811115612dfe57612dfd612642565b5b612e0a84828501612d9c565b91505092915050565b600060208284031215612e2957612e2861263d565b5b6000612e378482850161274b565b91505092915050565b612e49816126cc565b8114612e5457600080fd5b50565b600081359050612e6681612e40565b92915050565b60008060408385031215612e8357612e8261263d565b5b6000612e918582860161274b565b9250506020612ea285828601612e57565b9150509250929050565b600067ffffffffffffffff821115612ec757612ec6612aa8565b5b612ed082612833565b9050602081019050919050565b6000612ef0612eeb84612eac565b612b08565b905082815260208101848484011115612f0c57612f0b612d15565b5b612f17848285612d4b565b509392505050565b600082601f830112612f3457612f3361296c565b5b8135612f44848260208601612edd565b91505092915050565b60008060008060808587031215612f6757612f6661263d565b5b6000612f758782880161274b565b9450506020612f868782880161274b565b9350506040612f97878288016128c0565b925050606085013567ffffffffffffffff811115612fb857612fb7612642565b5b612fc487828801612f1f565b91505092959194509250565b60008060408385031215612fe757612fe661263d565b5b6000612ff58582860161274b565b92505060206130068582860161274b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061305757607f821691505b6020821081141561306b5761306a613010565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130cd6021836127ef565b91506130d882613071565b604082019050919050565b600060208201905081810360008301526130fc816130c0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061315f603e836127ef565b915061316a82613103565b604082019050919050565b6000602082019050818103600083015261318e81613152565b9050919050565b7f4d696e743a204f776e65727320616e6420746f6b656e73496473206c656e677460008201527f68206d69736d6174636800000000000000000000000000000000000000000000602082015250565b60006131f1602a836127ef565b91506131fc82613195565b604082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261328257613281613256565b5b80840192508235915067ffffffffffffffff8211156132a4576132a361325b565b5b6020830192506020820236038313156132c0576132bf613260565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133028261289f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613335576133346132c8565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061339c602e836127ef565b91506133a782613340565b604082019050919050565b600060208201905081810360008301526133cb8161338f565b9050919050565b60006133dd8261289f565b91506133e88361289f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613421576134206132c8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134668261289f565b91506134718361289f565b9250826134815761348061342c565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134e8602b836127ef565b91506134f38261348c565b604082019050919050565b60006020820190508181036000830152613517816134db565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061357a602c836127ef565b91506135858261351e565b604082019050919050565b600060208201905081810360008301526135a98161356d565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006135e66018836127ef565b91506135f1826135b0565b602082019050919050565b60006020820190508181036000830152613615816135d9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136786029836127ef565b91506136838261361c565b604082019050919050565b600060208201905081810360008301526136a78161366b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546136db8161303f565b6136e581866136ae565b94506001821660008114613700576001811461371157613744565b60ff19831686528186019350613744565b61371a856136b9565b60005b8381101561373c5781548189015260018201915060208101905061371d565b838801955050505b50505092915050565b6000613758826127e4565b61376281856136ae565b9350613772818560208601612800565b80840191505092915050565b600061378a82856136ce565b9150613796828461374d565b91508190509392505050565b7f4d616e61676561626c653a2063616c6c6572206973206e6f742061206d616e6160008201527f6765720000000000000000000000000000000000000000000000000000000000602082015250565b60006137fe6023836127ef565b9150613809826137a2565b604082019050919050565b6000602082019050818103600083015261382d816137f1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613890602a836127ef565b915061389b82613834565b604082019050919050565b600060208201905081810360008301526138bf81613883565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006138fc6019836127ef565b9150613907826138c6565b602082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b600081519050919050565b600081905092915050565b6000819050602082019050919050565b61396181612722565b82525050565b60006139738383613958565b60208301905092915050565b6000602082019050919050565b600061399782613932565b6139a1818561393d565b93506139ac83613948565b8060005b838110156139dd5781516139c48882613967565b97506139cf8361397f565b9250506001810190506139b0565b5085935050505092915050565b60006139f6828461398c565b915081905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613a5d6025836127ef565b9150613a6882613a01565b604082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613aef6024836127ef565b9150613afa82613a93565b604082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b6000613b308261289f565b9150613b3b8361289f565b925082821015613b4e57613b4d6132c8565b5b828203905092915050565b6000613b648261289f565b9150613b6f8361289f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba36132c8565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be56019836127ef565b9150613bf082613baf565b602082019050919050565b60006020820190508181036000830152613c1481613bd8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613c776032836127ef565b9150613c8282613c1b565b604082019050919050565b60006020820190508181036000830152613ca681613c6a565b9050919050565b6000613cb88261289f565b9150613cc38361289f565b925082613cd357613cd261342c565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613d0582613cde565b613d0f8185613ce9565b9350613d1f818560208601612800565b613d2881612833565b840191505092915050565b6000608082019050613d486000830187612902565b613d556020830186612902565b613d626040830185612c2f565b8181036060830152613d748184613cfa565b905095945050505050565b600081519050613d8e81612673565b92915050565b600060208284031215613daa57613da961263d565b5b6000613db884828501613d7f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613df76020836127ef565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613e63601c836127ef565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b48e0b85567c69f251f1b7a8e2f3640698f1f94245fda985e8acf91bee7309b064736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f6170692d70726f642e7061727469636c65636f6c6c656374696f6e2e636f6d2f6170692f76312f7061727469636c652d6d657461646174612f477563636947686f73742f0000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : ggURI (string): https://api-prod.particlecollection.com/api/v1/particle-metadata/GucciGhost/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [2] : 68747470733a2f2f6170692d70726f642e7061727469636c65636f6c6c656374
Arg [3] : 696f6e2e636f6d2f6170692f76312f7061727469636c652d6d65746164617461
Arg [4] : 2f477563636947686f73742f0000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51893:2579:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54248:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53093:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23122:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24635:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24152:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53523:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50461:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51995:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38120:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25335:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46194:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37788:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52279:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25742:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38310:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22833:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22564:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50195:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23291:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24878:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25998:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52585:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25104:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49345:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54248:221;54396:4;54425:36;54449:11;54425:23;:36::i;:::-;54418:43;;54248:221;;;:::o;53093:149::-;49807:15;:13;:15::i;:::-;53192:42:::1;53211:8;53221:12;53192:18;:42::i;:::-;53093:149:::0;;:::o;23122:100::-;23176:13;23209:5;23202:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23122:100;:::o;24635:171::-;24711:7;24731:23;24746:7;24731:14;:23::i;:::-;24774:15;:24;24790:7;24774:24;;;;;;;;;;;;;;;;;;;;;24767:31;;24635:171;;;:::o;24152:417::-;24233:13;24249:23;24264:7;24249:14;:23::i;:::-;24233:39;;24297:5;24291:11;;:2;:11;;;;24283:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24391:5;24375:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24400:37;24417:5;24424:12;:10;:12::i;:::-;24400:16;:37::i;:::-;24375:62;24353:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24540:21;24549:2;24553:7;24540:8;:21::i;:::-;24222:347;24152:417;;:::o;53523:435::-;49807:15;:13;:15::i;:::-;53651:8:::1;;:15;;53634:6;;:13;;:32;53626:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53731:6;53726:225;53747:6;;:13;;53743:1;:17;53726:225;;;53787:6;53782:158;53803:8;;53812:1;53803:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:18;;53799:1;:22;53782:158;;;53888:36;53898:6;;53905:1;53898:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53909:8;;53918:1;53909:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;53921:1;53909:14;;;;;;;:::i;:::-;;;;;;;;53888:9;:36::i;:::-;53823:3;;;;;:::i;:::-;;;;53782:158;;;;53762:3;;;;;:::i;:::-;;;;53726:225;;;;53523:435:::0;;;;:::o;50461:129::-;49807:15;:13;:15::i;:::-;50554:28:::1;50570:11;50554:15;:28::i;:::-;50461:129:::0;:::o;51995:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38120:113::-;38181:7;38208:10;:17;;;;38201:24;;38120:113;:::o;25335:336::-;25530:41;25549:12;:10;:12::i;:::-;25563:7;25530:18;:41::i;:::-;25522:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25635:28;25645:4;25651:2;25655:7;25635:9;:28::i;:::-;25335:336;;;:::o;46194:442::-;46291:7;46300;46320:26;46349:17;:27;46367:8;46349:27;;;;;;;;;;;46320:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46421:1;46393:30;;:7;:16;;;:30;;;46389:92;;;46450:19;46440:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46389:92;46493:21;46558:17;:15;:17::i;:::-;46517:58;;46531:7;:23;;;46518:36;;:10;:36;;;;:::i;:::-;46517:58;;;;:::i;:::-;46493:82;;46596:7;:16;;;46614:13;46588:40;;;;;;46194:442;;;;;:::o;37788:256::-;37885:7;37921:23;37938:5;37921:16;:23::i;:::-;37913:5;:31;37905:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38010:12;:19;38023:5;38010:19;;;;;;;;;;;;;;;:26;38030:5;38010:26;;;;;;;;;;;;38003:33;;37788:256;;;;:::o;52279:103::-;49807:15;:13;:15::i;:::-;52368:6:::1;52356:9;:18;;;;;;;;;;;;:::i;:::-;;52279:103:::0;:::o;25742:185::-;25880:39;25897:4;25903:2;25907:7;25880:39;;;;;;;;;;;;:16;:39::i;:::-;25742:185;;;:::o;38310:233::-;38385:7;38421:30;:28;:30::i;:::-;38413:5;:38;38405:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38518:10;38529:5;38518:17;;;;;;;;:::i;:::-;;;;;;;;;;38511:24;;38310:233;;;:::o;22833:222::-;22905:7;22925:13;22941:7;:16;22949:7;22941:16;;;;;;;;;;;;;;;;;;;;;22925:32;;22993:1;22976:19;;:5;:19;;;;22968:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23042:5;23035:12;;;22833:222;;;:::o;22564:207::-;22636:7;22681:1;22664:19;;:5;:19;;;;22656:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22747:9;:16;22757:5;22747:16;;;;;;;;;;;;;;;;22740:23;;22564:207;;;:::o;50195:123::-;49807:15;:13;:15::i;:::-;50285:25:::1;50298:11;50285:12;:25::i;:::-;50195:123:::0;:::o;23291:104::-;23347:13;23380:7;23373:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23291:104;:::o;24878:155::-;24973:52;24992:12;:10;:12::i;:::-;25006:8;25016;24973:18;:52::i;:::-;24878:155;;:::o;25998:323::-;26172:41;26191:12;:10;:12::i;:::-;26205:7;26172:18;:41::i;:::-;26164:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26275:38;26289:4;26295:2;26299:7;26308:4;26275:13;:38::i;:::-;25998:323;;;;:::o;52585:240::-;52658:13;52684:23;52699:7;52684:14;:23::i;:::-;52753:1;52733:9;52727:23;;;;;:::i;:::-;;;:27;:90;;;;;;;;;;;;;;;;;52781:9;52792:18;:7;:16;:18::i;:::-;52764:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52727:90;52720:97;;52585:240;;;:::o;25104:164::-;25201:4;25225:18;:25;25244:5;25225:25;;;;;;;;;;;;;;;:35;25251:8;25225:35;;;;;;;;;;;;;;;;;;;;;;;;;25218:42;;25104:164;;;;:::o;49345:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;45924:215::-;46026:4;46065:26;46050:41;;;:11;:41;;;;:81;;;;46095:36;46119:11;46095:23;:36::i;:::-;46050:81;46043:88;;45924:215;;;:::o;49920:136::-;49986:8;:22;49995:12;:10;:12::i;:::-;49986:22;;;;;;;;;;;;;;;;;;;;;;;;;49978:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49920:136::o;47286:332::-;47405:17;:15;:17::i;:::-;47389:33;;:12;:33;;;;47381:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;47508:1;47488:22;;:8;:22;;;;47480:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47575:35;;;;;;;;47587:8;47575:35;;;;;;47597:12;47575:35;;;;;47553:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47286:332;;:::o;32610:135::-;32692:16;32700:7;32692;:16::i;:::-;32684:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32610:135;:::o;17028:98::-;17081:7;17108:10;17101:17;;17028:98;:::o;31889:174::-;31991:2;31964:15;:24;31980:7;31964:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32047:7;32043:2;32009:46;;32018:23;32033:7;32018:14;:23::i;:::-;32009:46;;;;;;;;;;;;31889:174;;:::o;28728:110::-;28804:26;28814:2;28818:7;28804:26;;;;;;;;;;;;:9;:26::i;:::-;28728:110;;:::o;51049:174::-;51132:37;51150:11;51163:5;51132:17;:37::i;:::-;51203:11;51187:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51049:174;:::o;28122:264::-;28215:4;28232:13;28248:23;28263:7;28248:14;:23::i;:::-;28232:39;;28301:5;28290:16;;:7;:16;;;:52;;;;28310:32;28327:5;28334:7;28310:16;:32::i;:::-;28290:52;:87;;;;28370:7;28346:31;;:20;28358:7;28346:11;:20::i;:::-;:31;;;28290:87;28282:96;;;28122:264;;;;:::o;31145:625::-;31304:4;31277:31;;:23;31292:7;31277:14;:23::i;:::-;:31;;;31269:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31383:1;31369:16;;:2;:16;;;;31361:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31439:39;31460:4;31466:2;31470:7;31439:20;:39::i;:::-;31543:29;31560:1;31564:7;31543:8;:29::i;:::-;31604:1;31585:9;:15;31595:4;31585:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31633:1;31616:9;:13;31626:2;31616:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31664:2;31645:7;:16;31653:7;31645:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31703:7;31699:2;31684:27;;31693:4;31684:27;;;;;;;;;;;;31724:38;31744:4;31750:2;31754:7;31724:19;:38::i;:::-;31145:625;;;:::o;46918:97::-;46976:6;47002:5;46995:12;;46918:97;:::o;50734:168::-;50814:36;50832:11;50845:4;50814:17;:36::i;:::-;50882:11;50868:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50734:168;:::o;32206:315::-;32361:8;32352:17;;:5;:17;;;;32344:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32448:8;32410:18;:25;32429:5;32410:25;;;;;;;;;;;;;;;:35;32436:8;32410:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32494:8;32472:41;;32487:5;32472:41;;;32504:8;32472:41;;;;;;:::i;:::-;;;;;;;;32206:315;;;:::o;27202:313::-;27358:28;27368:4;27374:2;27378:7;27358:9;:28::i;:::-;27405:47;27428:4;27434:2;27438:7;27447:4;27405:22;:47::i;:::-;27397:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27202:313;;;;:::o;17680:723::-;17736:13;17966:1;17957:5;:10;17953:53;;;17984:10;;;;;;;;;;;;;;;;;;;;;17953:53;18016:12;18031:5;18016:20;;18047:14;18072:78;18087:1;18079:4;:9;18072:78;;18105:8;;;;;:::i;:::-;;;;18136:2;18128:10;;;;;:::i;:::-;;;18072:78;;;18160:19;18192:6;18182:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18160:39;;18210:154;18226:1;18217:5;:10;18210:154;;18254:1;18244:11;;;;;:::i;:::-;;;18321:2;18313:5;:10;;;;:::i;:::-;18300:2;:24;;;;:::i;:::-;18287:39;;18270:6;18277;18270:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18350:2;18341:11;;;;;:::i;:::-;;;18210:154;;;18388:6;18374:21;;;;;17680:723;;;;:::o;37480:224::-;37582:4;37621:35;37606:50;;;:11;:50;;;;:90;;;;37660:36;37684:11;37660:23;:36::i;:::-;37606:90;37599:97;;37480:224;;;:::o;27828:127::-;27893:4;27945:1;27917:30;;:7;:16;27925:7;27917:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27910:37;;27828:127;;;:::o;29065:319::-;29194:18;29200:2;29204:7;29194:5;:18::i;:::-;29245:53;29276:1;29280:2;29284:7;29293:4;29245:22;:53::i;:::-;29223:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;29065:319;;;:::o;51372:215::-;51477:6;51472:108;51493:11;:18;51489:1;:22;51472:108;;;51560:8;51533;:24;51542:11;51554:1;51542:14;;;;;;;;:::i;:::-;;;;;;;;51533:24;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;51513:3;;;;;:::i;:::-;;;;51472:108;;;;51372:215;;:::o;54036:204::-;54187:45;54214:4;54220:2;54224:7;54187:26;:45::i;:::-;54036:204;;;:::o;35245:125::-;;;;:::o;33309:853::-;33463:4;33484:15;:2;:13;;;:15::i;:::-;33480:675;;;33536:2;33520:36;;;33557:12;:10;:12::i;:::-;33571:4;33577:7;33586:4;33520:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33516:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33778:1;33761:6;:13;:18;33757:328;;;33804:60;;;;;;;;;;:::i;:::-;;;;;;;;33757:328;34035:6;34029:13;34020:6;34016:2;34012:15;34005:38;33516:584;33652:41;;;33642:51;;;:6;:51;;;;33635:58;;;;;33480:675;34139:4;34132:11;;33309:853;;;;;;;:::o;22195:305::-;22297:4;22349:25;22334:40;;;:11;:40;;;;:105;;;;22406:33;22391:48;;;:11;:48;;;;22334:105;:158;;;;22456:36;22480:11;22456:23;:36::i;:::-;22334:158;22314:178;;22195:305;;;:::o;29720:439::-;29814:1;29800:16;;:2;:16;;;;29792:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29873:16;29881:7;29873;:16::i;:::-;29872:17;29864:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29935:45;29964:1;29968:2;29972:7;29935:20;:45::i;:::-;30010:1;29993:9;:13;30003:2;29993:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30041:2;30022:7;:16;30030:7;30022:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30086:7;30082:2;30061:33;;30078:1;30061:33;;;;;;;;;;;;30107:44;30135:1;30139:2;30143:7;30107:19;:44::i;:::-;29720:439;;:::o;39156:589::-;39300:45;39327:4;39333:2;39337:7;39300:26;:45::i;:::-;39378:1;39362:18;;:4;:18;;;39358:187;;;39397:40;39429:7;39397:31;:40::i;:::-;39358:187;;;39467:2;39459:10;;:4;:10;;;39455:90;;39486:47;39519:4;39525:7;39486:32;:47::i;:::-;39455:90;39358:187;39573:1;39559:16;;:2;:16;;;39555:183;;;39592:45;39629:7;39592:36;:45::i;:::-;39555:183;;;39665:4;39659:10;;:2;:10;;;39655:83;;39686:40;39714:2;39718:7;39686:27;:40::i;:::-;39655:83;39555:183;39156:589;;;:::o;9021:326::-;9081:4;9338:1;9316:7;:19;;;:23;9309:30;;9021:326;;;:::o;20618:157::-;20703:4;20742:25;20727:40;;;:11;:40;;;;20720:47;;20618:157;;;:::o;34734:126::-;;;;:::o;40468:164::-;40572:10;:17;;;;40545:15;:24;40561:7;40545:24;;;;;;;;;;;:44;;;;40600:10;40616:7;40600:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40468:164;:::o;41259:988::-;41525:22;41575:1;41550:22;41567:4;41550:16;:22::i;:::-;:26;;;;:::i;:::-;41525:51;;41587:18;41608:17;:26;41626:7;41608:26;;;;;;;;;;;;41587:47;;41755:14;41741:10;:28;41737:328;;41786:19;41808:12;:18;41821:4;41808:18;;;;;;;;;;;;;;;:34;41827:14;41808:34;;;;;;;;;;;;41786:56;;41892:11;41859:12;:18;41872:4;41859:18;;;;;;;;;;;;;;;:30;41878:10;41859:30;;;;;;;;;;;:44;;;;42009:10;41976:17;:30;41994:11;41976:30;;;;;;;;;;;:43;;;;41771:294;41737:328;42161:17;:26;42179:7;42161:26;;;;;;;;;;;42154:33;;;42205:12;:18;42218:4;42205:18;;;;;;;;;;;;;;;:34;42224:14;42205:34;;;;;;;;;;;42198:41;;;41340:907;;41259:988;;:::o;42542:1079::-;42795:22;42840:1;42820:10;:17;;;;:21;;;;:::i;:::-;42795:46;;42852:18;42873:15;:24;42889:7;42873:24;;;;;;;;;;;;42852:45;;43224:19;43246:10;43257:14;43246:26;;;;;;;;:::i;:::-;;;;;;;;;;43224:48;;43310:11;43285:10;43296;43285:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43421:10;43390:15;:28;43406:11;43390:28;;;;;;;;;;;:41;;;;43562:15;:24;43578:7;43562:24;;;;;;;;;;;43555:31;;;43597:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42613:1008;;;42542:1079;:::o;40046:221::-;40131:14;40148:20;40165:2;40148:16;:20::i;:::-;40131:37;;40206:7;40179:12;:16;40192:2;40179:16;;;;;;;;;;;;;;;:24;40196:6;40179:24;;;;;;;;;;;:34;;;;40253:6;40224:17;:26;40242:7;40224:26;;;;;;;;;;;:35;;;;40120:147;40046:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:307::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3344:1;3339:3;3335:11;3329:18;3325:1;3320:3;3316:11;3309:39;3281:2;3278:1;3274:10;3269:15;;3245:113;;;3376:6;3373:1;3370:13;3367:101;;;3456:1;3447:6;3442:3;3438:16;3431:27;3367:101;3216:258;3167:307;;;:::o;3480:102::-;3521:6;3572:2;3568:7;3563:2;3556:5;3552:14;3548:28;3538:38;;3480:102;;;:::o;3588:364::-;3676:3;3704:39;3737:5;3704:39;:::i;:::-;3759:71;3823:6;3818:3;3759:71;:::i;:::-;3752:78;;3839:52;3884:6;3879:3;3872:4;3865:5;3861:16;3839:52;:::i;:::-;3916:29;3938:6;3916:29;:::i;:::-;3911:3;3907:39;3900:46;;3680:272;3588:364;;;;:::o;3958:313::-;4071:4;4109:2;4098:9;4094:18;4086:26;;4158:9;4152:4;4148:20;4144:1;4133:9;4129:17;4122:47;4186:78;4259:4;4250:6;4186:78;:::i;:::-;4178:86;;3958:313;;;;:::o;4277:77::-;4314:7;4343:5;4332:16;;4277:77;;;:::o;4360:122::-;4433:24;4451:5;4433:24;:::i;:::-;4426:5;4423:35;4413:63;;4472:1;4469;4462:12;4413:63;4360:122;:::o;4488:139::-;4534:5;4572:6;4559:20;4550:29;;4588:33;4615:5;4588:33;:::i;:::-;4488:139;;;;:::o;4633:329::-;4692:6;4741:2;4729:9;4720:7;4716:23;4712:32;4709:119;;;4747:79;;:::i;:::-;4709:119;4867:1;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4838:117;4633:329;;;;:::o;4968:118::-;5055:24;5073:5;5055:24;:::i;:::-;5050:3;5043:37;4968:118;;:::o;5092:222::-;5185:4;5223:2;5212:9;5208:18;5200:26;;5236:71;5304:1;5293:9;5289:17;5280:6;5236:71;:::i;:::-;5092:222;;;;:::o;5320:474::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:53;5769:7;5760:6;5749:9;5745:22;5724:53;:::i;:::-;5714:63;;5669:118;5320:474;;;;;:::o;5800:117::-;5909:1;5906;5899:12;5923:117;6032:1;6029;6022:12;6046:117;6155:1;6152;6145:12;6186:568;6259:8;6269:6;6319:3;6312:4;6304:6;6300:17;6296:27;6286:122;;6327:79;;:::i;:::-;6286:122;6440:6;6427:20;6417:30;;6470:18;6462:6;6459:30;6456:117;;;6492:79;;:::i;:::-;6456:117;6606:4;6598:6;6594:17;6582:29;;6660:3;6652:4;6644:6;6640:17;6630:8;6626:32;6623:41;6620:128;;;6667:79;;:::i;:::-;6620:128;6186:568;;;;;:::o;6779:595::-;6879:8;6889:6;6939:3;6932:4;6924:6;6920:17;6916:27;6906:122;;6947:79;;:::i;:::-;6906:122;7060:6;7047:20;7037:30;;7090:18;7082:6;7079:30;7076:117;;;7112:79;;:::i;:::-;7076:117;7226:4;7218:6;7214:17;7202:29;;7280:3;7272:4;7264:6;7260:17;7250:8;7246:32;7243:41;7240:128;;;7287:79;;:::i;:::-;7240:128;6779:595;;;;;:::o;7380:988::-;7529:6;7537;7545;7553;7602:2;7590:9;7581:7;7577:23;7573:32;7570:119;;;7608:79;;:::i;:::-;7570:119;7756:1;7745:9;7741:17;7728:31;7786:18;7778:6;7775:30;7772:117;;;7808:79;;:::i;:::-;7772:117;7921:80;7993:7;7984:6;7973:9;7969:22;7921:80;:::i;:::-;7903:98;;;;7699:312;8078:2;8067:9;8063:18;8050:32;8109:18;8101:6;8098:30;8095:117;;;8131:79;;:::i;:::-;8095:117;8244:107;8343:7;8334:6;8323:9;8319:22;8244:107;:::i;:::-;8226:125;;;;8021:340;7380:988;;;;;;;:::o;8374:180::-;8422:77;8419:1;8412:88;8519:4;8516:1;8509:15;8543:4;8540:1;8533:15;8560:281;8643:27;8665:4;8643:27;:::i;:::-;8635:6;8631:40;8773:6;8761:10;8758:22;8737:18;8725:10;8722:34;8719:62;8716:88;;;8784:18;;:::i;:::-;8716:88;8824:10;8820:2;8813:22;8603:238;8560:281;;:::o;8847:129::-;8881:6;8908:20;;:::i;:::-;8898:30;;8937:33;8965:4;8957:6;8937:33;:::i;:::-;8847:129;;;:::o;8982:311::-;9059:4;9149:18;9141:6;9138:30;9135:56;;;9171:18;;:::i;:::-;9135:56;9221:4;9213:6;9209:17;9201:25;;9281:4;9275;9271:15;9263:23;;8982:311;;;:::o;9316:710::-;9412:5;9437:81;9453:64;9510:6;9453:64;:::i;:::-;9437:81;:::i;:::-;9428:90;;9538:5;9567:6;9560:5;9553:21;9601:4;9594:5;9590:16;9583:23;;9654:4;9646:6;9642:17;9634:6;9630:30;9683:3;9675:6;9672:15;9669:122;;;9702:79;;:::i;:::-;9669:122;9817:6;9800:220;9834:6;9829:3;9826:15;9800:220;;;9909:3;9938:37;9971:3;9959:10;9938:37;:::i;:::-;9933:3;9926:50;10005:4;10000:3;9996:14;9989:21;;9876:144;9860:4;9855:3;9851:14;9844:21;;9800:220;;;9804:21;9418:608;;9316:710;;;;;:::o;10049:370::-;10120:5;10169:3;10162:4;10154:6;10150:17;10146:27;10136:122;;10177:79;;:::i;:::-;10136:122;10294:6;10281:20;10319:94;10409:3;10401:6;10394:4;10386:6;10382:17;10319:94;:::i;:::-;10310:103;;10126:293;10049:370;;;;:::o;10425:539::-;10509:6;10558:2;10546:9;10537:7;10533:23;10529:32;10526:119;;;10564:79;;:::i;:::-;10526:119;10712:1;10701:9;10697:17;10684:31;10742:18;10734:6;10731:30;10728:117;;;10764:79;;:::i;:::-;10728:117;10869:78;10939:7;10930:6;10919:9;10915:22;10869:78;:::i;:::-;10859:88;;10655:302;10425:539;;;;:::o;10970:118::-;11057:24;11075:5;11057:24;:::i;:::-;11052:3;11045:37;10970:118;;:::o;11094:222::-;11187:4;11225:2;11214:9;11210:18;11202:26;;11238:71;11306:1;11295:9;11291:17;11282:6;11238:71;:::i;:::-;11094:222;;;;:::o;11322:619::-;11399:6;11407;11415;11464:2;11452:9;11443:7;11439:23;11435:32;11432:119;;;11470:79;;:::i;:::-;11432:119;11590:1;11615:53;11660:7;11651:6;11640:9;11636:22;11615:53;:::i;:::-;11605:63;;11561:117;11717:2;11743:53;11788:7;11779:6;11768:9;11764:22;11743:53;:::i;:::-;11733:63;;11688:118;11845:2;11871:53;11916:7;11907:6;11896:9;11892:22;11871:53;:::i;:::-;11861:63;;11816:118;11322:619;;;;;:::o;11947:474::-;12015:6;12023;12072:2;12060:9;12051:7;12047:23;12043:32;12040:119;;;12078:79;;:::i;:::-;12040:119;12198:1;12223:53;12268:7;12259:6;12248:9;12244:22;12223:53;:::i;:::-;12213:63;;12169:117;12325:2;12351:53;12396:7;12387:6;12376:9;12372:22;12351:53;:::i;:::-;12341:63;;12296:118;11947:474;;;;;:::o;12427:332::-;12548:4;12586:2;12575:9;12571:18;12563:26;;12599:71;12667:1;12656:9;12652:17;12643:6;12599:71;:::i;:::-;12680:72;12748:2;12737:9;12733:18;12724:6;12680:72;:::i;:::-;12427:332;;;;;:::o;12765:117::-;12874:1;12871;12864:12;12888:308;12950:4;13040:18;13032:6;13029:30;13026:56;;;13062:18;;:::i;:::-;13026:56;13100:29;13122:6;13100:29;:::i;:::-;13092:37;;13184:4;13178;13174:15;13166:23;;12888:308;;;:::o;13202:154::-;13286:6;13281:3;13276;13263:30;13348:1;13339:6;13334:3;13330:16;13323:27;13202:154;;;:::o;13362:412::-;13440:5;13465:66;13481:49;13523:6;13481:49;:::i;:::-;13465:66;:::i;:::-;13456:75;;13554:6;13547:5;13540:21;13592:4;13585:5;13581:16;13630:3;13621:6;13616:3;13612:16;13609:25;13606:112;;;13637:79;;:::i;:::-;13606:112;13727:41;13761:6;13756:3;13751;13727:41;:::i;:::-;13446:328;13362:412;;;;;:::o;13794:340::-;13850:5;13899:3;13892:4;13884:6;13880:17;13876:27;13866:122;;13907:79;;:::i;:::-;13866:122;14024:6;14011:20;14049:79;14124:3;14116:6;14109:4;14101:6;14097:17;14049:79;:::i;:::-;14040:88;;13856:278;13794:340;;;;:::o;14140:509::-;14209:6;14258:2;14246:9;14237:7;14233:23;14229:32;14226:119;;;14264:79;;:::i;:::-;14226:119;14412:1;14401:9;14397:17;14384:31;14442:18;14434:6;14431:30;14428:117;;;14464:79;;:::i;:::-;14428:117;14569:63;14624:7;14615:6;14604:9;14600:22;14569:63;:::i;:::-;14559:73;;14355:287;14140:509;;;;:::o;14655:329::-;14714:6;14763:2;14751:9;14742:7;14738:23;14734:32;14731:119;;;14769:79;;:::i;:::-;14731:119;14889:1;14914:53;14959:7;14950:6;14939:9;14935:22;14914:53;:::i;:::-;14904:63;;14860:117;14655:329;;;;:::o;14990:116::-;15060:21;15075:5;15060:21;:::i;:::-;15053:5;15050:32;15040:60;;15096:1;15093;15086:12;15040:60;14990:116;:::o;15112:133::-;15155:5;15193:6;15180:20;15171:29;;15209:30;15233:5;15209:30;:::i;:::-;15112:133;;;;:::o;15251:468::-;15316:6;15324;15373:2;15361:9;15352:7;15348:23;15344:32;15341:119;;;15379:79;;:::i;:::-;15341:119;15499:1;15524:53;15569:7;15560:6;15549:9;15545:22;15524:53;:::i;:::-;15514:63;;15470:117;15626:2;15652:50;15694:7;15685:6;15674:9;15670:22;15652:50;:::i;:::-;15642:60;;15597:115;15251:468;;;;;:::o;15725:307::-;15786:4;15876:18;15868:6;15865:30;15862:56;;;15898:18;;:::i;:::-;15862:56;15936:29;15958:6;15936:29;:::i;:::-;15928:37;;16020:4;16014;16010:15;16002:23;;15725:307;;;:::o;16038:410::-;16115:5;16140:65;16156:48;16197:6;16156:48;:::i;:::-;16140:65;:::i;:::-;16131:74;;16228:6;16221:5;16214:21;16266:4;16259:5;16255:16;16304:3;16295:6;16290:3;16286:16;16283:25;16280:112;;;16311:79;;:::i;:::-;16280:112;16401:41;16435:6;16430:3;16425;16401:41;:::i;:::-;16121:327;16038:410;;;;;:::o;16467:338::-;16522:5;16571:3;16564:4;16556:6;16552:17;16548:27;16538:122;;16579:79;;:::i;:::-;16538:122;16696:6;16683:20;16721:78;16795:3;16787:6;16780:4;16772:6;16768:17;16721:78;:::i;:::-;16712:87;;16528:277;16467:338;;;;:::o;16811:943::-;16906:6;16914;16922;16930;16979:3;16967:9;16958:7;16954:23;16950:33;16947:120;;;16986:79;;:::i;:::-;16947:120;17106:1;17131:53;17176:7;17167:6;17156:9;17152:22;17131:53;:::i;:::-;17121:63;;17077:117;17233:2;17259:53;17304:7;17295:6;17284:9;17280:22;17259:53;:::i;:::-;17249:63;;17204:118;17361:2;17387:53;17432:7;17423:6;17412:9;17408:22;17387:53;:::i;:::-;17377:63;;17332:118;17517:2;17506:9;17502:18;17489:32;17548:18;17540:6;17537:30;17534:117;;;17570:79;;:::i;:::-;17534:117;17675:62;17729:7;17720:6;17709:9;17705:22;17675:62;:::i;:::-;17665:72;;17460:287;16811:943;;;;;;;:::o;17760:474::-;17828:6;17836;17885:2;17873:9;17864:7;17860:23;17856:32;17853:119;;;17891:79;;:::i;:::-;17853:119;18011:1;18036:53;18081:7;18072:6;18061:9;18057:22;18036:53;:::i;:::-;18026:63;;17982:117;18138:2;18164:53;18209:7;18200:6;18189:9;18185:22;18164:53;:::i;:::-;18154:63;;18109:118;17760:474;;;;;:::o;18240:180::-;18288:77;18285:1;18278:88;18385:4;18382:1;18375:15;18409:4;18406:1;18399:15;18426:320;18470:6;18507:1;18501:4;18497:12;18487:22;;18554:1;18548:4;18544:12;18575:18;18565:81;;18631:4;18623:6;18619:17;18609:27;;18565:81;18693:2;18685:6;18682:14;18662:18;18659:38;18656:84;;;18712:18;;:::i;:::-;18656:84;18477:269;18426:320;;;:::o;18752:220::-;18892:34;18888:1;18880:6;18876:14;18869:58;18961:3;18956:2;18948:6;18944:15;18937:28;18752:220;:::o;18978:366::-;19120:3;19141:67;19205:2;19200:3;19141:67;:::i;:::-;19134:74;;19217:93;19306:3;19217:93;:::i;:::-;19335:2;19330:3;19326:12;19319:19;;18978:366;;;:::o;19350:419::-;19516:4;19554:2;19543:9;19539:18;19531:26;;19603:9;19597:4;19593:20;19589:1;19578:9;19574:17;19567:47;19631:131;19757:4;19631:131;:::i;:::-;19623:139;;19350:419;;;:::o;19775:249::-;19915:34;19911:1;19903:6;19899:14;19892:58;19984:32;19979:2;19971:6;19967:15;19960:57;19775:249;:::o;20030:366::-;20172:3;20193:67;20257:2;20252:3;20193:67;:::i;:::-;20186:74;;20269:93;20358:3;20269:93;:::i;:::-;20387:2;20382:3;20378:12;20371:19;;20030:366;;;:::o;20402:419::-;20568:4;20606:2;20595:9;20591:18;20583:26;;20655:9;20649:4;20645:20;20641:1;20630:9;20626:17;20619:47;20683:131;20809:4;20683:131;:::i;:::-;20675:139;;20402:419;;;:::o;20827:229::-;20967:34;20963:1;20955:6;20951:14;20944:58;21036:12;21031:2;21023:6;21019:15;21012:37;20827:229;:::o;21062:366::-;21204:3;21225:67;21289:2;21284:3;21225:67;:::i;:::-;21218:74;;21301:93;21390:3;21301:93;:::i;:::-;21419:2;21414:3;21410:12;21403:19;;21062:366;;;:::o;21434:419::-;21600:4;21638:2;21627:9;21623:18;21615:26;;21687:9;21681:4;21677:20;21673:1;21662:9;21658:17;21651:47;21715:131;21841:4;21715:131;:::i;:::-;21707:139;;21434:419;;;:::o;21859:180::-;21907:77;21904:1;21897:88;22004:4;22001:1;21994:15;22028:4;22025:1;22018:15;22045:117;22154:1;22151;22144:12;22168:117;22277:1;22274;22267:12;22291:117;22400:1;22397;22390:12;22414:740;22507:4;22513:6;22569:11;22556:25;22669:1;22663:4;22659:12;22648:8;22632:14;22628:29;22624:48;22604:18;22600:73;22590:168;;22677:79;;:::i;:::-;22590:168;22789:18;22779:8;22775:33;22767:41;;22841:4;22828:18;22818:28;;22869:18;22861:6;22858:30;22855:117;;;22891:79;;:::i;:::-;22855:117;22999:2;22993:4;22989:13;22981:21;;23056:4;23048:6;23044:17;23028:14;23024:38;23018:4;23014:49;23011:136;;;23066:79;;:::i;:::-;23011:136;22520:634;22414:740;;;;;:::o;23160:180::-;23208:77;23205:1;23198:88;23305:4;23302:1;23295:15;23329:4;23326:1;23319:15;23346:233;23385:3;23408:24;23426:5;23408:24;:::i;:::-;23399:33;;23454:66;23447:5;23444:77;23441:103;;;23524:18;;:::i;:::-;23441:103;23571:1;23564:5;23560:13;23553:20;;23346:233;;;:::o;23585:::-;23725:34;23721:1;23713:6;23709:14;23702:58;23794:16;23789:2;23781:6;23777:15;23770:41;23585:233;:::o;23824:366::-;23966:3;23987:67;24051:2;24046:3;23987:67;:::i;:::-;23980:74;;24063:93;24152:3;24063:93;:::i;:::-;24181:2;24176:3;24172:12;24165:19;;23824:366;;;:::o;24196:419::-;24362:4;24400:2;24389:9;24385:18;24377:26;;24449:9;24443:4;24439:20;24435:1;24424:9;24420:17;24413:47;24477:131;24603:4;24477:131;:::i;:::-;24469:139;;24196:419;;;:::o;24621:348::-;24661:7;24684:20;24702:1;24684:20;:::i;:::-;24679:25;;24718:20;24736:1;24718:20;:::i;:::-;24713:25;;24906:1;24838:66;24834:74;24831:1;24828:81;24823:1;24816:9;24809:17;24805:105;24802:131;;;24913:18;;:::i;:::-;24802:131;24961:1;24958;24954:9;24943:20;;24621:348;;;;:::o;24975:180::-;25023:77;25020:1;25013:88;25120:4;25117:1;25110:15;25144:4;25141:1;25134:15;25161:185;25201:1;25218:20;25236:1;25218:20;:::i;:::-;25213:25;;25252:20;25270:1;25252:20;:::i;:::-;25247:25;;25291:1;25281:35;;25296:18;;:::i;:::-;25281:35;25338:1;25335;25331:9;25326:14;;25161:185;;;;:::o;25352:230::-;25492:34;25488:1;25480:6;25476:14;25469:58;25561:13;25556:2;25548:6;25544:15;25537:38;25352:230;:::o;25588:366::-;25730:3;25751:67;25815:2;25810:3;25751:67;:::i;:::-;25744:74;;25827:93;25916:3;25827:93;:::i;:::-;25945:2;25940:3;25936:12;25929:19;;25588:366;;;:::o;25960:419::-;26126:4;26164:2;26153:9;26149:18;26141:26;;26213:9;26207:4;26203:20;26199:1;26188:9;26184:17;26177:47;26241:131;26367:4;26241:131;:::i;:::-;26233:139;;25960:419;;;:::o;26385:231::-;26525:34;26521:1;26513:6;26509:14;26502:58;26594:14;26589:2;26581:6;26577:15;26570:39;26385:231;:::o;26622:366::-;26764:3;26785:67;26849:2;26844:3;26785:67;:::i;:::-;26778:74;;26861:93;26950:3;26861:93;:::i;:::-;26979:2;26974:3;26970:12;26963:19;;26622:366;;;:::o;26994:419::-;27160:4;27198:2;27187:9;27183:18;27175:26;;27247:9;27241:4;27237:20;27233:1;27222:9;27218:17;27211:47;27275:131;27401:4;27275:131;:::i;:::-;27267:139;;26994:419;;;:::o;27419:174::-;27559:26;27555:1;27547:6;27543:14;27536:50;27419:174;:::o;27599:366::-;27741:3;27762:67;27826:2;27821:3;27762:67;:::i;:::-;27755:74;;27838:93;27927:3;27838:93;:::i;:::-;27956:2;27951:3;27947:12;27940:19;;27599:366;;;:::o;27971:419::-;28137:4;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;27971:419;;;:::o;28396:228::-;28536:34;28532:1;28524:6;28520:14;28513:58;28605:11;28600:2;28592:6;28588:15;28581:36;28396:228;:::o;28630:366::-;28772:3;28793:67;28857:2;28852:3;28793:67;:::i;:::-;28786:74;;28869:93;28958:3;28869:93;:::i;:::-;28987:2;28982:3;28978:12;28971:19;;28630:366;;;:::o;29002:419::-;29168:4;29206:2;29195:9;29191:18;29183:26;;29255:9;29249:4;29245:20;29241:1;29230:9;29226:17;29219:47;29283:131;29409:4;29283:131;:::i;:::-;29275:139;;29002:419;;;:::o;29427:148::-;29529:11;29566:3;29551:18;;29427:148;;;;:::o;29581:141::-;29630:4;29653:3;29645:11;;29676:3;29673:1;29666:14;29710:4;29707:1;29697:18;29689:26;;29581:141;;;:::o;29752:845::-;29855:3;29892:5;29886:12;29921:36;29947:9;29921:36;:::i;:::-;29973:89;30055:6;30050:3;29973:89;:::i;:::-;29966:96;;30093:1;30082:9;30078:17;30109:1;30104:137;;;;30255:1;30250:341;;;;30071:520;;30104:137;30188:4;30184:9;30173;30169:25;30164:3;30157:38;30224:6;30219:3;30215:16;30208:23;;30104:137;;30250:341;30317:38;30349:5;30317:38;:::i;:::-;30377:1;30391:154;30405:6;30402:1;30399:13;30391:154;;;30479:7;30473:14;30469:1;30464:3;30460:11;30453:35;30529:1;30520:7;30516:15;30505:26;;30427:4;30424:1;30420:12;30415:17;;30391:154;;;30574:6;30569:3;30565:16;30558:23;;30257:334;;30071:520;;29859:738;;29752:845;;;;:::o;30603:377::-;30709:3;30737:39;30770:5;30737:39;:::i;:::-;30792:89;30874:6;30869:3;30792:89;:::i;:::-;30785:96;;30890:52;30935:6;30930:3;30923:4;30916:5;30912:16;30890:52;:::i;:::-;30967:6;30962:3;30958:16;30951:23;;30713:267;30603:377;;;;:::o;30986:429::-;31163:3;31185:92;31273:3;31264:6;31185:92;:::i;:::-;31178:99;;31294:95;31385:3;31376:6;31294:95;:::i;:::-;31287:102;;31406:3;31399:10;;30986:429;;;;;:::o;31421:222::-;31561:34;31557:1;31549:6;31545:14;31538:58;31630:5;31625:2;31617:6;31613:15;31606:30;31421:222;:::o;31649:366::-;31791:3;31812:67;31876:2;31871:3;31812:67;:::i;:::-;31805:74;;31888:93;31977:3;31888:93;:::i;:::-;32006:2;32001:3;31997:12;31990:19;;31649:366;;;:::o;32021:419::-;32187:4;32225:2;32214:9;32210:18;32202:26;;32274:9;32268:4;32264:20;32260:1;32249:9;32245:17;32238:47;32302:131;32428:4;32302:131;:::i;:::-;32294:139;;32021:419;;;:::o;32446:229::-;32586:34;32582:1;32574:6;32570:14;32563:58;32655:12;32650:2;32642:6;32638:15;32631:37;32446:229;:::o;32681:366::-;32823:3;32844:67;32908:2;32903:3;32844:67;:::i;:::-;32837:74;;32920:93;33009:3;32920:93;:::i;:::-;33038:2;33033:3;33029:12;33022:19;;32681:366;;;:::o;33053:419::-;33219:4;33257:2;33246:9;33242:18;33234:26;;33306:9;33300:4;33296:20;33292:1;33281:9;33277:17;33270:47;33334:131;33460:4;33334:131;:::i;:::-;33326:139;;33053:419;;;:::o;33478:175::-;33618:27;33614:1;33606:6;33602:14;33595:51;33478:175;:::o;33659:366::-;33801:3;33822:67;33886:2;33881:3;33822:67;:::i;:::-;33815:74;;33898:93;33987:3;33898:93;:::i;:::-;34016:2;34011:3;34007:12;34000:19;;33659:366;;;:::o;34031:419::-;34197:4;34235:2;34224:9;34220:18;34212:26;;34284:9;34278:4;34274:20;34270:1;34259:9;34255:17;34248:47;34312:131;34438:4;34312:131;:::i;:::-;34304:139;;34031:419;;;:::o;34456:114::-;34523:6;34557:5;34551:12;34541:22;;34456:114;;;:::o;34576:163::-;34693:11;34730:3;34715:18;;34576:163;;;;:::o;34745:132::-;34812:4;34835:3;34827:11;;34865:4;34860:3;34856:14;34848:22;;34745:132;;;:::o;34883:116::-;34968:24;34986:5;34968:24;:::i;:::-;34963:3;34956:37;34883:116;;:::o;35005:195::-;35082:10;35103:54;35153:3;35145:6;35103:54;:::i;:::-;35189:4;35184:3;35180:14;35166:28;;35005:195;;;;:::o;35206:113::-;35276:4;35308;35303:3;35299:14;35291:22;;35206:113;;;:::o;35355:776::-;35492:3;35521:54;35569:5;35521:54;:::i;:::-;35591:104;35688:6;35683:3;35591:104;:::i;:::-;35584:111;;35719:56;35769:5;35719:56;:::i;:::-;35798:7;35829:1;35814:292;35839:6;35836:1;35833:13;35814:292;;;35915:6;35909:13;35942:71;36009:3;35994:13;35942:71;:::i;:::-;35935:78;;36036:60;36089:6;36036:60;:::i;:::-;36026:70;;35874:232;35861:1;35858;35854:9;35849:14;;35814:292;;;35818:14;36122:3;36115:10;;35497:634;;;35355:776;;;;:::o;36137:335::-;36299:3;36321:125;36442:3;36433:6;36321:125;:::i;:::-;36314:132;;36463:3;36456:10;;36137:335;;;;:::o;36478:224::-;36618:34;36614:1;36606:6;36602:14;36595:58;36687:7;36682:2;36674:6;36670:15;36663:32;36478:224;:::o;36708:366::-;36850:3;36871:67;36935:2;36930:3;36871:67;:::i;:::-;36864:74;;36947:93;37036:3;36947:93;:::i;:::-;37065:2;37060:3;37056:12;37049:19;;36708:366;;;:::o;37080:419::-;37246:4;37284:2;37273:9;37269:18;37261:26;;37333:9;37327:4;37323:20;37319:1;37308:9;37304:17;37297:47;37361:131;37487:4;37361:131;:::i;:::-;37353:139;;37080:419;;;:::o;37505:223::-;37645:34;37641:1;37633:6;37629:14;37622:58;37714:6;37709:2;37701:6;37697:15;37690:31;37505:223;:::o;37734:366::-;37876:3;37897:67;37961:2;37956:3;37897:67;:::i;:::-;37890:74;;37973:93;38062:3;37973:93;:::i;:::-;38091:2;38086:3;38082:12;38075:19;;37734:366;;;:::o;38106:419::-;38272:4;38310:2;38299:9;38295:18;38287:26;;38359:9;38353:4;38349:20;38345:1;38334:9;38330:17;38323:47;38387:131;38513:4;38387:131;:::i;:::-;38379:139;;38106:419;;;:::o;38531:191::-;38571:4;38591:20;38609:1;38591:20;:::i;:::-;38586:25;;38625:20;38643:1;38625:20;:::i;:::-;38620:25;;38664:1;38661;38658:8;38655:34;;;38669:18;;:::i;:::-;38655:34;38714:1;38711;38707:9;38699:17;;38531:191;;;;:::o;38728:305::-;38768:3;38787:20;38805:1;38787:20;:::i;:::-;38782:25;;38821:20;38839:1;38821:20;:::i;:::-;38816:25;;38975:1;38907:66;38903:74;38900:1;38897:81;38894:107;;;38981:18;;:::i;:::-;38894:107;39025:1;39022;39018:9;39011:16;;38728:305;;;;:::o;39039:175::-;39179:27;39175:1;39167:6;39163:14;39156:51;39039:175;:::o;39220:366::-;39362:3;39383:67;39447:2;39442:3;39383:67;:::i;:::-;39376:74;;39459:93;39548:3;39459:93;:::i;:::-;39577:2;39572:3;39568:12;39561:19;;39220:366;;;:::o;39592:419::-;39758:4;39796:2;39785:9;39781:18;39773:26;;39845:9;39839:4;39835:20;39831:1;39820:9;39816:17;39809:47;39873:131;39999:4;39873:131;:::i;:::-;39865:139;;39592:419;;;:::o;40017:237::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:20;40221:2;40213:6;40209:15;40202:45;40017:237;:::o;40260:366::-;40402:3;40423:67;40487:2;40482:3;40423:67;:::i;:::-;40416:74;;40499:93;40588:3;40499:93;:::i;:::-;40617:2;40612:3;40608:12;40601:19;;40260:366;;;:::o;40632:419::-;40798:4;40836:2;40825:9;40821:18;40813:26;;40885:9;40879:4;40875:20;40871:1;40860:9;40856:17;40849:47;40913:131;41039:4;40913:131;:::i;:::-;40905:139;;40632:419;;;:::o;41057:176::-;41089:1;41106:20;41124:1;41106:20;:::i;:::-;41101:25;;41140:20;41158:1;41140:20;:::i;:::-;41135:25;;41179:1;41169:35;;41184:18;;:::i;:::-;41169:35;41225:1;41222;41218:9;41213:14;;41057:176;;;;:::o;41239:98::-;41290:6;41324:5;41318:12;41308:22;;41239:98;;;:::o;41343:168::-;41426:11;41460:6;41455:3;41448:19;41500:4;41495:3;41491:14;41476:29;;41343:168;;;;:::o;41517:360::-;41603:3;41631:38;41663:5;41631:38;:::i;:::-;41685:70;41748:6;41743:3;41685:70;:::i;:::-;41678:77;;41764:52;41809:6;41804:3;41797:4;41790:5;41786:16;41764:52;:::i;:::-;41841:29;41863:6;41841:29;:::i;:::-;41836:3;41832:39;41825:46;;41607:270;41517:360;;;;:::o;41883:640::-;42078:4;42116:3;42105:9;42101:19;42093:27;;42130:71;42198:1;42187:9;42183:17;42174:6;42130:71;:::i;:::-;42211:72;42279:2;42268:9;42264:18;42255:6;42211:72;:::i;:::-;42293;42361:2;42350:9;42346:18;42337:6;42293:72;:::i;:::-;42412:9;42406:4;42402:20;42397:2;42386:9;42382:18;42375:48;42440:76;42511:4;42502:6;42440:76;:::i;:::-;42432:84;;41883:640;;;;;;;:::o;42529:141::-;42585:5;42616:6;42610:13;42601:22;;42632:32;42658:5;42632:32;:::i;:::-;42529:141;;;;:::o;42676:349::-;42745:6;42794:2;42782:9;42773:7;42769:23;42765:32;42762:119;;;42800:79;;:::i;:::-;42762:119;42920:1;42945:63;43000:7;42991:6;42980:9;42976:22;42945:63;:::i;:::-;42935:73;;42891:127;42676:349;;;;:::o;43031:182::-;43171:34;43167:1;43159:6;43155:14;43148:58;43031:182;:::o;43219:366::-;43361:3;43382:67;43446:2;43441:3;43382:67;:::i;:::-;43375:74;;43458:93;43547:3;43458:93;:::i;:::-;43576:2;43571:3;43567:12;43560:19;;43219:366;;;:::o;43591:419::-;43757:4;43795:2;43784:9;43780:18;43772:26;;43844:9;43838:4;43834:20;43830:1;43819:9;43815:17;43808:47;43872:131;43998:4;43872:131;:::i;:::-;43864:139;;43591:419;;;:::o;44016:178::-;44156:30;44152:1;44144:6;44140:14;44133:54;44016:178;:::o;44200:366::-;44342:3;44363:67;44427:2;44422:3;44363:67;:::i;:::-;44356:74;;44439:93;44528:3;44439:93;:::i;:::-;44557:2;44552:3;44548:12;44541:19;;44200:366;;;:::o;44572:419::-;44738:4;44776:2;44765:9;44761:18;44753:26;;44825:9;44819:4;44815:20;44811:1;44800:9;44796:17;44789:47;44853:131;44979:4;44853:131;:::i;:::-;44845:139;;44572:419;;;:::o;44997:180::-;45045:77;45042:1;45035:88;45142:4;45139:1;45132:15;45166:4;45163:1;45156:15

Swarm Source

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