APE Price: $1.14 (+7.17%)

Vibrant Women (VIBRANT)

Overview

TokenID

3

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
VibrantWomen

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-25
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.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

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

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

// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

// File: erc721a/contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(
        uint256 tokenId
    ) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(
        uint256 tokenId
    ) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (
            to.isContract() &&
            !_checkContractOnERC721Received(from, to, tokenId, _data)
        ) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/VibrantWomen.sol
pragma solidity ^0.8.20;

error InsufficientEth();
error MaxSupplyReached();
error WalletMintLimitReached();
error NotAuthorized();

contract VibrantWomen is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    string public baseURI;
    string public metadataExtension = ".json";

    uint256 public constant maxSupply = 10000;
    uint256 public constant price = 1 ether;
    uint256 public constant maxPerWallet = 500;

    mapping(address => uint256) public minted;

    constructor(string memory metadataURL) ERC721A("Vibrant Women", "VIBRANT") {
        setBaseURI(metadataURL);
        _safeMint(msg.sender, 100);
    }

    modifier onlySender() {
        require(msg.sender == tx.origin);
        _;
    }

    function publicMint(uint256 _quantity) public payable onlySender {
        if (msg.value < price * _quantity) revert InsufficientEth();
        if (minted[msg.sender] + _quantity > maxPerWallet) revert WalletMintLimitReached();
        if (totalSupply() + _quantity > maxSupply) revert MaxSupplyReached();

        minted[msg.sender] = minted[msg.sender] + _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function withdrawEther(address to) external onlyOwner {
        uint256 balance = address(this).balance;
        if (balance == 0) revert InsufficientEth();
        (bool callSuccess, ) = payable(to).call{value: balance}("");
        require(callSuccess, "Withdraw failed");
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        metadataExtension
                    )
                )
                : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"metadataURL","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InsufficientEth","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"WalletMintLimitReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90816100489190610aad565b50348015610054575f80fd5b5060405161434c38038061434c83398181016040528101906100769190610c9c565b6040518060400160405280600d81526020017f56696272616e7420576f6d656e000000000000000000000000000000000000008152506040518060400160405280600781526020017f56494252414e540000000000000000000000000000000000000000000000000081525081600290816100f19190610aad565b5080600390816101019190610aad565b5061011061016160201b60201c565b5f81905550505061013361012861016560201b60201c565b61016c60201b60201c565b600160098190555061014a8161022f60201b60201c565b61015b3360646102ca60201b60201c565b50610ec5565b5f90565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61023d61016560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166102616102ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146102b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ae90610d3d565b60405180910390fd5b80600a90816102c69190610aad565b5050565b6102e9828260405180602001604052805f81525061031560201b60201c565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610328838383600161032d60201b60201c565b505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610397576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036103d0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e25f8683876106f460201b60201c565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156105a257506105a18773ffffffffffffffffffffffffffffffffffffffff166106fa60201b60201c565b5b15610669575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461061b5f88848060010195508861071c60201b60201c565b610651576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036105a857825f5414610664575f80fd5b6106d3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361066a575b815f8190555050506106ed5f86838761086d60201b60201c565b5050505050565b50505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261074761016560201b60201c565b8786866040518563ffffffff1660e01b81526004016107699493929190610dfb565b6020604051808303815f875af19250505080156107a457506040513d601f19601f820116820180604052508101906107a19190610e9a565b60015b61081a573d805f81146107d2576040519150601f19603f3d011682016040523d82523d5f602084013e6107d7565b606091505b505f815103610812576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806108ee57607f821691505b602082108103610901576109006108aa565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610928565b61096d8683610928565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6109b16109ac6109a784610985565b61098e565b610985565b9050919050565b5f819050919050565b6109ca83610997565b6109de6109d6826109b8565b848454610934565b825550505050565b5f90565b6109f26109e6565b6109fd8184846109c1565b505050565b5b81811015610a2057610a155f826109ea565b600181019050610a03565b5050565b601f821115610a6557610a3681610907565b610a3f84610919565b81016020851015610a4e578190505b610a62610a5a85610919565b830182610a02565b50505b505050565b5f82821c905092915050565b5f610a855f1984600802610a6a565b1980831691505092915050565b5f610a9d8383610a76565b9150826002028217905092915050565b610ab682610873565b67ffffffffffffffff811115610acf57610ace61087d565b5b610ad982546108d7565b610ae4828285610a24565b5f60209050601f831160018114610b15575f8415610b03578287015190505b610b0d8582610a92565b865550610b74565b601f198416610b2386610907565b5f5b82811015610b4a57848901518255600182019150602085019450602081019050610b25565b86831015610b675784890151610b63601f891682610a76565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b610bae82610b95565b810181811067ffffffffffffffff82111715610bcd57610bcc61087d565b5b80604052505050565b5f610bdf610b7c565b9050610beb8282610ba5565b919050565b5f67ffffffffffffffff821115610c0a57610c0961087d565b5b610c1382610b95565b9050602081019050919050565b8281835e5f83830152505050565b5f610c40610c3b84610bf0565b610bd6565b905082815260208101848484011115610c5c57610c5b610b91565b5b610c67848285610c20565b509392505050565b5f82601f830112610c8357610c82610b8d565b5b8151610c93848260208601610c2e565b91505092915050565b5f60208284031215610cb157610cb0610b85565b5b5f82015167ffffffffffffffff811115610cce57610ccd610b89565b5b610cda84828501610c6f565b91505092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f610d27602083610ce3565b9150610d3282610cf3565b602082019050919050565b5f6020820190508181035f830152610d5481610d1b565b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610d8482610d5b565b9050919050565b610d9481610d7a565b82525050565b610da381610985565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610dcd82610da9565b610dd78185610db3565b9350610de7818560208601610c20565b610df081610b95565b840191505092915050565b5f608082019050610e0e5f830187610d8b565b610e1b6020830186610d8b565b610e286040830185610d9a565b8181036060830152610e3a8184610dc3565b905095945050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610e7981610e45565b8114610e83575f80fd5b50565b5f81519050610e9481610e70565b92915050565b5f60208284031215610eaf57610eae610b85565b5b5f610ebc84828501610e86565b91505092915050565b61347a80610ed25f395ff3fe608060405260043610610180575f3560e01c806370a08231116100d0578063af933b5711610089578063d5abeb0111610063578063d5abeb011461055c578063e985e9c514610586578063ebf72a5f146105c2578063f2fde38b146105ec57610180565b8063af933b57146104d0578063b88d4fde146104f8578063c87b56dd1461052057610180565b806370a08231146103d8578063715018a6146104145780638da5cb5b1461042a57806395d89b4114610454578063a035b1fe1461047e578063a22cb465146104a857610180565b806323b872dd1161013d578063453c231011610117578063453c23101461032057806355f804b31461034a5780636352211e146103725780636c0360eb146103ae57610180565b806323b872dd146102b45780632db11544146102dc57806342842e0e146102f857610180565b806301ffc9a71461018457806306fdde03146101c0578063081812fc146101ea578063095ea7b31461022657806318160ddd1461024e5780631e7269c514610278575b5f80fd5b34801561018f575f80fd5b506101aa60048036038101906101a591906125ce565b610614565b6040516101b79190612613565b60405180910390f35b3480156101cb575f80fd5b506101d46106f5565b6040516101e1919061269c565b60405180910390f35b3480156101f5575f80fd5b50610210600480360381019061020b91906126ef565b610785565b60405161021d9190612759565b60405180910390f35b348015610231575f80fd5b5061024c6004803603810190610247919061279c565b6107fd565b005b348015610259575f80fd5b50610262610906565b60405161026f91906127e9565b60405180910390f35b348015610283575f80fd5b5061029e60048036038101906102999190612802565b61091b565b6040516102ab91906127e9565b60405180910390f35b3480156102bf575f80fd5b506102da60048036038101906102d5919061282d565b610930565b005b6102f660048036038101906102f191906126ef565b610940565b005b348015610303575f80fd5b5061031e6004803603810190610319919061282d565b610b2d565b005b34801561032b575f80fd5b50610334610b4c565b60405161034191906127e9565b60405180910390f35b348015610355575f80fd5b50610370600480360381019061036b91906129a9565b610b52565b005b34801561037d575f80fd5b50610398600480360381019061039391906126ef565b610be1565b6040516103a59190612759565b60405180910390f35b3480156103b9575f80fd5b506103c2610bf5565b6040516103cf919061269c565b60405180910390f35b3480156103e3575f80fd5b506103fe60048036038101906103f99190612802565b610c81565b60405161040b91906127e9565b60405180910390f35b34801561041f575f80fd5b50610428610d4b565b005b348015610435575f80fd5b5061043e610dd2565b60405161044b9190612759565b60405180910390f35b34801561045f575f80fd5b50610468610dfa565b604051610475919061269c565b60405180910390f35b348015610489575f80fd5b50610492610e8a565b60405161049f91906127e9565b60405180910390f35b3480156104b3575f80fd5b506104ce60048036038101906104c99190612a1a565b610e96565b005b3480156104db575f80fd5b506104f660048036038101906104f19190612802565b611008565b005b348015610503575f80fd5b5061051e60048036038101906105199190612af6565b61116e565b005b34801561052b575f80fd5b50610546600480360381019061054191906126ef565b6111ea565b604051610553919061269c565b60405180910390f35b348015610567575f80fd5b50610570611291565b60405161057d91906127e9565b60405180910390f35b348015610591575f80fd5b506105ac60048036038101906105a79190612b76565b611297565b6040516105b99190612613565b60405180910390f35b3480156105cd575f80fd5b506105d6611325565b6040516105e3919061269c565b60405180910390f35b3480156105f7575f80fd5b50610612600480360381019061060d9190612802565b6113b1565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ee57506106ed826114a7565b5b9050919050565b60606002805461070490612be1565b80601f016020809104026020016040519081016040528092919081815260200182805461073090612be1565b801561077b5780601f106107525761010080835404028352916020019161077b565b820191905f5260205f20905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b5f61078f82611510565b6107c5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61080782610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661088d611559565b73ffffffffffffffffffffffffffffffffffffffff16141580156108bf57506108bd816108b8611559565b611297565b155b156108f6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610901838383611560565b505050565b5f61090f61160f565b6001545f540303905090565b600c602052805f5260405f205f915090505481565b61093b838383611613565b505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610977575f80fd5b80670de0b6b3a764000061098b9190612c3e565b3410156109c4576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f481600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a109190612c7f565b1115610a48576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081610a54610906565b610a5e9190612c7f565b1115610a96576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610adf9190612c7f565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610b2a3382611aa9565b50565b610b4783838360405180602001604052805f81525061116e565b505050565b6101f481565b610b5a611559565b73ffffffffffffffffffffffffffffffffffffffff16610b78610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590612cfc565b60405180910390fd5b80600a9081610bdd9190612eb7565b5050565b5f610beb82611ac6565b5f01519050919050565b600a8054610c0290612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e90612be1565b8015610c795780601f10610c5057610100808354040283529160200191610c79565b820191905f5260205f20905b815481529060010190602001808311610c5c57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ce7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d53611559565b73ffffffffffffffffffffffffffffffffffffffff16610d71610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612cfc565b60405180910390fd5b610dd05f611d42565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e0990612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3590612be1565b8015610e805780601f10610e5757610100808354040283529160200191610e80565b820191905f5260205f20905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b670de0b6b3a764000081565b610e9e611559565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f02576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f610f0e611559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fb7611559565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ffc9190612613565b60405180910390a35050565b611010611559565b73ffffffffffffffffffffffffffffffffffffffff1661102e610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b90612cfc565b60405180910390fd5b5f4790505f81036110c1576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516110e690612fb3565b5f6040518083038185875af1925050503d805f8114611120576040519150601f19603f3d011682016040523d82523d5f602084013e611125565b606091505b5050905080611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116090613011565b60405180910390fd5b505050565b611179848484611613565b6111988373ffffffffffffffffffffffffffffffffffffffff16611e05565b80156111ad57506111ab84848484611e27565b155b156111e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111f582611510565b611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b9061309f565b60405180910390fd5b5f61123d611f72565b90505f81511161125b5760405180602001604052805f815250611289565b8061126584612002565b600b60405160200161127993929190613177565b6040516020818303038152906040525b915050919050565b61271081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b600b805461133290612be1565b80601f016020809104026020016040519081016040528092919081815260200182805461135e90612be1565b80156113a95780601f10611380576101008083540402835291602001916113a9565b820191905f5260205f20905b81548152906001019060200180831161138c57829003601f168201915b505050505081565b6113b9611559565b73ffffffffffffffffffffffffffffffffffffffff166113d7610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490612cfc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613217565b60405180910390fd5b6114a481611d42565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8161151a61160f565b1115801561152857505f5482105b8015611552575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f90565b5f61161d82611ac6565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611687576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff166116a7611559565b73ffffffffffffffffffffffffffffffffffffffff1614806116d657506116d5856116d0611559565b611297565b5b8061171b57506116e4611559565b73ffffffffffffffffffffffffffffffffffffffff1661170384610785565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611754576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117b9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117c6858585600161215b565b6117d15f8487611560565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a37575f548214611a365787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa28585856001612161565b5050505050565b611ac2828260405180602001604052805f815250612167565b5050565b611ace612528565b5f82905080611adb61160f565b11158015611ae957505f5481105b15611d0b575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151611d09575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611bf5578092505050611d3d565b5b600115611d085781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611d03578092505050611d3d565b611bf6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e4c611559565b8786866040518563ffffffff1660e01b8152600401611e6e9493929190613287565b6020604051808303815f875af1925050508015611ea957506040513d601f19601f82011682018060405250810190611ea691906132e5565b60015b611f1f573d805f8114611ed7576040519150601f19603f3d011682016040523d82523d5f602084013e611edc565b606091505b505f815103611f17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f8190612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054611fad90612be1565b8015611ff85780601f10611fcf57610100808354040283529160200191611ff8565b820191905f5260205f20905b815481529060010190602001808311611fdb57829003601f168201915b5050505050905090565b60605f8203612048576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612156565b5f8290505f5b5f821461207757808061206090613310565b915050600a826120709190613384565b915061204e565b5f8167ffffffffffffffff81111561209257612091612885565b5b6040519080825280601f01601f1916602001820160405280156120c45781602001600182028036833780820191505090505b5090505b5f851461214f576001826120dc91906133b4565b9150600a856120eb91906133e7565b60306120f79190612c7f565b60f81b81838151811061210d5761210c613417565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856121489190613384565b94506120c8565b8093505050505b919050565b50505050565b50505050565b6121748383836001612179565b505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f840361221c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122285f86838761215b565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156123e257506123e18773ffffffffffffffffffffffffffffffffffffffff16611e05565b5b156124a3575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124555f888480600101955088611e27565b61248b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123e857825f541461249e575f80fd5b61250d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036124a4575b815f8190555050506125215f868387612161565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125ad81612579565b81146125b7575f80fd5b50565b5f813590506125c8816125a4565b92915050565b5f602082840312156125e3576125e2612571565b5b5f6125f0848285016125ba565b91505092915050565b5f8115159050919050565b61260d816125f9565b82525050565b5f6020820190506126265f830184612604565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61266e8261262c565b6126788185612636565b9350612688818560208601612646565b61269181612654565b840191505092915050565b5f6020820190508181035f8301526126b48184612664565b905092915050565b5f819050919050565b6126ce816126bc565b81146126d8575f80fd5b50565b5f813590506126e9816126c5565b92915050565b5f6020828403121561270457612703612571565b5b5f612711848285016126db565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127438261271a565b9050919050565b61275381612739565b82525050565b5f60208201905061276c5f83018461274a565b92915050565b61277b81612739565b8114612785575f80fd5b50565b5f8135905061279681612772565b92915050565b5f80604083850312156127b2576127b1612571565b5b5f6127bf85828601612788565b92505060206127d0858286016126db565b9150509250929050565b6127e3816126bc565b82525050565b5f6020820190506127fc5f8301846127da565b92915050565b5f6020828403121561281757612816612571565b5b5f61282484828501612788565b91505092915050565b5f805f6060848603121561284457612843612571565b5b5f61285186828701612788565b935050602061286286828701612788565b9250506040612873868287016126db565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128bb82612654565b810181811067ffffffffffffffff821117156128da576128d9612885565b5b80604052505050565b5f6128ec612568565b90506128f882826128b2565b919050565b5f67ffffffffffffffff82111561291757612916612885565b5b61292082612654565b9050602081019050919050565b828183375f83830152505050565b5f61294d612948846128fd565b6128e3565b90508281526020810184848401111561296957612968612881565b5b61297484828561292d565b509392505050565b5f82601f8301126129905761298f61287d565b5b81356129a084826020860161293b565b91505092915050565b5f602082840312156129be576129bd612571565b5b5f82013567ffffffffffffffff8111156129db576129da612575565b5b6129e78482850161297c565b91505092915050565b6129f9816125f9565b8114612a03575f80fd5b50565b5f81359050612a14816129f0565b92915050565b5f8060408385031215612a3057612a2f612571565b5b5f612a3d85828601612788565b9250506020612a4e85828601612a06565b9150509250929050565b5f67ffffffffffffffff821115612a7257612a71612885565b5b612a7b82612654565b9050602081019050919050565b5f612a9a612a9584612a58565b6128e3565b905082815260208101848484011115612ab657612ab5612881565b5b612ac184828561292d565b509392505050565b5f82601f830112612add57612adc61287d565b5b8135612aed848260208601612a88565b91505092915050565b5f805f8060808587031215612b0e57612b0d612571565b5b5f612b1b87828801612788565b9450506020612b2c87828801612788565b9350506040612b3d878288016126db565b925050606085013567ffffffffffffffff811115612b5e57612b5d612575565b5b612b6a87828801612ac9565b91505092959194509250565b5f8060408385031215612b8c57612b8b612571565b5b5f612b9985828601612788565b9250506020612baa85828601612788565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612bf857607f821691505b602082108103612c0b57612c0a612bb4565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c48826126bc565b9150612c53836126bc565b9250828202612c61816126bc565b91508282048414831517612c7857612c77612c11565b5b5092915050565b5f612c89826126bc565b9150612c94836126bc565b9250828201905080821115612cac57612cab612c11565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612ce6602083612636565b9150612cf182612cb2565b602082019050919050565b5f6020820190508181035f830152612d1381612cda565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612d767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d3b565b612d808683612d3b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612dbb612db6612db1846126bc565b612d98565b6126bc565b9050919050565b5f819050919050565b612dd483612da1565b612de8612de082612dc2565b848454612d47565b825550505050565b5f90565b612dfc612df0565b612e07818484612dcb565b505050565b5b81811015612e2a57612e1f5f82612df4565b600181019050612e0d565b5050565b601f821115612e6f57612e4081612d1a565b612e4984612d2c565b81016020851015612e58578190505b612e6c612e6485612d2c565b830182612e0c565b50505b505050565b5f82821c905092915050565b5f612e8f5f1984600802612e74565b1980831691505092915050565b5f612ea78383612e80565b9150826002028217905092915050565b612ec08261262c565b67ffffffffffffffff811115612ed957612ed8612885565b5b612ee38254612be1565b612eee828285612e2e565b5f60209050601f831160018114612f1f575f8415612f0d578287015190505b612f178582612e9c565b865550612f7e565b601f198416612f2d86612d1a565b5f5b82811015612f5457848901518255600182019150602085019450602081019050612f2f565b86831015612f715784890151612f6d601f891682612e80565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f612f9e5f83612f86565b9150612fa982612f90565b5f82019050919050565b5f612fbd82612f93565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f612ffb600f83612636565b915061300682612fc7565b602082019050919050565b5f6020820190508181035f83015261302881612fef565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613089602f83612636565b91506130948261302f565b604082019050919050565b5f6020820190508181035f8301526130b68161307d565b9050919050565b5f81905092915050565b5f6130d18261262c565b6130db81856130bd565b93506130eb818560208601612646565b80840191505092915050565b5f815461310381612be1565b61310d81866130bd565b9450600182165f8114613127576001811461313c5761316e565b60ff198316865281151582028601935061316e565b61314585612d1a565b5f5b8381101561316657815481890152600182019150602081019050613147565b838801955050505b50505092915050565b5f61318282866130c7565b915061318e82856130c7565b915061319a82846130f7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613201602683612636565b915061320c826131a7565b604082019050919050565b5f6020820190508181035f83015261322e816131f5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61325982613235565b613263818561323f565b9350613273818560208601612646565b61327c81612654565b840191505092915050565b5f60808201905061329a5f83018761274a565b6132a7602083018661274a565b6132b460408301856127da565b81810360608301526132c6818461324f565b905095945050505050565b5f815190506132df816125a4565b92915050565b5f602082840312156132fa576132f9612571565b5b5f613307848285016132d1565b91505092915050565b5f61331a826126bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361334c5761334b612c11565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61338e826126bc565b9150613399836126bc565b9250826133a9576133a8613357565b5b828204905092915050565b5f6133be826126bc565b91506133c9836126bc565b92508282039050818111156133e1576133e0612c11565b5b92915050565b5f6133f1826126bc565b91506133fc836126bc565b92508261340c5761340b613357565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea2646970667358221220f22baba9750501e793d8a9b8574971922748b81f3042f706655f437625d8ce8364736f6c634300081a003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6146716a6b78564447336a776846735a544d71617959326a3652376277666d4d66677054724a566a797435662f00000000000000000000

Deployed Bytecode

0x608060405260043610610180575f3560e01c806370a08231116100d0578063af933b5711610089578063d5abeb0111610063578063d5abeb011461055c578063e985e9c514610586578063ebf72a5f146105c2578063f2fde38b146105ec57610180565b8063af933b57146104d0578063b88d4fde146104f8578063c87b56dd1461052057610180565b806370a08231146103d8578063715018a6146104145780638da5cb5b1461042a57806395d89b4114610454578063a035b1fe1461047e578063a22cb465146104a857610180565b806323b872dd1161013d578063453c231011610117578063453c23101461032057806355f804b31461034a5780636352211e146103725780636c0360eb146103ae57610180565b806323b872dd146102b45780632db11544146102dc57806342842e0e146102f857610180565b806301ffc9a71461018457806306fdde03146101c0578063081812fc146101ea578063095ea7b31461022657806318160ddd1461024e5780631e7269c514610278575b5f80fd5b34801561018f575f80fd5b506101aa60048036038101906101a591906125ce565b610614565b6040516101b79190612613565b60405180910390f35b3480156101cb575f80fd5b506101d46106f5565b6040516101e1919061269c565b60405180910390f35b3480156101f5575f80fd5b50610210600480360381019061020b91906126ef565b610785565b60405161021d9190612759565b60405180910390f35b348015610231575f80fd5b5061024c6004803603810190610247919061279c565b6107fd565b005b348015610259575f80fd5b50610262610906565b60405161026f91906127e9565b60405180910390f35b348015610283575f80fd5b5061029e60048036038101906102999190612802565b61091b565b6040516102ab91906127e9565b60405180910390f35b3480156102bf575f80fd5b506102da60048036038101906102d5919061282d565b610930565b005b6102f660048036038101906102f191906126ef565b610940565b005b348015610303575f80fd5b5061031e6004803603810190610319919061282d565b610b2d565b005b34801561032b575f80fd5b50610334610b4c565b60405161034191906127e9565b60405180910390f35b348015610355575f80fd5b50610370600480360381019061036b91906129a9565b610b52565b005b34801561037d575f80fd5b50610398600480360381019061039391906126ef565b610be1565b6040516103a59190612759565b60405180910390f35b3480156103b9575f80fd5b506103c2610bf5565b6040516103cf919061269c565b60405180910390f35b3480156103e3575f80fd5b506103fe60048036038101906103f99190612802565b610c81565b60405161040b91906127e9565b60405180910390f35b34801561041f575f80fd5b50610428610d4b565b005b348015610435575f80fd5b5061043e610dd2565b60405161044b9190612759565b60405180910390f35b34801561045f575f80fd5b50610468610dfa565b604051610475919061269c565b60405180910390f35b348015610489575f80fd5b50610492610e8a565b60405161049f91906127e9565b60405180910390f35b3480156104b3575f80fd5b506104ce60048036038101906104c99190612a1a565b610e96565b005b3480156104db575f80fd5b506104f660048036038101906104f19190612802565b611008565b005b348015610503575f80fd5b5061051e60048036038101906105199190612af6565b61116e565b005b34801561052b575f80fd5b50610546600480360381019061054191906126ef565b6111ea565b604051610553919061269c565b60405180910390f35b348015610567575f80fd5b50610570611291565b60405161057d91906127e9565b60405180910390f35b348015610591575f80fd5b506105ac60048036038101906105a79190612b76565b611297565b6040516105b99190612613565b60405180910390f35b3480156105cd575f80fd5b506105d6611325565b6040516105e3919061269c565b60405180910390f35b3480156105f7575f80fd5b50610612600480360381019061060d9190612802565b6113b1565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ee57506106ed826114a7565b5b9050919050565b60606002805461070490612be1565b80601f016020809104026020016040519081016040528092919081815260200182805461073090612be1565b801561077b5780601f106107525761010080835404028352916020019161077b565b820191905f5260205f20905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b5f61078f82611510565b6107c5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61080782610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661088d611559565b73ffffffffffffffffffffffffffffffffffffffff16141580156108bf57506108bd816108b8611559565b611297565b155b156108f6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610901838383611560565b505050565b5f61090f61160f565b6001545f540303905090565b600c602052805f5260405f205f915090505481565b61093b838383611613565b505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610977575f80fd5b80670de0b6b3a764000061098b9190612c3e565b3410156109c4576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f481600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a109190612c7f565b1115610a48576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081610a54610906565b610a5e9190612c7f565b1115610a96576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610adf9190612c7f565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610b2a3382611aa9565b50565b610b4783838360405180602001604052805f81525061116e565b505050565b6101f481565b610b5a611559565b73ffffffffffffffffffffffffffffffffffffffff16610b78610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590612cfc565b60405180910390fd5b80600a9081610bdd9190612eb7565b5050565b5f610beb82611ac6565b5f01519050919050565b600a8054610c0290612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e90612be1565b8015610c795780601f10610c5057610100808354040283529160200191610c79565b820191905f5260205f20905b815481529060010190602001808311610c5c57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ce7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d53611559565b73ffffffffffffffffffffffffffffffffffffffff16610d71610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612cfc565b60405180910390fd5b610dd05f611d42565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e0990612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3590612be1565b8015610e805780601f10610e5757610100808354040283529160200191610e80565b820191905f5260205f20905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b670de0b6b3a764000081565b610e9e611559565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f02576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f610f0e611559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fb7611559565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ffc9190612613565b60405180910390a35050565b611010611559565b73ffffffffffffffffffffffffffffffffffffffff1661102e610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b90612cfc565b60405180910390fd5b5f4790505f81036110c1576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516110e690612fb3565b5f6040518083038185875af1925050503d805f8114611120576040519150601f19603f3d011682016040523d82523d5f602084013e611125565b606091505b5050905080611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116090613011565b60405180910390fd5b505050565b611179848484611613565b6111988373ffffffffffffffffffffffffffffffffffffffff16611e05565b80156111ad57506111ab84848484611e27565b155b156111e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111f582611510565b611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b9061309f565b60405180910390fd5b5f61123d611f72565b90505f81511161125b5760405180602001604052805f815250611289565b8061126584612002565b600b60405160200161127993929190613177565b6040516020818303038152906040525b915050919050565b61271081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b600b805461133290612be1565b80601f016020809104026020016040519081016040528092919081815260200182805461135e90612be1565b80156113a95780601f10611380576101008083540402835291602001916113a9565b820191905f5260205f20905b81548152906001019060200180831161138c57829003601f168201915b505050505081565b6113b9611559565b73ffffffffffffffffffffffffffffffffffffffff166113d7610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490612cfc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613217565b60405180910390fd5b6114a481611d42565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8161151a61160f565b1115801561152857505f5482105b8015611552575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f90565b5f61161d82611ac6565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611687576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff166116a7611559565b73ffffffffffffffffffffffffffffffffffffffff1614806116d657506116d5856116d0611559565b611297565b5b8061171b57506116e4611559565b73ffffffffffffffffffffffffffffffffffffffff1661170384610785565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611754576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117b9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117c6858585600161215b565b6117d15f8487611560565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a37575f548214611a365787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa28585856001612161565b5050505050565b611ac2828260405180602001604052805f815250612167565b5050565b611ace612528565b5f82905080611adb61160f565b11158015611ae957505f5481105b15611d0b575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151611d09575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611bf5578092505050611d3d565b5b600115611d085781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611d03578092505050611d3d565b611bf6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e4c611559565b8786866040518563ffffffff1660e01b8152600401611e6e9493929190613287565b6020604051808303815f875af1925050508015611ea957506040513d601f19601f82011682018060405250810190611ea691906132e5565b60015b611f1f573d805f8114611ed7576040519150601f19603f3d011682016040523d82523d5f602084013e611edc565b606091505b505f815103611f17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f8190612be1565b80601f0160208091040260200160405190810160405280929190818152602001828054611fad90612be1565b8015611ff85780601f10611fcf57610100808354040283529160200191611ff8565b820191905f5260205f20905b815481529060010190602001808311611fdb57829003601f168201915b5050505050905090565b60605f8203612048576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612156565b5f8290505f5b5f821461207757808061206090613310565b915050600a826120709190613384565b915061204e565b5f8167ffffffffffffffff81111561209257612091612885565b5b6040519080825280601f01601f1916602001820160405280156120c45781602001600182028036833780820191505090505b5090505b5f851461214f576001826120dc91906133b4565b9150600a856120eb91906133e7565b60306120f79190612c7f565b60f81b81838151811061210d5761210c613417565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856121489190613384565b94506120c8565b8093505050505b919050565b50505050565b50505050565b6121748383836001612179565b505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f840361221c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122285f86838761215b565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156123e257506123e18773ffffffffffffffffffffffffffffffffffffffff16611e05565b5b156124a3575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124555f888480600101955088611e27565b61248b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123e857825f541461249e575f80fd5b61250d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036124a4575b815f8190555050506125215f868387612161565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125ad81612579565b81146125b7575f80fd5b50565b5f813590506125c8816125a4565b92915050565b5f602082840312156125e3576125e2612571565b5b5f6125f0848285016125ba565b91505092915050565b5f8115159050919050565b61260d816125f9565b82525050565b5f6020820190506126265f830184612604565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61266e8261262c565b6126788185612636565b9350612688818560208601612646565b61269181612654565b840191505092915050565b5f6020820190508181035f8301526126b48184612664565b905092915050565b5f819050919050565b6126ce816126bc565b81146126d8575f80fd5b50565b5f813590506126e9816126c5565b92915050565b5f6020828403121561270457612703612571565b5b5f612711848285016126db565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127438261271a565b9050919050565b61275381612739565b82525050565b5f60208201905061276c5f83018461274a565b92915050565b61277b81612739565b8114612785575f80fd5b50565b5f8135905061279681612772565b92915050565b5f80604083850312156127b2576127b1612571565b5b5f6127bf85828601612788565b92505060206127d0858286016126db565b9150509250929050565b6127e3816126bc565b82525050565b5f6020820190506127fc5f8301846127da565b92915050565b5f6020828403121561281757612816612571565b5b5f61282484828501612788565b91505092915050565b5f805f6060848603121561284457612843612571565b5b5f61285186828701612788565b935050602061286286828701612788565b9250506040612873868287016126db565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128bb82612654565b810181811067ffffffffffffffff821117156128da576128d9612885565b5b80604052505050565b5f6128ec612568565b90506128f882826128b2565b919050565b5f67ffffffffffffffff82111561291757612916612885565b5b61292082612654565b9050602081019050919050565b828183375f83830152505050565b5f61294d612948846128fd565b6128e3565b90508281526020810184848401111561296957612968612881565b5b61297484828561292d565b509392505050565b5f82601f8301126129905761298f61287d565b5b81356129a084826020860161293b565b91505092915050565b5f602082840312156129be576129bd612571565b5b5f82013567ffffffffffffffff8111156129db576129da612575565b5b6129e78482850161297c565b91505092915050565b6129f9816125f9565b8114612a03575f80fd5b50565b5f81359050612a14816129f0565b92915050565b5f8060408385031215612a3057612a2f612571565b5b5f612a3d85828601612788565b9250506020612a4e85828601612a06565b9150509250929050565b5f67ffffffffffffffff821115612a7257612a71612885565b5b612a7b82612654565b9050602081019050919050565b5f612a9a612a9584612a58565b6128e3565b905082815260208101848484011115612ab657612ab5612881565b5b612ac184828561292d565b509392505050565b5f82601f830112612add57612adc61287d565b5b8135612aed848260208601612a88565b91505092915050565b5f805f8060808587031215612b0e57612b0d612571565b5b5f612b1b87828801612788565b9450506020612b2c87828801612788565b9350506040612b3d878288016126db565b925050606085013567ffffffffffffffff811115612b5e57612b5d612575565b5b612b6a87828801612ac9565b91505092959194509250565b5f8060408385031215612b8c57612b8b612571565b5b5f612b9985828601612788565b9250506020612baa85828601612788565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612bf857607f821691505b602082108103612c0b57612c0a612bb4565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c48826126bc565b9150612c53836126bc565b9250828202612c61816126bc565b91508282048414831517612c7857612c77612c11565b5b5092915050565b5f612c89826126bc565b9150612c94836126bc565b9250828201905080821115612cac57612cab612c11565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612ce6602083612636565b9150612cf182612cb2565b602082019050919050565b5f6020820190508181035f830152612d1381612cda565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612d767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d3b565b612d808683612d3b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612dbb612db6612db1846126bc565b612d98565b6126bc565b9050919050565b5f819050919050565b612dd483612da1565b612de8612de082612dc2565b848454612d47565b825550505050565b5f90565b612dfc612df0565b612e07818484612dcb565b505050565b5b81811015612e2a57612e1f5f82612df4565b600181019050612e0d565b5050565b601f821115612e6f57612e4081612d1a565b612e4984612d2c565b81016020851015612e58578190505b612e6c612e6485612d2c565b830182612e0c565b50505b505050565b5f82821c905092915050565b5f612e8f5f1984600802612e74565b1980831691505092915050565b5f612ea78383612e80565b9150826002028217905092915050565b612ec08261262c565b67ffffffffffffffff811115612ed957612ed8612885565b5b612ee38254612be1565b612eee828285612e2e565b5f60209050601f831160018114612f1f575f8415612f0d578287015190505b612f178582612e9c565b865550612f7e565b601f198416612f2d86612d1a565b5f5b82811015612f5457848901518255600182019150602085019450602081019050612f2f565b86831015612f715784890151612f6d601f891682612e80565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f612f9e5f83612f86565b9150612fa982612f90565b5f82019050919050565b5f612fbd82612f93565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f612ffb600f83612636565b915061300682612fc7565b602082019050919050565b5f6020820190508181035f83015261302881612fef565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613089602f83612636565b91506130948261302f565b604082019050919050565b5f6020820190508181035f8301526130b68161307d565b9050919050565b5f81905092915050565b5f6130d18261262c565b6130db81856130bd565b93506130eb818560208601612646565b80840191505092915050565b5f815461310381612be1565b61310d81866130bd565b9450600182165f8114613127576001811461313c5761316e565b60ff198316865281151582028601935061316e565b61314585612d1a565b5f5b8381101561316657815481890152600182019150602081019050613147565b838801955050505b50505092915050565b5f61318282866130c7565b915061318e82856130c7565b915061319a82846130f7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613201602683612636565b915061320c826131a7565b604082019050919050565b5f6020820190508181035f83015261322e816131f5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61325982613235565b613263818561323f565b9350613273818560208601612646565b61327c81612654565b840191505092915050565b5f60808201905061329a5f83018761274a565b6132a7602083018661274a565b6132b460408301856127da565b81810360608301526132c6818461324f565b905095945050505050565b5f815190506132df816125a4565b92915050565b5f602082840312156132fa576132f9612571565b5b5f613307848285016132d1565b91505092915050565b5f61331a826126bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361334c5761334b612c11565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61338e826126bc565b9150613399836126bc565b9250826133a9576133a8613357565b5b828204905092915050565b5f6133be826126bc565b91506133c9836126bc565b92508282039050818111156133e1576133e0612c11565b5b92915050565b5f6133f1826126bc565b91506133fc836126bc565b92508261340c5761340b613357565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea2646970667358221220f22baba9750501e793d8a9b8574971922748b81f3042f706655f437625d8ce8364736f6c634300081a0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6146716a6b78564447336a776846735a544d71617959326a3652376277666d4d66677054724a566a797435662f00000000000000000000

-----Decoded View---------------
Arg [0] : metadataURL (string): ipfs://QmaFqjkxVDG3jwhFsZTMqayY2j6R7bwfmMfgpTrJVjyt5f/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d6146716a6b78564447336a776846735a544d7161795932
Arg [3] : 6a3652376277666d4d66677054724a566a797435662f00000000000000000000


Deployed Bytecode Sourcemap

48785:2192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30398:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35109:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34672:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29647:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49108:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36040:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49413:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36281:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49057:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50252:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33351:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48885:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30783:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7564:103;;;;;;;;;;;;;:::i;:::-;;6913:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49011:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35401:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49843:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36537:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50364:610;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48963:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35784:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48913:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7822:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30398:321;30516:4;30568:25;30553:40;;;:11;:40;;;;:105;;;;30625:33;30610:48;;;:11;:48;;;;30553:105;:158;;;;30675:36;30699:11;30675:23;:36::i;:::-;30553:158;30533:178;;30398:321;;;:::o;33543:100::-;33597:13;33630:5;33623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33543:100;:::o;35109:220::-;35193:7;35218:16;35226:7;35218;:16::i;:::-;35213:64;;35243:34;;;;;;;;;;;;;;35213:64;35297:15;:24;35313:7;35297:24;;;;;;;;;;;;;;;;;;;;;35290:31;;35109:220;;;:::o;34672:371::-;34745:13;34761:24;34777:7;34761:15;:24::i;:::-;34745:40;;34806:5;34800:11;;:2;:11;;;34796:48;;34820:24;;;;;;;;;;;;;;34796:48;34877:5;34861:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34887:37;34904:5;34911:12;:10;:12::i;:::-;34887:16;:37::i;:::-;34886:38;34861:63;34857:138;;;34948:35;;;;;;;;;;;;;;34857:138;35007:28;35016:2;35020:7;35029:5;35007:8;:28::i;:::-;34734:309;34672:371;;:::o;29647:303::-;29691:7;29916:15;:13;:15::i;:::-;29901:12;;29885:13;;:28;:46;29878:53;;29647:303;:::o;49108:41::-;;;;;;;;;;;;;;;;;:::o;36040:170::-;36174:28;36184:4;36190:2;36194:7;36174:9;:28::i;:::-;36040:170;;;:::o;49413:422::-;49375:9;49361:23;;:10;:23;;;49353:32;;;;;;49513:9:::1;49043:7;49505:17;;;;:::i;:::-;49493:9;:29;49489:59;;;49531:17;;;;;;;;;;;;;;49489:59;49096:3;49584:9;49563:6;:18;49570:10;49563:18;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;:45;49559:82;;;49617:24;;;;;;;;;;;;;;49559:82;48999:5;49672:9;49656:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:37;49652:68;;;49702:18;;;;;;;;;;;;;;49652:68;49775:9;49754:6;:18;49761:10;49754:18;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;49733:6;:18;49740:10;49733:18;;;;;;;;;;;;;;;:51;;;;49795:32;49805:10;49817:9;49795;:32::i;:::-;49413:422:::0;:::o;36281:185::-;36419:39;36436:4;36442:2;36446:7;36419:39;;;;;;;;;;;;:16;:39::i;:::-;36281:185;;;:::o;49057:42::-;49096:3;49057:42;:::o;50252:104::-;7144:12;:10;:12::i;:::-;7133:23;;:7;:5;:7::i;:::-;:23;;;7125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50337:11:::1;50327:7;:21;;;;;;:::i;:::-;;50252:104:::0;:::o;33351:125::-;33415:7;33442:21;33455:7;33442:12;:21::i;:::-;:26;;;33435:33;;33351:125;;;:::o;48885:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30783:206::-;30847:7;30888:1;30871:19;;:5;:19;;;30867:60;;30899:28;;;;;;;;;;;;;;30867:60;30953:12;:19;30966:5;30953:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30945:36;;30938:43;;30783:206;;;:::o;7564:103::-;7144:12;:10;:12::i;:::-;7133:23;;:7;:5;:7::i;:::-;:23;;;7125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7629:30:::1;7656:1;7629:18;:30::i;:::-;7564:103::o:0;6913:87::-;6959:7;6986:6;;;;;;;;;;;6979:13;;6913:87;:::o;33712:104::-;33768:13;33801:7;33794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33712:104;:::o;49011:39::-;49043:7;49011:39;:::o;35401:312::-;35537:12;:10;:12::i;:::-;35525:24;;:8;:24;;;35521:54;;35558:17;;;;;;;;;;;;;;35521:54;35633:8;35588:18;:32;35607:12;:10;:12::i;:::-;35588:32;;;;;;;;;;;;;;;:42;35621:8;35588:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35686:8;35657:48;;35672:12;:10;:12::i;:::-;35657:48;;;35696:8;35657:48;;;;;;:::i;:::-;;;;;;;;35401:312;;:::o;49843:285::-;7144:12;:10;:12::i;:::-;7133:23;;:7;:5;:7::i;:::-;:23;;;7125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49908:15:::1;49926:21;49908:39;;49973:1;49962:7;:12:::0;49958:42:::1;;49983:17;;;;;;;;;;;;;;49958:42;50012:16;50042:2;50034:16;;50058:7;50034:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50011:59;;;50089:11;50081:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;49897:231;;49843:285:::0;:::o;36537:406::-;36704:28;36714:4;36720:2;36724:7;36704:9;:28::i;:::-;36761:15;:2;:13;;;:15::i;:::-;:89;;;;;36794:56;36825:4;36831:2;36835:7;36844:5;36794:30;:56::i;:::-;36793:57;36761:89;36743:193;;;36884:40;;;;;;;;;;;;;;36743:193;36537:406;;;;:::o;50364:610::-;50453:13;50501:16;50509:7;50501;:16::i;:::-;50479:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;50603:28;50634:10;:8;:10::i;:::-;50603:41;;50706:1;50681:14;50675:28;:32;:291;;;;;;;;;;;;;;;;;50799:14;50840:18;:7;:16;:18::i;:::-;50885:17;50756:169;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50675:291;50655:311;;;50364:610;;;:::o;48963:41::-;48999:5;48963:41;:::o;35784:189::-;35906:4;35930:18;:25;35949:5;35930:25;;;;;;;;;;;;;;;:35;35956:8;35930:35;;;;;;;;;;;;;;;;;;;;;;;;;35923:42;;35784:189;;;;:::o;48913:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7822:238::-;7144:12;:10;:12::i;:::-;7133:23;;:7;:5;:7::i;:::-;:23;;;7125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7945:1:::1;7925:22;;:8;:22;;::::0;7903:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8024:28;8043:8;8024:18;:28::i;:::-;7822:238:::0;:::o;20188:173::-;20289:4;20328:25;20313:40;;;:11;:40;;;;20306:47;;20188:173;;;:::o;37198:213::-;37255:4;37311:7;37292:15;:13;:15::i;:::-;:26;;:66;;;;;37345:13;;37335:7;:23;37292:66;:111;;;;;37376:11;:20;37388:7;37376:20;;;;;;;;;;;:27;;;;;;;;;;;;37375:28;37292:111;37272:131;;37198:213;;;:::o;5616:98::-;5669:7;5696:10;5689:17;;5616:98;:::o;45551:162::-;45659:2;45632:15;:24;45648:7;45632:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45697:7;45693:2;45677:28;;45686:5;45677:28;;;;;;;;;;;;45551:162;;;:::o;29421:92::-;29477:7;29421:92;:::o;40528:2096::-;40609:35;40647:21;40660:7;40647:12;:21::i;:::-;40609:59;;40707:4;40685:26;;:13;:18;;;:26;;;40681:67;;40720:28;;;;;;;;;;;;;;40681:67;40761:22;40803:4;40787:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40824:36;40841:4;40847:12;:10;:12::i;:::-;40824:16;:36::i;:::-;40787:73;:126;;;;40901:12;:10;:12::i;:::-;40877:36;;:20;40889:7;40877:11;:20::i;:::-;:36;;;40787:126;40761:153;;40932:17;40927:66;;40958:35;;;;;;;;;;;;;;40927:66;41022:1;41008:16;;:2;:16;;;41004:52;;41033:23;;;;;;;;;;;;;;41004:52;41069:43;41091:4;41097:2;41101:7;41110:1;41069:21;:43::i;:::-;41177:35;41194:1;41198:7;41207:4;41177:8;:35::i;:::-;41538:1;41508:12;:18;41521:4;41508:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41582:1;41554:12;:16;41567:2;41554:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41600:31;41634:11;:20;41646:7;41634:20;;;;;;;;;;;41600:54;;41685:2;41669:8;:13;;;:18;;;;;;;;;;;;;;;;;;41735:15;41702:8;:23;;;:49;;;;;;;;;;;;;;;;;;42003:19;42035:1;42025:7;:11;42003:33;;42051:31;42085:11;:24;42097:11;42085:24;;;;;;;;;;;42051:58;;42153:1;42128:27;;:8;:13;;;;;;;;;;;;:27;;;42124:384;;42338:13;;42323:11;:28;42319:174;;42392:4;42376:8;:13;;;:20;;;;;;;;;;;;;;;;;;42445:13;:28;;;42419:8;:23;;;:54;;;;;;;;;;;;;;;;;;42319:174;42124:384;41483:1036;;;42555:7;42551:2;42536:27;;42545:4;42536:27;;;;;;;;;;;;42574:42;42595:4;42601:2;42605:7;42614:1;42574:20;:42::i;:::-;40598:2026;;40528:2096;;;:::o;37419:104::-;37488:27;37498:2;37502:8;37488:27;;;;;;;;;;;;:9;:27::i;:::-;37419:104;;:::o;32164:1125::-;32242:21;;:::i;:::-;32276:12;32291:7;32276:22;;32359:4;32340:15;:13;:15::i;:::-;:23;;:47;;;;;32374:13;;32367:4;:20;32340:47;32336:886;;;32408:31;32442:11;:17;32454:4;32442:17;;;;;;;;;;;32408:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32483:9;:16;;;32478:729;;32554:1;32528:28;;:9;:14;;;:28;;;32524:101;;32592:9;32585:16;;;;;;32524:101;32927:261;32934:4;32927:261;;;32967:6;;;;;;;;33012:11;:17;33024:4;33012:17;;;;;;;;;;;33000:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33086:1;33060:28;;:9;:14;;;:28;;;33056:109;;33128:9;33121:16;;;;;;33056:109;32927:261;;;32478:729;32389:833;32336:886;33250:31;;;;;;;;;;;;;;32164:1125;;;;:::o;8220:191::-;8294:16;8313:6;;;;;;;;;;;8294:25;;8339:8;8330:6;;:17;;;;;;;;;;;;;;;;;;8394:8;8363:40;;8384:8;8363:40;;;;;;;;;;;;8283:128;8220:191;:::o;9649:326::-;9709:4;9966:1;9944:7;:19;;;:23;9937:30;;9649:326;;;:::o;46205:772::-;46368:4;46418:2;46402:36;;;46457:12;:10;:12::i;:::-;46488:4;46511:7;46537:5;46402:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46385:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46745:1;46728:6;:13;:18;46724:235;;46774:40;;;;;;;;;;;;;;46724:235;46917:6;46911:13;46902:6;46898:2;46894:15;46887:38;46385:585;46623:45;;;46613:55;;;:6;:55;;;;46606:62;;;46205:772;;;;;;:::o;50136:108::-;50196:13;50229:7;50222:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50136:108;:::o;3155:723::-;3211:13;3441:1;3432:5;:10;3428:53;;3459:10;;;;;;;;;;;;;;;;;;;;;3428:53;3491:12;3506:5;3491:20;;3522:14;3547:78;3562:1;3554:4;:9;3547:78;;3580:8;;;;;:::i;:::-;;;;3611:2;3603:10;;;;;:::i;:::-;;;3547:78;;;3635:19;3667:6;3657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3635:39;;3685:154;3701:1;3692:5;:10;3685:154;;3729:1;3719:11;;;;;:::i;:::-;;;3796:2;3788:5;:10;;;;:::i;:::-;3775:2;:24;;;;:::i;:::-;3762:39;;3745:6;3752;3745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3825:2;3816:11;;;;;:::i;:::-;;;3685:154;;;3863:6;3849:21;;;;;3155:723;;;;:::o;47625:159::-;;;;;:::o;48443:158::-;;;;;:::o;37886:163::-;38009:32;38015:2;38019:8;38029:5;38036:4;38009:5;:32::i;:::-;37886:163;;;:::o;38308:1966::-;38447:20;38470:13;;38447:36;;38512:1;38498:16;;:2;:16;;;38494:48;;38523:19;;;;;;;;;;;;;;38494:48;38569:1;38557:8;:13;38553:44;;38579:18;;;;;;;;;;;;;;38553:44;38610:61;38640:1;38644:2;38648:12;38662:8;38610:21;:61::i;:::-;38983:8;38948:12;:16;38961:2;38948:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39047:8;39007:12;:16;39020:2;39007:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39106:2;39073:11;:25;39085:12;39073:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39173:15;39123:11;:25;39135:12;39123:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39206:20;39229:12;39206:35;;39256:11;39285:8;39270:12;:23;39256:37;;39314:4;:23;;;;;39322:15;:2;:13;;;:15::i;:::-;39314:23;39310:832;;;39358:505;39414:12;39410:2;39389:38;;39406:1;39389:38;;;;;;;;;;;;39481:212;39550:1;39583:2;39616:14;;;;;;39661:5;39481:30;:212::i;:::-;39450:365;;39751:40;;;;;;;;;;;;;;39450:365;39858:3;39842:12;:19;39358:505;;39944:12;39927:13;;:29;39923:43;;39958:8;;;39923:43;39310:832;;;40007:120;40063:14;;;;;;40059:2;40038:40;;40055:1;40038:40;;;;;;;;;;;;40122:3;40106:12;:19;40007:120;;39310:832;40172:12;40156:13;:28;;;;38923:1273;;40206:60;40235:1;40239:2;40243:12;40257:8;40206:20;:60::i;:::-;38436:1838;38308:1966;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:329::-;5194:6;5243:2;5231:9;5222:7;5218:23;5214:32;5211:119;;;5249:79;;:::i;:::-;5211:119;5369:1;5394:53;5439:7;5430:6;5419:9;5415:22;5394:53;:::i;:::-;5384:63;;5340:117;5135:329;;;;:::o;5470:619::-;5547:6;5555;5563;5612:2;5600:9;5591:7;5587:23;5583:32;5580:119;;;5618:79;;:::i;:::-;5580:119;5738:1;5763:53;5808:7;5799:6;5788:9;5784:22;5763:53;:::i;:::-;5753:63;;5709:117;5865:2;5891:53;5936:7;5927:6;5916:9;5912:22;5891:53;:::i;:::-;5881:63;;5836:118;5993:2;6019:53;6064:7;6055:6;6044:9;6040:22;6019:53;:::i;:::-;6009:63;;5964:118;5470:619;;;;;:::o;6095:117::-;6204:1;6201;6194:12;6218:117;6327:1;6324;6317:12;6341:180;6389:77;6386:1;6379:88;6486:4;6483:1;6476:15;6510:4;6507:1;6500:15;6527:281;6610:27;6632:4;6610:27;:::i;:::-;6602:6;6598:40;6740:6;6728:10;6725:22;6704:18;6692:10;6689:34;6686:62;6683:88;;;6751:18;;:::i;:::-;6683:88;6791:10;6787:2;6780:22;6570:238;6527:281;;:::o;6814:129::-;6848:6;6875:20;;:::i;:::-;6865:30;;6904:33;6932:4;6924:6;6904:33;:::i;:::-;6814:129;;;:::o;6949:308::-;7011:4;7101:18;7093:6;7090:30;7087:56;;;7123:18;;:::i;:::-;7087:56;7161:29;7183:6;7161:29;:::i;:::-;7153:37;;7245:4;7239;7235:15;7227:23;;6949:308;;;:::o;7263:148::-;7361:6;7356:3;7351;7338:30;7402:1;7393:6;7388:3;7384:16;7377:27;7263:148;;;:::o;7417:425::-;7495:5;7520:66;7536:49;7578:6;7536:49;:::i;:::-;7520:66;:::i;:::-;7511:75;;7609:6;7602:5;7595:21;7647:4;7640:5;7636:16;7685:3;7676:6;7671:3;7667:16;7664:25;7661:112;;;7692:79;;:::i;:::-;7661:112;7782:54;7829:6;7824:3;7819;7782:54;:::i;:::-;7501:341;7417:425;;;;;:::o;7862:340::-;7918:5;7967:3;7960:4;7952:6;7948:17;7944:27;7934:122;;7975:79;;:::i;:::-;7934:122;8092:6;8079:20;8117:79;8192:3;8184:6;8177:4;8169:6;8165:17;8117:79;:::i;:::-;8108:88;;7924:278;7862:340;;;;:::o;8208:509::-;8277:6;8326:2;8314:9;8305:7;8301:23;8297:32;8294:119;;;8332:79;;:::i;:::-;8294:119;8480:1;8469:9;8465:17;8452:31;8510:18;8502:6;8499:30;8496:117;;;8532:79;;:::i;:::-;8496:117;8637:63;8692:7;8683:6;8672:9;8668:22;8637:63;:::i;:::-;8627:73;;8423:287;8208:509;;;;:::o;8723:116::-;8793:21;8808:5;8793:21;:::i;:::-;8786:5;8783:32;8773:60;;8829:1;8826;8819:12;8773:60;8723:116;:::o;8845:133::-;8888:5;8926:6;8913:20;8904:29;;8942:30;8966:5;8942:30;:::i;:::-;8845:133;;;;:::o;8984:468::-;9049:6;9057;9106:2;9094:9;9085:7;9081:23;9077:32;9074:119;;;9112:79;;:::i;:::-;9074:119;9232:1;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9203:117;9359:2;9385:50;9427:7;9418:6;9407:9;9403:22;9385:50;:::i;:::-;9375:60;;9330:115;8984:468;;;;;:::o;9458:307::-;9519:4;9609:18;9601:6;9598:30;9595:56;;;9631:18;;:::i;:::-;9595:56;9669:29;9691:6;9669:29;:::i;:::-;9661:37;;9753:4;9747;9743:15;9735:23;;9458:307;;;:::o;9771:423::-;9848:5;9873:65;9889:48;9930:6;9889:48;:::i;:::-;9873:65;:::i;:::-;9864:74;;9961:6;9954:5;9947:21;9999:4;9992:5;9988:16;10037:3;10028:6;10023:3;10019:16;10016:25;10013:112;;;10044:79;;:::i;:::-;10013:112;10134:54;10181:6;10176:3;10171;10134:54;:::i;:::-;9854:340;9771:423;;;;;:::o;10213:338::-;10268:5;10317:3;10310:4;10302:6;10298:17;10294:27;10284:122;;10325:79;;:::i;:::-;10284:122;10442:6;10429:20;10467:78;10541:3;10533:6;10526:4;10518:6;10514:17;10467:78;:::i;:::-;10458:87;;10274:277;10213:338;;;;:::o;10557:943::-;10652:6;10660;10668;10676;10725:3;10713:9;10704:7;10700:23;10696:33;10693:120;;;10732:79;;:::i;:::-;10693:120;10852:1;10877:53;10922:7;10913:6;10902:9;10898:22;10877:53;:::i;:::-;10867:63;;10823:117;10979:2;11005:53;11050:7;11041:6;11030:9;11026:22;11005:53;:::i;:::-;10995:63;;10950:118;11107:2;11133:53;11178:7;11169:6;11158:9;11154:22;11133:53;:::i;:::-;11123:63;;11078:118;11263:2;11252:9;11248:18;11235:32;11294:18;11286:6;11283:30;11280:117;;;11316:79;;:::i;:::-;11280:117;11421:62;11475:7;11466:6;11455:9;11451:22;11421:62;:::i;:::-;11411:72;;11206:287;10557:943;;;;;;;:::o;11506:474::-;11574:6;11582;11631:2;11619:9;11610:7;11606:23;11602:32;11599:119;;;11637:79;;:::i;:::-;11599:119;11757:1;11782:53;11827:7;11818:6;11807:9;11803:22;11782:53;:::i;:::-;11772:63;;11728:117;11884:2;11910:53;11955:7;11946:6;11935:9;11931:22;11910:53;:::i;:::-;11900:63;;11855:118;11506:474;;;;;:::o;11986:180::-;12034:77;12031:1;12024:88;12131:4;12128:1;12121:15;12155:4;12152:1;12145:15;12172:320;12216:6;12253:1;12247:4;12243:12;12233:22;;12300:1;12294:4;12290:12;12321:18;12311:81;;12377:4;12369:6;12365:17;12355:27;;12311:81;12439:2;12431:6;12428:14;12408:18;12405:38;12402:84;;12458:18;;:::i;:::-;12402:84;12223:269;12172:320;;;:::o;12498:180::-;12546:77;12543:1;12536:88;12643:4;12640:1;12633:15;12667:4;12664:1;12657:15;12684:410;12724:7;12747:20;12765:1;12747:20;:::i;:::-;12742:25;;12781:20;12799:1;12781:20;:::i;:::-;12776:25;;12836:1;12833;12829:9;12858:30;12876:11;12858:30;:::i;:::-;12847:41;;13037:1;13028:7;13024:15;13021:1;13018:22;12998:1;12991:9;12971:83;12948:139;;13067:18;;:::i;:::-;12948:139;12732:362;12684:410;;;;:::o;13100:191::-;13140:3;13159:20;13177:1;13159:20;:::i;:::-;13154:25;;13193:20;13211:1;13193:20;:::i;:::-;13188:25;;13236:1;13233;13229:9;13222:16;;13257:3;13254:1;13251:10;13248:36;;;13264:18;;:::i;:::-;13248:36;13100:191;;;;:::o;13297:182::-;13437:34;13433:1;13425:6;13421:14;13414:58;13297:182;:::o;13485:366::-;13627:3;13648:67;13712:2;13707:3;13648:67;:::i;:::-;13641:74;;13724:93;13813:3;13724:93;:::i;:::-;13842:2;13837:3;13833:12;13826:19;;13485:366;;;:::o;13857:419::-;14023:4;14061:2;14050:9;14046:18;14038:26;;14110:9;14104:4;14100:20;14096:1;14085:9;14081:17;14074:47;14138:131;14264:4;14138:131;:::i;:::-;14130:139;;13857:419;;;:::o;14282:141::-;14331:4;14354:3;14346:11;;14377:3;14374:1;14367:14;14411:4;14408:1;14398:18;14390:26;;14282:141;;;:::o;14429:93::-;14466:6;14513:2;14508;14501:5;14497:14;14493:23;14483:33;;14429:93;;;:::o;14528:107::-;14572:8;14622:5;14616:4;14612:16;14591:37;;14528:107;;;;:::o;14641:393::-;14710:6;14760:1;14748:10;14744:18;14783:97;14813:66;14802:9;14783:97;:::i;:::-;14901:39;14931:8;14920:9;14901:39;:::i;:::-;14889:51;;14973:4;14969:9;14962:5;14958:21;14949:30;;15022:4;15012:8;15008:19;15001:5;14998:30;14988:40;;14717:317;;14641:393;;;;;:::o;15040:60::-;15068:3;15089:5;15082:12;;15040:60;;;:::o;15106:142::-;15156:9;15189:53;15207:34;15216:24;15234:5;15216:24;:::i;:::-;15207:34;:::i;:::-;15189:53;:::i;:::-;15176:66;;15106:142;;;:::o;15254:75::-;15297:3;15318:5;15311:12;;15254:75;;;:::o;15335:269::-;15445:39;15476:7;15445:39;:::i;:::-;15506:91;15555:41;15579:16;15555:41;:::i;:::-;15547:6;15540:4;15534:11;15506:91;:::i;:::-;15500:4;15493:105;15411:193;15335:269;;;:::o;15610:73::-;15655:3;15610:73;:::o;15689:189::-;15766:32;;:::i;:::-;15807:65;15865:6;15857;15851:4;15807:65;:::i;:::-;15742:136;15689:189;;:::o;15884:186::-;15944:120;15961:3;15954:5;15951:14;15944:120;;;16015:39;16052:1;16045:5;16015:39;:::i;:::-;15988:1;15981:5;15977:13;15968:22;;15944:120;;;15884:186;;:::o;16076:543::-;16177:2;16172:3;16169:11;16166:446;;;16211:38;16243:5;16211:38;:::i;:::-;16295:29;16313:10;16295:29;:::i;:::-;16285:8;16281:44;16478:2;16466:10;16463:18;16460:49;;;16499:8;16484:23;;16460:49;16522:80;16578:22;16596:3;16578:22;:::i;:::-;16568:8;16564:37;16551:11;16522:80;:::i;:::-;16181:431;;16166:446;16076:543;;;:::o;16625:117::-;16679:8;16729:5;16723:4;16719:16;16698:37;;16625:117;;;;:::o;16748:169::-;16792:6;16825:51;16873:1;16869:6;16861:5;16858:1;16854:13;16825:51;:::i;:::-;16821:56;16906:4;16900;16896:15;16886:25;;16799:118;16748:169;;;;:::o;16922:295::-;16998:4;17144:29;17169:3;17163:4;17144:29;:::i;:::-;17136:37;;17206:3;17203:1;17199:11;17193:4;17190:21;17182:29;;16922:295;;;;:::o;17222:1395::-;17339:37;17372:3;17339:37;:::i;:::-;17441:18;17433:6;17430:30;17427:56;;;17463:18;;:::i;:::-;17427:56;17507:38;17539:4;17533:11;17507:38;:::i;:::-;17592:67;17652:6;17644;17638:4;17592:67;:::i;:::-;17686:1;17710:4;17697:17;;17742:2;17734:6;17731:14;17759:1;17754:618;;;;18416:1;18433:6;18430:77;;;18482:9;18477:3;18473:19;18467:26;18458:35;;18430:77;18533:67;18593:6;18586:5;18533:67;:::i;:::-;18527:4;18520:81;18389:222;17724:887;;17754:618;17806:4;17802:9;17794:6;17790:22;17840:37;17872:4;17840:37;:::i;:::-;17899:1;17913:208;17927:7;17924:1;17921:14;17913:208;;;18006:9;18001:3;17997:19;17991:26;17983:6;17976:42;18057:1;18049:6;18045:14;18035:24;;18104:2;18093:9;18089:18;18076:31;;17950:4;17947:1;17943:12;17938:17;;17913:208;;;18149:6;18140:7;18137:19;18134:179;;;18207:9;18202:3;18198:19;18192:26;18250:48;18292:4;18284:6;18280:17;18269:9;18250:48;:::i;:::-;18242:6;18235:64;18157:156;18134:179;18359:1;18355;18347:6;18343:14;18339:22;18333:4;18326:36;17761:611;;;17724:887;;17314:1303;;;17222:1395;;:::o;18623:147::-;18724:11;18761:3;18746:18;;18623:147;;;;:::o;18776:114::-;;:::o;18896:398::-;19055:3;19076:83;19157:1;19152:3;19076:83;:::i;:::-;19069:90;;19168:93;19257:3;19168:93;:::i;:::-;19286:1;19281:3;19277:11;19270:18;;18896:398;;;:::o;19300:379::-;19484:3;19506:147;19649:3;19506:147;:::i;:::-;19499:154;;19670:3;19663:10;;19300:379;;;:::o;19685:165::-;19825:17;19821:1;19813:6;19809:14;19802:41;19685:165;:::o;19856:366::-;19998:3;20019:67;20083:2;20078:3;20019:67;:::i;:::-;20012:74;;20095:93;20184:3;20095:93;:::i;:::-;20213:2;20208:3;20204:12;20197:19;;19856:366;;;:::o;20228:419::-;20394:4;20432:2;20421:9;20417:18;20409:26;;20481:9;20475:4;20471:20;20467:1;20456:9;20452:17;20445:47;20509:131;20635:4;20509:131;:::i;:::-;20501:139;;20228:419;;;:::o;20653:234::-;20793:34;20789:1;20781:6;20777:14;20770:58;20862:17;20857:2;20849:6;20845:15;20838:42;20653:234;:::o;20893:366::-;21035:3;21056:67;21120:2;21115:3;21056:67;:::i;:::-;21049:74;;21132:93;21221:3;21132:93;:::i;:::-;21250:2;21245:3;21241:12;21234:19;;20893:366;;;:::o;21265:419::-;21431:4;21469:2;21458:9;21454:18;21446:26;;21518:9;21512:4;21508:20;21504:1;21493:9;21489:17;21482:47;21546:131;21672:4;21546:131;:::i;:::-;21538:139;;21265:419;;;:::o;21690:148::-;21792:11;21829:3;21814:18;;21690:148;;;;:::o;21844:390::-;21950:3;21978:39;22011:5;21978:39;:::i;:::-;22033:89;22115:6;22110:3;22033:89;:::i;:::-;22026:96;;22131:65;22189:6;22184:3;22177:4;22170:5;22166:16;22131:65;:::i;:::-;22221:6;22216:3;22212:16;22205:23;;21954:280;21844:390;;;;:::o;22264:874::-;22367:3;22404:5;22398:12;22433:36;22459:9;22433:36;:::i;:::-;22485:89;22567:6;22562:3;22485:89;:::i;:::-;22478:96;;22605:1;22594:9;22590:17;22621:1;22616:166;;;;22796:1;22791:341;;;;22583:549;;22616:166;22700:4;22696:9;22685;22681:25;22676:3;22669:38;22762:6;22755:14;22748:22;22740:6;22736:35;22731:3;22727:45;22720:52;;22616:166;;22791:341;22858:38;22890:5;22858:38;:::i;:::-;22918:1;22932:154;22946:6;22943:1;22940:13;22932:154;;;23020:7;23014:14;23010:1;23005:3;23001:11;22994:35;23070:1;23061:7;23057:15;23046:26;;22968:4;22965:1;22961:12;22956:17;;22932:154;;;23115:6;23110:3;23106:16;23099:23;;22798:334;;22583:549;;22371:767;;22264:874;;;;:::o;23144:589::-;23369:3;23391:95;23482:3;23473:6;23391:95;:::i;:::-;23384:102;;23503:95;23594:3;23585:6;23503:95;:::i;:::-;23496:102;;23615:92;23703:3;23694:6;23615:92;:::i;:::-;23608:99;;23724:3;23717:10;;23144:589;;;;;;:::o;23739:225::-;23879:34;23875:1;23867:6;23863:14;23856:58;23948:8;23943:2;23935:6;23931:15;23924:33;23739:225;:::o;23970:366::-;24112:3;24133:67;24197:2;24192:3;24133:67;:::i;:::-;24126:74;;24209:93;24298:3;24209:93;:::i;:::-;24327:2;24322:3;24318:12;24311:19;;23970:366;;;:::o;24342:419::-;24508:4;24546:2;24535:9;24531:18;24523:26;;24595:9;24589:4;24585:20;24581:1;24570:9;24566:17;24559:47;24623:131;24749:4;24623:131;:::i;:::-;24615:139;;24342:419;;;:::o;24767:98::-;24818:6;24852:5;24846:12;24836:22;;24767:98;;;:::o;24871:168::-;24954:11;24988:6;24983:3;24976:19;25028:4;25023:3;25019:14;25004:29;;24871:168;;;;:::o;25045:373::-;25131:3;25159:38;25191:5;25159:38;:::i;:::-;25213:70;25276:6;25271:3;25213:70;:::i;:::-;25206:77;;25292:65;25350:6;25345:3;25338:4;25331:5;25327:16;25292:65;:::i;:::-;25382:29;25404:6;25382:29;:::i;:::-;25377:3;25373:39;25366:46;;25135:283;25045:373;;;;:::o;25424:640::-;25619:4;25657:3;25646:9;25642:19;25634:27;;25671:71;25739:1;25728:9;25724:17;25715:6;25671:71;:::i;:::-;25752:72;25820:2;25809:9;25805:18;25796:6;25752:72;:::i;:::-;25834;25902:2;25891:9;25887:18;25878:6;25834:72;:::i;:::-;25953:9;25947:4;25943:20;25938:2;25927:9;25923:18;25916:48;25981:76;26052:4;26043:6;25981:76;:::i;:::-;25973:84;;25424:640;;;;;;;:::o;26070:141::-;26126:5;26157:6;26151:13;26142:22;;26173:32;26199:5;26173:32;:::i;:::-;26070:141;;;;:::o;26217:349::-;26286:6;26335:2;26323:9;26314:7;26310:23;26306:32;26303:119;;;26341:79;;:::i;:::-;26303:119;26461:1;26486:63;26541:7;26532:6;26521:9;26517:22;26486:63;:::i;:::-;26476:73;;26432:127;26217:349;;;;:::o;26572:233::-;26611:3;26634:24;26652:5;26634:24;:::i;:::-;26625:33;;26680:66;26673:5;26670:77;26667:103;;26750:18;;:::i;:::-;26667:103;26797:1;26790:5;26786:13;26779:20;;26572:233;;;:::o;26811:180::-;26859:77;26856:1;26849:88;26956:4;26953:1;26946:15;26980:4;26977:1;26970:15;26997:185;27037:1;27054:20;27072:1;27054:20;:::i;:::-;27049:25;;27088:20;27106:1;27088:20;:::i;:::-;27083:25;;27127:1;27117:35;;27132:18;;:::i;:::-;27117:35;27174:1;27171;27167:9;27162:14;;26997:185;;;;:::o;27188:194::-;27228:4;27248:20;27266:1;27248:20;:::i;:::-;27243:25;;27282:20;27300:1;27282:20;:::i;:::-;27277:25;;27326:1;27323;27319:9;27311:17;;27350:1;27344:4;27341:11;27338:37;;;27355:18;;:::i;:::-;27338:37;27188:194;;;;:::o;27388:176::-;27420:1;27437:20;27455:1;27437:20;:::i;:::-;27432:25;;27471:20;27489:1;27471:20;:::i;:::-;27466:25;;27510:1;27500:35;;27515:18;;:::i;:::-;27500:35;27556:1;27553;27549:9;27544:14;;27388:176;;;;:::o;27570:180::-;27618:77;27615:1;27608:88;27715:4;27712:1;27705:15;27739:4;27736:1;27729:15

Swarm Source

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