ETH Price: $3,523.22 (+6.85%)

Token

RunningGoblin (RunningGoblin)
 

Overview

Max Total Supply

382 RunningGoblin

Holders

120

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 RunningGoblin
0xf7f09ccfb7e7f7df3adea1c5a94a07d3cae4f73d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Goblin

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
*/

// 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/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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// 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/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @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, IERC721A {
    using Address for address;
    using Strings for uint256;

    // 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 override 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) if (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) if(!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()) if(!_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;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 (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 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) 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;

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


pragma solidity ^0.8.14;





contract Goblin is Ownable, ERC721A, ReentrancyGuard {

    //using
    using Address for address;
    using SafeMath for uint256;

    mapping(address => uint256) public mintMap;
    uint256 public immutable maxSupply = 9509;
    uint256 public immutable amountForDevs = 500;
    uint256 public devMinted = 0;
    uint256 public normalMinted = 0;
    uint256 public maxMint = 5;
    uint256 public maxFreeMint = 3;
    uint256 public price = 3000000000000000; //0.003
    string public _baseTokenURI;
    address public immutable devAddress;
    address payable public immutable shareholderAddress;

    constructor(
        string memory name, //RunningGoblin
        string memory symbol, //RunningGoblin
        address payable _shareholderAddress, //0x8878Bebb31658Cc0676B9E0D9506A96B5f55d6Fb
        address _devAddress, //0x8878Bebb31658Cc0676B9E0D9506A96B5f55d6Fb
        string memory _baseURI //https://www.runninggoblin.xyz/nft/json/
    )ERC721A(name, symbol){
        devAddress = _devAddress;
        shareholderAddress = _shareholderAddress;
        _baseTokenURI = _baseURI;
    }

    function devMint(uint256 _amount) external onlyOwner {
        require(
            (devMinted + _amount) <= amountForDevs,
            "Goblin: Dev minted!"
        );
        devMinted = devMinted + _amount;
        _safeMint(devAddress, amountForDevs);
    }

    function mint(uint256 _amount) external payable nonReentrant returns (bool) {
        require((normalMinted + _amount) <= maxSupply, "Goblin: exceeds the total amount.");
        require((mintMap[msg.sender] + _amount) <= maxMint, "Goblin: You have already minted.");
        uint256 _price = 0;
        if ((mintMap[msg.sender] + _amount) > maxFreeMint) {
            if (mintMap[msg.sender] >= maxFreeMint) {
                _price = _amount * price;
            } else {
                _price = (mintMap[msg.sender] + _amount - maxFreeMint) * price;
            }
        }
        require(
            msg.value >= _price,
            "Insufficient funds."
        );
        mintMap[msg.sender] = mintMap[msg.sender] + _amount;
        normalMinted = normalMinted + _amount;
        _safeMint(msg.sender, _amount);
        return true;
    }

    function setPrice(uint96 _maxMint, uint96 _maxFreeMint, uint256 _price) public onlyOwner {
        maxMint = _maxMint;
        maxFreeMint = _maxFreeMint;
        price = _price;
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(shareholderAddress, balance);
    }

    function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721A)
    returns (string memory)
    {
        require(
            _exists(tokenId),
            "Goblin: URI query for nonexistent token"
        );
        return string(
            abi.encodePacked(
                _baseTokenURI,
                Strings.toString(tokenId),
                ".json"
            ));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address payable","name":"_shareholderAddress","type":"address"},{"internalType":"address","name":"_devAddress","type":"address"},{"internalType":"string","name":"_baseURI","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":"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":"URIQueryForNonexistentToken","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":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintMap","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":"normalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_maxMint","type":"uint96"},{"internalType":"uint96","name":"_maxFreeMint","type":"uint96"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareholderAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526125256080908152506101f460a0908152506000600b556000600c556005600d556003600e55660aa87bee538000600f553480156200004357600080fd5b506040516200475438038062004754833981810160405281019062000069919062000470565b84846200008b6200007f6200015460201b60201c565b6200015c60201b60201c565b81600390816200009c9190620007a0565b508060049081620000ae9190620007a0565b50620000bf6200022060201b60201c565b600181905550505060016009819055508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508060109081620001489190620007a0565b50505050505062000887565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002928262000247565b810181811067ffffffffffffffff82111715620002b457620002b362000258565b5b80604052505050565b6000620002c962000229565b9050620002d7828262000287565b919050565b600067ffffffffffffffff821115620002fa57620002f962000258565b5b620003058262000247565b9050602081019050919050565b60005b838110156200033257808201518184015260208101905062000315565b8381111562000342576000848401525b50505050565b60006200035f6200035984620002dc565b620002bd565b9050828152602081018484840111156200037e576200037d62000242565b5b6200038b84828562000312565b509392505050565b600082601f830112620003ab57620003aa6200023d565b5b8151620003bd84826020860162000348565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003f382620003c6565b9050919050565b6200040581620003e6565b81146200041157600080fd5b50565b6000815190506200042581620003fa565b92915050565b60006200043882620003c6565b9050919050565b6200044a816200042b565b81146200045657600080fd5b50565b6000815190506200046a816200043f565b92915050565b600080600080600060a086880312156200048f576200048e62000233565b5b600086015167ffffffffffffffff811115620004b057620004af62000238565b5b620004be8882890162000393565b955050602086015167ffffffffffffffff811115620004e257620004e162000238565b5b620004f08882890162000393565b9450506040620005038882890162000414565b9350506060620005168882890162000459565b925050608086015167ffffffffffffffff8111156200053a576200053962000238565b5b620005488882890162000393565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a857607f821691505b602082108103620005be57620005bd62000560565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005e9565b620006348683620005e9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006816200067b62000675846200064c565b62000656565b6200064c565b9050919050565b6000819050919050565b6200069d8362000660565b620006b5620006ac8262000688565b848454620005f6565b825550505050565b600090565b620006cc620006bd565b620006d981848462000692565b505050565b5b818110156200070157620006f5600082620006c2565b600181019050620006df565b5050565b601f82111562000750576200071a81620005c4565b6200072584620005d9565b8101602085101562000735578190505b6200074d6200074485620005d9565b830182620006de565b50505b505050565b600082821c905092915050565b6000620007756000198460080262000755565b1980831691505092915050565b600062000790838362000762565b9150826002028217905092915050565b620007ab8262000555565b67ffffffffffffffff811115620007c757620007c662000258565b5b620007d382546200058f565b620007e082828562000705565b600060209050601f83116001811462000818576000841562000803578287015190505b6200080f858262000782565b8655506200087f565b601f1984166200082886620005c4565b60005b8281101562000852578489015182556001820191506020850194506020810190506200082b565b868310156200087257848901516200086e601f89168262000762565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e051613e70620008e460003960008181610cd90152610f6c015260008181610be70152610c31015260008181610b6001528181610c0801526118f9015260008181611077015261174a0152613e706000f3fe6080604052600436106101ee5760003560e01c806382b102621161010d578063adf2131b116100a0578063cfc86f7b1161006f578063cfc86f7b146106e0578063d5abeb011461070b578063e985e9c514610736578063f2fde38b14610773578063fbe1aa511461079c576101ee565b8063adf2131b14610626578063b88d4fde14610651578063c87b56dd1461067a578063c9bf3b68146106b7576101ee565b8063a035b1fe116100dc578063a035b1fe14610577578063a0712d68146105a2578063a22cb465146105d2578063a591252d146105fb576101ee565b806382b10262146104cb5780638da5cb5b146104f6578063943d40e71461052157806395d89b411461054c576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e1461040f57806370a082311461044c578063715018a6146104895780637501f741146104a0576101ee565b80633ccfd60b1461036957806342842e0e1461038057806355f804b3146103a957806360d3721f146103d2576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec578063375a069a146103155780633ad10ef61461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612afa565b6107c7565b6040516102279190612b42565b60405180910390f35b34801561023c57600080fd5b506102456108a9565b6040516102529190612bf6565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612c4e565b61093b565b60405161028f9190612cbc565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612d03565b6109b7565b005b3480156102cd57600080fd5b506102d6610abb565b6040516102e39190612d52565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612d6d565b610ad2565b005b34801561032157600080fd5b5061033c60048036038101906103379190612c4e565b610ae2565b005b34801561034a57600080fd5b50610353610c2f565b6040516103609190612cbc565b60405180910390f35b34801561037557600080fd5b5061037e610c53565b005b34801561038c57600080fd5b506103a760048036038101906103a29190612d6d565b610d01565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612ef5565b610d21565b005b3480156103de57600080fd5b506103f960048036038101906103f49190612f3e565b610db0565b6040516104069190612d52565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190612c4e565b610dc8565b6040516104439190612cbc565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612f3e565b610dde565b6040516104809190612d52565b60405180910390f35b34801561049557600080fd5b5061049e610ead565b005b3480156104ac57600080fd5b506104b5610f35565b6040516104c29190612d52565b60405180910390f35b3480156104d757600080fd5b506104e0610f3b565b6040516104ed9190612d52565b60405180910390f35b34801561050257600080fd5b5061050b610f41565b6040516105189190612cbc565b60405180910390f35b34801561052d57600080fd5b50610536610f6a565b6040516105439190612f8c565b60405180910390f35b34801561055857600080fd5b50610561610f8e565b60405161056e9190612bf6565b60405180910390f35b34801561058357600080fd5b5061058c611020565b6040516105999190612d52565b60405180910390f35b6105bc60048036038101906105b79190612c4e565b611026565b6040516105c99190612b42565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612fd3565b611391565b005b34801561060757600080fd5b50610610611508565b60405161061d9190612d52565b60405180910390f35b34801561063257600080fd5b5061063b61150e565b6040516106489190612d52565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906130b4565b611514565b005b34801561068657600080fd5b506106a1600480360381019061069c9190612c4e565b61158c565b6040516106ae9190612bf6565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061317b565b611608565b005b3480156106ec57600080fd5b506106f56116ba565b6040516107029190612bf6565b60405180910390f35b34801561071757600080fd5b50610720611748565b60405161072d9190612d52565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906131ce565b61176c565b60405161076a9190612b42565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190612f3e565b611800565b005b3480156107a857600080fd5b506107b16118f7565b6040516107be9190612d52565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a257506108a18261191b565b5b9050919050565b6060600380546108b89061323d565b80601f01602080910402602001604051908101604052809291908181526020018280546108e49061323d565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b600061094682611985565b61097c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c282610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a29576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a486119d3565b73ffffffffffffffffffffffffffffffffffffffff1614610aab57610a7481610a6f6119d3565b61176c565b610aaa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610ab68383836119db565b505050565b6000610ac5611a8d565b6002546001540303905090565b610add838383611a96565b505050565b610aea6119d3565b73ffffffffffffffffffffffffffffffffffffffff16610b08610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906132ba565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081600b54610b8d9190613309565b1115610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906133ab565b60405180910390fd5b80600b54610bdc9190613309565b600b81905550610c2c7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f4a565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c5b6119d3565b73ffffffffffffffffffffffffffffffffffffffff16610c79610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc6906132ba565b60405180910390fd5b6000479050610cfe7f000000000000000000000000000000000000000000000000000000000000000082611f68565b50565b610d1c83838360405180602001604052806000815250611514565b505050565b610d296119d3565b73ffffffffffffffffffffffffffffffffffffffff16610d47610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d94906132ba565b60405180910390fd5b8060109081610dac9190613577565b5050565b600a6020528060005260406000206000915090505481565b6000610dd38261205c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e45576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eb56119d3565b73ffffffffffffffffffffffffffffffffffffffff16610ed3610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906132ba565b60405180910390fd5b610f3360006122e7565b565b600d5481565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060048054610f9d9061323d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc99061323d565b80156110165780601f10610feb57610100808354040283529160200191611016565b820191906000526020600020905b815481529060010190602001808311610ff957829003601f168201915b5050505050905090565b600f5481565b600060026009540361106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490613695565b60405180910390fd5b60026009819055507f000000000000000000000000000000000000000000000000000000000000000082600c546110a49190613309565b11156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc90613727565b60405180910390fd5b600d5482600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111339190613309565b1115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b90613793565b60405180910390fd5b6000600e5483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111c49190613309565b111561129057600e54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061122757600f548361122091906137b3565b905061128f565b600f54600e5484600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112789190613309565b611282919061380d565b61128c91906137b3565b90505b5b803410156112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca9061388d565b60405180910390fd5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613309565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600c5461136f9190613309565b600c8190555061137f3384611f4a565b60019150506001600981905550919050565b6113996119d3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140a6119d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b76119d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114fc9190612b42565b60405180910390a35050565b600e5481565b600b5481565b61151f848484611a96565b61153e8373ffffffffffffffffffffffffffffffffffffffff166123ab565b156115865761154f848484846123ce565b611585576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061159782611985565b6115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd9061391f565b60405180910390fd5b60106115e18361251e565b6040516020016115f2929190613a4a565b6040516020818303038152906040529050919050565b6116106119d3565b73ffffffffffffffffffffffffffffffffffffffff1661162e610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b906132ba565b60405180910390fd5b826bffffffffffffffffffffffff16600d81905550816bffffffffffffffffffffffff16600e8190555080600f81905550505050565b601080546116c79061323d565b80601f01602080910402602001604051908101604052809291908181526020018280546116f39061323d565b80156117405780601f1061171557610100808354040283529160200191611740565b820191906000526020600020905b81548152906001019060200180831161172357829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118086119d3565b73ffffffffffffffffffffffffffffffffffffffff16611826610f41565b73ffffffffffffffffffffffffffffffffffffffff161461187c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611873906132ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613aeb565b60405180910390fd5b6118f4816122e7565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611990611a8d565b1115801561199f575060015482105b80156119cc575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611aa18261205c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b2d6119d3565b73ffffffffffffffffffffffffffffffffffffffff161480611b5c5750611b5b85611b566119d3565b61176c565b5b80611ba15750611b6a6119d3565b73ffffffffffffffffffffffffffffffffffffffff16611b898461093b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bda576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c40576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c4d858585600161267e565b611c59600084876119db565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ed8576001548214611ed757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f438585856001612684565b5050505050565b611f6482826040518060200160405280600081525061268a565b5050565b80471015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290613b57565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fd190613ba8565b60006040518083038185875af1925050503d806000811461200e576040519150601f19603f3d011682016040523d82523d6000602084013e612013565b606091505b5050905080612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613c2f565b60405180910390fd5b505050565b612064612a4b565b600082905080612072611a8d565b116122b0576001548110156122af576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122ad57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121915780925050506122e2565b5b6001156122ac57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122a75780925050506122e2565b612192565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f46119d3565b8786866040518563ffffffff1660e01b81526004016124169493929190613ca4565b6020604051808303816000875af192505050801561245257506040513d601f19601f8201168201806040525081019061244f9190613d05565b60015b6124cb573d8060008114612482576040519150601f19603f3d011682016040523d82523d6000602084013e612487565b606091505b5060008151036124c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612565576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612679565b600082905060005b6000821461259757808061258090613d32565b915050600a826125909190613da9565b915061256d565b60008167ffffffffffffffff8111156125b3576125b2612dca565b5b6040519080825280601f01601f1916602001820160405280156125e55781602001600182028036833780820191505090505b5090505b60008514612672576001826125fe919061380d565b9150600a8561260d9190613dda565b60306126199190613309565b60f81b81838151811061262f5761262e613e0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561266b9190613da9565b94506125e9565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612731576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273e600085838661267e565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506128ff8673ffffffffffffffffffffffffffffffffffffffff166123ab565b156129c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461297460008784806001019550876123ce565b6129aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129055782600154146129bf57600080fd5b612a2f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129c5575b816001819055505050612a456000858386612684565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ad781612aa2565b8114612ae257600080fd5b50565b600081359050612af481612ace565b92915050565b600060208284031215612b1057612b0f612a98565b5b6000612b1e84828501612ae5565b91505092915050565b60008115159050919050565b612b3c81612b27565b82525050565b6000602082019050612b576000830184612b33565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b97578082015181840152602081019050612b7c565b83811115612ba6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bc882612b5d565b612bd28185612b68565b9350612be2818560208601612b79565b612beb81612bac565b840191505092915050565b60006020820190508181036000830152612c108184612bbd565b905092915050565b6000819050919050565b612c2b81612c18565b8114612c3657600080fd5b50565b600081359050612c4881612c22565b92915050565b600060208284031215612c6457612c63612a98565b5b6000612c7284828501612c39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ca682612c7b565b9050919050565b612cb681612c9b565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b612ce081612c9b565b8114612ceb57600080fd5b50565b600081359050612cfd81612cd7565b92915050565b60008060408385031215612d1a57612d19612a98565b5b6000612d2885828601612cee565b9250506020612d3985828601612c39565b9150509250929050565b612d4c81612c18565b82525050565b6000602082019050612d676000830184612d43565b92915050565b600080600060608486031215612d8657612d85612a98565b5b6000612d9486828701612cee565b9350506020612da586828701612cee565b9250506040612db686828701612c39565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e0282612bac565b810181811067ffffffffffffffff82111715612e2157612e20612dca565b5b80604052505050565b6000612e34612a8e565b9050612e408282612df9565b919050565b600067ffffffffffffffff821115612e6057612e5f612dca565b5b612e6982612bac565b9050602081019050919050565b82818337600083830152505050565b6000612e98612e9384612e45565b612e2a565b905082815260208101848484011115612eb457612eb3612dc5565b5b612ebf848285612e76565b509392505050565b600082601f830112612edc57612edb612dc0565b5b8135612eec848260208601612e85565b91505092915050565b600060208284031215612f0b57612f0a612a98565b5b600082013567ffffffffffffffff811115612f2957612f28612a9d565b5b612f3584828501612ec7565b91505092915050565b600060208284031215612f5457612f53612a98565b5b6000612f6284828501612cee565b91505092915050565b6000612f7682612c7b565b9050919050565b612f8681612f6b565b82525050565b6000602082019050612fa16000830184612f7d565b92915050565b612fb081612b27565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b60008060408385031215612fea57612fe9612a98565b5b6000612ff885828601612cee565b925050602061300985828601612fbe565b9150509250929050565b600067ffffffffffffffff82111561302e5761302d612dca565b5b61303782612bac565b9050602081019050919050565b600061305761305284613013565b612e2a565b90508281526020810184848401111561307357613072612dc5565b5b61307e848285612e76565b509392505050565b600082601f83011261309b5761309a612dc0565b5b81356130ab848260208601613044565b91505092915050565b600080600080608085870312156130ce576130cd612a98565b5b60006130dc87828801612cee565b94505060206130ed87828801612cee565b93505060406130fe87828801612c39565b925050606085013567ffffffffffffffff81111561311f5761311e612a9d565b5b61312b87828801613086565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61315881613137565b811461316357600080fd5b50565b6000813590506131758161314f565b92915050565b60008060006060848603121561319457613193612a98565b5b60006131a286828701613166565b93505060206131b386828701613166565b92505060406131c486828701612c39565b9150509250925092565b600080604083850312156131e5576131e4612a98565b5b60006131f385828601612cee565b925050602061320485828601612cee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325557607f821691505b6020821081036132685761326761320e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132a4602083612b68565b91506132af8261326e565b602082019050919050565b600060208201905081810360008301526132d381613297565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061331482612c18565b915061331f83612c18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613354576133536132da565b5b828201905092915050565b7f476f626c696e3a20446576206d696e7465642100000000000000000000000000600082015250565b6000613395601383612b68565b91506133a08261335f565b602082019050919050565b600060208201905081810360008301526133c481613388565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261342d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133f0565b61343786836133f0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061347461346f61346a84612c18565b61344f565b612c18565b9050919050565b6000819050919050565b61348e83613459565b6134a261349a8261347b565b8484546133fd565b825550505050565b600090565b6134b76134aa565b6134c2818484613485565b505050565b5b818110156134e6576134db6000826134af565b6001810190506134c8565b5050565b601f82111561352b576134fc816133cb565b613505846133e0565b81016020851015613514578190505b613528613520856133e0565b8301826134c7565b50505b505050565b600082821c905092915050565b600061354e60001984600802613530565b1980831691505092915050565b6000613567838361353d565b9150826002028217905092915050565b61358082612b5d565b67ffffffffffffffff81111561359957613598612dca565b5b6135a3825461323d565b6135ae8282856134ea565b600060209050601f8311600181146135e157600084156135cf578287015190505b6135d9858261355b565b865550613641565b601f1984166135ef866133cb565b60005b82811015613617578489015182556001820191506020850194506020810190506135f2565b868310156136345784890151613630601f89168261353d565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061367f601f83612b68565b915061368a82613649565b602082019050919050565b600060208201905081810360008301526136ae81613672565b9050919050565b7f476f626c696e3a20657863656564732074686520746f74616c20616d6f756e7460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613711602183612b68565b915061371c826136b5565b604082019050919050565b6000602082019050818103600083015261374081613704565b9050919050565b7f476f626c696e3a20596f75206861766520616c7265616479206d696e7465642e600082015250565b600061377d602083612b68565b915061378882613747565b602082019050919050565b600060208201905081810360008301526137ac81613770565b9050919050565b60006137be82612c18565b91506137c983612c18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613802576138016132da565b5b828202905092915050565b600061381882612c18565b915061382383612c18565b925082821015613836576138356132da565b5b828203905092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000613877601383612b68565b915061388282613841565b602082019050919050565b600060208201905081810360008301526138a68161386a565b9050919050565b7f476f626c696e3a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b6000613909602783612b68565b9150613914826138ad565b604082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b600081905092915050565b600081546139578161323d565b613961818661393f565b9450600182166000811461397c5760018114613991576139c4565b60ff19831686528115158202860193506139c4565b61399a856133cb565b60005b838110156139bc5781548189015260018201915060208101905061399d565b838801955050505b50505092915050565b60006139d882612b5d565b6139e2818561393f565b93506139f2818560208601612b79565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a3460058361393f565b9150613a3f826139fe565b600582019050919050565b6000613a56828561394a565b9150613a6282846139cd565b9150613a6d82613a27565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ad5602683612b68565b9150613ae082613a79565b604082019050919050565b60006020820190508181036000830152613b0481613ac8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613b41601d83612b68565b9150613b4c82613b0b565b602082019050919050565b60006020820190508181036000830152613b7081613b34565b9050919050565b600081905092915050565b50565b6000613b92600083613b77565b9150613b9d82613b82565b600082019050919050565b6000613bb382613b85565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613c19603a83612b68565b9150613c2482613bbd565b604082019050919050565b60006020820190508181036000830152613c4881613c0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c7682613c4f565b613c808185613c5a565b9350613c90818560208601612b79565b613c9981612bac565b840191505092915050565b6000608082019050613cb96000830187612cad565b613cc66020830186612cad565b613cd36040830185612d43565b8181036060830152613ce58184613c6b565b905095945050505050565b600081519050613cff81612ace565b92915050565b600060208284031215613d1b57613d1a612a98565b5b6000613d2984828501613cf0565b91505092915050565b6000613d3d82612c18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d6f57613d6e6132da565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613db482612c18565b9150613dbf83612c18565b925082613dcf57613dce613d7a565b5b828204905092915050565b6000613de582612c18565b9150613df083612c18565b925082613e0057613dff613d7a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220855fc176ee078877df0b89ea77c26b7df43d5ebbb21bc10d6b7fa75f57c43c4164736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000d52756e6e696e67476f626c696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d52756e6e696e67476f626c696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f7777772e72756e6e696e67676f626c696e2e78797a2f6e66742f6a736f6e2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806382b102621161010d578063adf2131b116100a0578063cfc86f7b1161006f578063cfc86f7b146106e0578063d5abeb011461070b578063e985e9c514610736578063f2fde38b14610773578063fbe1aa511461079c576101ee565b8063adf2131b14610626578063b88d4fde14610651578063c87b56dd1461067a578063c9bf3b68146106b7576101ee565b8063a035b1fe116100dc578063a035b1fe14610577578063a0712d68146105a2578063a22cb465146105d2578063a591252d146105fb576101ee565b806382b10262146104cb5780638da5cb5b146104f6578063943d40e71461052157806395d89b411461054c576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e1461040f57806370a082311461044c578063715018a6146104895780637501f741146104a0576101ee565b80633ccfd60b1461036957806342842e0e1461038057806355f804b3146103a957806360d3721f146103d2576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec578063375a069a146103155780633ad10ef61461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612afa565b6107c7565b6040516102279190612b42565b60405180910390f35b34801561023c57600080fd5b506102456108a9565b6040516102529190612bf6565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612c4e565b61093b565b60405161028f9190612cbc565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612d03565b6109b7565b005b3480156102cd57600080fd5b506102d6610abb565b6040516102e39190612d52565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612d6d565b610ad2565b005b34801561032157600080fd5b5061033c60048036038101906103379190612c4e565b610ae2565b005b34801561034a57600080fd5b50610353610c2f565b6040516103609190612cbc565b60405180910390f35b34801561037557600080fd5b5061037e610c53565b005b34801561038c57600080fd5b506103a760048036038101906103a29190612d6d565b610d01565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612ef5565b610d21565b005b3480156103de57600080fd5b506103f960048036038101906103f49190612f3e565b610db0565b6040516104069190612d52565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190612c4e565b610dc8565b6040516104439190612cbc565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612f3e565b610dde565b6040516104809190612d52565b60405180910390f35b34801561049557600080fd5b5061049e610ead565b005b3480156104ac57600080fd5b506104b5610f35565b6040516104c29190612d52565b60405180910390f35b3480156104d757600080fd5b506104e0610f3b565b6040516104ed9190612d52565b60405180910390f35b34801561050257600080fd5b5061050b610f41565b6040516105189190612cbc565b60405180910390f35b34801561052d57600080fd5b50610536610f6a565b6040516105439190612f8c565b60405180910390f35b34801561055857600080fd5b50610561610f8e565b60405161056e9190612bf6565b60405180910390f35b34801561058357600080fd5b5061058c611020565b6040516105999190612d52565b60405180910390f35b6105bc60048036038101906105b79190612c4e565b611026565b6040516105c99190612b42565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612fd3565b611391565b005b34801561060757600080fd5b50610610611508565b60405161061d9190612d52565b60405180910390f35b34801561063257600080fd5b5061063b61150e565b6040516106489190612d52565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906130b4565b611514565b005b34801561068657600080fd5b506106a1600480360381019061069c9190612c4e565b61158c565b6040516106ae9190612bf6565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061317b565b611608565b005b3480156106ec57600080fd5b506106f56116ba565b6040516107029190612bf6565b60405180910390f35b34801561071757600080fd5b50610720611748565b60405161072d9190612d52565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906131ce565b61176c565b60405161076a9190612b42565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190612f3e565b611800565b005b3480156107a857600080fd5b506107b16118f7565b6040516107be9190612d52565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a257506108a18261191b565b5b9050919050565b6060600380546108b89061323d565b80601f01602080910402602001604051908101604052809291908181526020018280546108e49061323d565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b600061094682611985565b61097c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c282610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a29576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a486119d3565b73ffffffffffffffffffffffffffffffffffffffff1614610aab57610a7481610a6f6119d3565b61176c565b610aaa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610ab68383836119db565b505050565b6000610ac5611a8d565b6002546001540303905090565b610add838383611a96565b505050565b610aea6119d3565b73ffffffffffffffffffffffffffffffffffffffff16610b08610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906132ba565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000001f481600b54610b8d9190613309565b1115610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906133ab565b60405180910390fd5b80600b54610bdc9190613309565b600b81905550610c2c7f0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb7f00000000000000000000000000000000000000000000000000000000000001f4611f4a565b50565b7f0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb81565b610c5b6119d3565b73ffffffffffffffffffffffffffffffffffffffff16610c79610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc6906132ba565b60405180910390fd5b6000479050610cfe7f0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb82611f68565b50565b610d1c83838360405180602001604052806000815250611514565b505050565b610d296119d3565b73ffffffffffffffffffffffffffffffffffffffff16610d47610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d94906132ba565b60405180910390fd5b8060109081610dac9190613577565b5050565b600a6020528060005260406000206000915090505481565b6000610dd38261205c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e45576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eb56119d3565b73ffffffffffffffffffffffffffffffffffffffff16610ed3610f41565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906132ba565b60405180910390fd5b610f3360006122e7565b565b600d5481565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb81565b606060048054610f9d9061323d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc99061323d565b80156110165780601f10610feb57610100808354040283529160200191611016565b820191906000526020600020905b815481529060010190602001808311610ff957829003601f168201915b5050505050905090565b600f5481565b600060026009540361106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490613695565b60405180910390fd5b60026009819055507f000000000000000000000000000000000000000000000000000000000000252582600c546110a49190613309565b11156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc90613727565b60405180910390fd5b600d5482600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111339190613309565b1115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b90613793565b60405180910390fd5b6000600e5483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111c49190613309565b111561129057600e54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061122757600f548361122091906137b3565b905061128f565b600f54600e5484600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112789190613309565b611282919061380d565b61128c91906137b3565b90505b5b803410156112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca9061388d565b60405180910390fd5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613309565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600c5461136f9190613309565b600c8190555061137f3384611f4a565b60019150506001600981905550919050565b6113996119d3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140a6119d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b76119d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114fc9190612b42565b60405180910390a35050565b600e5481565b600b5481565b61151f848484611a96565b61153e8373ffffffffffffffffffffffffffffffffffffffff166123ab565b156115865761154f848484846123ce565b611585576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061159782611985565b6115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd9061391f565b60405180910390fd5b60106115e18361251e565b6040516020016115f2929190613a4a565b6040516020818303038152906040529050919050565b6116106119d3565b73ffffffffffffffffffffffffffffffffffffffff1661162e610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b906132ba565b60405180910390fd5b826bffffffffffffffffffffffff16600d81905550816bffffffffffffffffffffffff16600e8190555080600f81905550505050565b601080546116c79061323d565b80601f01602080910402602001604051908101604052809291908181526020018280546116f39061323d565b80156117405780601f1061171557610100808354040283529160200191611740565b820191906000526020600020905b81548152906001019060200180831161172357829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000252581565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118086119d3565b73ffffffffffffffffffffffffffffffffffffffff16611826610f41565b73ffffffffffffffffffffffffffffffffffffffff161461187c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611873906132ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613aeb565b60405180910390fd5b6118f4816122e7565b50565b7f00000000000000000000000000000000000000000000000000000000000001f481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611990611a8d565b1115801561199f575060015482105b80156119cc575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611aa18261205c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b2d6119d3565b73ffffffffffffffffffffffffffffffffffffffff161480611b5c5750611b5b85611b566119d3565b61176c565b5b80611ba15750611b6a6119d3565b73ffffffffffffffffffffffffffffffffffffffff16611b898461093b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bda576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c40576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c4d858585600161267e565b611c59600084876119db565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ed8576001548214611ed757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f438585856001612684565b5050505050565b611f6482826040518060200160405280600081525061268a565b5050565b80471015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290613b57565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fd190613ba8565b60006040518083038185875af1925050503d806000811461200e576040519150601f19603f3d011682016040523d82523d6000602084013e612013565b606091505b5050905080612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613c2f565b60405180910390fd5b505050565b612064612a4b565b600082905080612072611a8d565b116122b0576001548110156122af576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122ad57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121915780925050506122e2565b5b6001156122ac57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122a75780925050506122e2565b612192565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f46119d3565b8786866040518563ffffffff1660e01b81526004016124169493929190613ca4565b6020604051808303816000875af192505050801561245257506040513d601f19601f8201168201806040525081019061244f9190613d05565b60015b6124cb573d8060008114612482576040519150601f19603f3d011682016040523d82523d6000602084013e612487565b606091505b5060008151036124c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612565576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612679565b600082905060005b6000821461259757808061258090613d32565b915050600a826125909190613da9565b915061256d565b60008167ffffffffffffffff8111156125b3576125b2612dca565b5b6040519080825280601f01601f1916602001820160405280156125e55781602001600182028036833780820191505090505b5090505b60008514612672576001826125fe919061380d565b9150600a8561260d9190613dda565b60306126199190613309565b60f81b81838151811061262f5761262e613e0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561266b9190613da9565b94506125e9565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612731576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273e600085838661267e565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506128ff8673ffffffffffffffffffffffffffffffffffffffff166123ab565b156129c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461297460008784806001019550876123ce565b6129aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129055782600154146129bf57600080fd5b612a2f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129c5575b816001819055505050612a456000858386612684565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ad781612aa2565b8114612ae257600080fd5b50565b600081359050612af481612ace565b92915050565b600060208284031215612b1057612b0f612a98565b5b6000612b1e84828501612ae5565b91505092915050565b60008115159050919050565b612b3c81612b27565b82525050565b6000602082019050612b576000830184612b33565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b97578082015181840152602081019050612b7c565b83811115612ba6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bc882612b5d565b612bd28185612b68565b9350612be2818560208601612b79565b612beb81612bac565b840191505092915050565b60006020820190508181036000830152612c108184612bbd565b905092915050565b6000819050919050565b612c2b81612c18565b8114612c3657600080fd5b50565b600081359050612c4881612c22565b92915050565b600060208284031215612c6457612c63612a98565b5b6000612c7284828501612c39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ca682612c7b565b9050919050565b612cb681612c9b565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b612ce081612c9b565b8114612ceb57600080fd5b50565b600081359050612cfd81612cd7565b92915050565b60008060408385031215612d1a57612d19612a98565b5b6000612d2885828601612cee565b9250506020612d3985828601612c39565b9150509250929050565b612d4c81612c18565b82525050565b6000602082019050612d676000830184612d43565b92915050565b600080600060608486031215612d8657612d85612a98565b5b6000612d9486828701612cee565b9350506020612da586828701612cee565b9250506040612db686828701612c39565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e0282612bac565b810181811067ffffffffffffffff82111715612e2157612e20612dca565b5b80604052505050565b6000612e34612a8e565b9050612e408282612df9565b919050565b600067ffffffffffffffff821115612e6057612e5f612dca565b5b612e6982612bac565b9050602081019050919050565b82818337600083830152505050565b6000612e98612e9384612e45565b612e2a565b905082815260208101848484011115612eb457612eb3612dc5565b5b612ebf848285612e76565b509392505050565b600082601f830112612edc57612edb612dc0565b5b8135612eec848260208601612e85565b91505092915050565b600060208284031215612f0b57612f0a612a98565b5b600082013567ffffffffffffffff811115612f2957612f28612a9d565b5b612f3584828501612ec7565b91505092915050565b600060208284031215612f5457612f53612a98565b5b6000612f6284828501612cee565b91505092915050565b6000612f7682612c7b565b9050919050565b612f8681612f6b565b82525050565b6000602082019050612fa16000830184612f7d565b92915050565b612fb081612b27565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b60008060408385031215612fea57612fe9612a98565b5b6000612ff885828601612cee565b925050602061300985828601612fbe565b9150509250929050565b600067ffffffffffffffff82111561302e5761302d612dca565b5b61303782612bac565b9050602081019050919050565b600061305761305284613013565b612e2a565b90508281526020810184848401111561307357613072612dc5565b5b61307e848285612e76565b509392505050565b600082601f83011261309b5761309a612dc0565b5b81356130ab848260208601613044565b91505092915050565b600080600080608085870312156130ce576130cd612a98565b5b60006130dc87828801612cee565b94505060206130ed87828801612cee565b93505060406130fe87828801612c39565b925050606085013567ffffffffffffffff81111561311f5761311e612a9d565b5b61312b87828801613086565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61315881613137565b811461316357600080fd5b50565b6000813590506131758161314f565b92915050565b60008060006060848603121561319457613193612a98565b5b60006131a286828701613166565b93505060206131b386828701613166565b92505060406131c486828701612c39565b9150509250925092565b600080604083850312156131e5576131e4612a98565b5b60006131f385828601612cee565b925050602061320485828601612cee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325557607f821691505b6020821081036132685761326761320e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132a4602083612b68565b91506132af8261326e565b602082019050919050565b600060208201905081810360008301526132d381613297565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061331482612c18565b915061331f83612c18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613354576133536132da565b5b828201905092915050565b7f476f626c696e3a20446576206d696e7465642100000000000000000000000000600082015250565b6000613395601383612b68565b91506133a08261335f565b602082019050919050565b600060208201905081810360008301526133c481613388565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261342d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133f0565b61343786836133f0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061347461346f61346a84612c18565b61344f565b612c18565b9050919050565b6000819050919050565b61348e83613459565b6134a261349a8261347b565b8484546133fd565b825550505050565b600090565b6134b76134aa565b6134c2818484613485565b505050565b5b818110156134e6576134db6000826134af565b6001810190506134c8565b5050565b601f82111561352b576134fc816133cb565b613505846133e0565b81016020851015613514578190505b613528613520856133e0565b8301826134c7565b50505b505050565b600082821c905092915050565b600061354e60001984600802613530565b1980831691505092915050565b6000613567838361353d565b9150826002028217905092915050565b61358082612b5d565b67ffffffffffffffff81111561359957613598612dca565b5b6135a3825461323d565b6135ae8282856134ea565b600060209050601f8311600181146135e157600084156135cf578287015190505b6135d9858261355b565b865550613641565b601f1984166135ef866133cb565b60005b82811015613617578489015182556001820191506020850194506020810190506135f2565b868310156136345784890151613630601f89168261353d565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061367f601f83612b68565b915061368a82613649565b602082019050919050565b600060208201905081810360008301526136ae81613672565b9050919050565b7f476f626c696e3a20657863656564732074686520746f74616c20616d6f756e7460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613711602183612b68565b915061371c826136b5565b604082019050919050565b6000602082019050818103600083015261374081613704565b9050919050565b7f476f626c696e3a20596f75206861766520616c7265616479206d696e7465642e600082015250565b600061377d602083612b68565b915061378882613747565b602082019050919050565b600060208201905081810360008301526137ac81613770565b9050919050565b60006137be82612c18565b91506137c983612c18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613802576138016132da565b5b828202905092915050565b600061381882612c18565b915061382383612c18565b925082821015613836576138356132da565b5b828203905092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000613877601383612b68565b915061388282613841565b602082019050919050565b600060208201905081810360008301526138a68161386a565b9050919050565b7f476f626c696e3a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b6000613909602783612b68565b9150613914826138ad565b604082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b600081905092915050565b600081546139578161323d565b613961818661393f565b9450600182166000811461397c5760018114613991576139c4565b60ff19831686528115158202860193506139c4565b61399a856133cb565b60005b838110156139bc5781548189015260018201915060208101905061399d565b838801955050505b50505092915050565b60006139d882612b5d565b6139e2818561393f565b93506139f2818560208601612b79565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a3460058361393f565b9150613a3f826139fe565b600582019050919050565b6000613a56828561394a565b9150613a6282846139cd565b9150613a6d82613a27565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ad5602683612b68565b9150613ae082613a79565b604082019050919050565b60006020820190508181036000830152613b0481613ac8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613b41601d83612b68565b9150613b4c82613b0b565b602082019050919050565b60006020820190508181036000830152613b7081613b34565b9050919050565b600081905092915050565b50565b6000613b92600083613b77565b9150613b9d82613b82565b600082019050919050565b6000613bb382613b85565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613c19603a83612b68565b9150613c2482613bbd565b604082019050919050565b60006020820190508181036000830152613c4881613c0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c7682613c4f565b613c808185613c5a565b9350613c90818560208601612b79565b613c9981612bac565b840191505092915050565b6000608082019050613cb96000830187612cad565b613cc66020830186612cad565b613cd36040830185612d43565b8181036060830152613ce58184613c6b565b905095945050505050565b600081519050613cff81612ace565b92915050565b600060208284031215613d1b57613d1a612a98565b5b6000613d2984828501613cf0565b91505092915050565b6000613d3d82612c18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d6f57613d6e6132da565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613db482612c18565b9150613dbf83612c18565b925082613dcf57613dce613d7a565b5b828204905092915050565b6000613de582612c18565b9150613df083612c18565b925082613e0057613dff613d7a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220855fc176ee078877df0b89ea77c26b7df43d5ebbb21bc10d6b7fa75f57c43c4164736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000d52756e6e696e67476f626c696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d52756e6e696e67476f626c696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f7777772e72756e6e696e67676f626c696e2e78797a2f6e66742f6a736f6e2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): RunningGoblin
Arg [1] : symbol (string): RunningGoblin
Arg [2] : _shareholderAddress (address): 0x8878Bebb31658Cc0676B9E0D9506A96B5f55d6Fb
Arg [3] : _devAddress (address): 0x8878Bebb31658Cc0676B9E0D9506A96B5f55d6Fb
Arg [4] : _baseURI (string): https://www.runninggoblin.xyz/nft/json/

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb
Arg [3] : 0000000000000000000000008878bebb31658cc0676b9e0d9506a96b5f55d6fb
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 52756e6e696e67476f626c696e00000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [8] : 52756e6e696e67476f626c696e00000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [10] : 68747470733a2f2f7777772e72756e6e696e67676f626c696e2e78797a2f6e66
Arg [11] : 742f6a736f6e2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57230:3273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35815:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38930:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40434:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39996:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35055:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41299:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58362:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57751:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59929:152;;;;;;;;;;;;;:::i;:::-;;41540:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59708:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57372:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38738:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36184:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56342:103;;;;;;;;;;;;;:::i;:::-;;57593:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57555:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55691:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57793:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39099:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57663:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:866;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40710:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57626:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57520:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41796:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60089:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59512:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57717:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57421:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41068:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56600:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57469:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35815:305;35917:4;35969:25;35954:40;;;:11;:40;;;;:105;;;;36026:33;36011:48;;;:11;:48;;;;35954:105;:158;;;;36076:36;36100:11;36076:23;:36::i;:::-;35954:158;35934:178;;35815:305;;;:::o;38930:100::-;38984:13;39017:5;39010:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38930:100;:::o;40434:204::-;40502:7;40527:16;40535:7;40527;:16::i;:::-;40522:64;;40552:34;;;;;;;;;;;;;;40522:64;40606:15;:24;40622:7;40606:24;;;;;;;;;;;;;;;;;;;;;40599:31;;40434:204;;;:::o;39996:372::-;40069:13;40085:24;40101:7;40085:15;:24::i;:::-;40069:40;;40130:5;40124:11;;:2;:11;;;40120:48;;40144:24;;;;;;;;;;;;;;40120:48;40201:5;40185:21;;:12;:10;:12::i;:::-;:21;;;40181:139;;40212:37;40229:5;40236:12;:10;:12::i;:::-;40212:16;:37::i;:::-;40208:112;;40273:35;;;;;;;;;;;;;;40208:112;40181:139;40332:28;40341:2;40345:7;40354:5;40332:8;:28::i;:::-;40058:310;39996:372;;:::o;35055:312::-;35108:7;35333:15;:13;:15::i;:::-;35318:12;;35302:13;;:28;:46;35295:53;;35055:312;:::o;41299:170::-;41433:28;41443:4;41449:2;41453:7;41433:9;:28::i;:::-;41299:170;;;:::o;58362:268::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58473:13:::1;58461:7;58449:9;;:19;;;;:::i;:::-;58448:38;;58426:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;58568:7;58556:9;;:19;;;;:::i;:::-;58544:9;:31;;;;58586:36;58596:10;58608:13;58586:9;:36::i;:::-;58362:268:::0;:::o;57751:35::-;;;:::o;59929:152::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59977:15:::1;59995:21;59977:39;;60027:46;60045:18;60065:7;60027:17;:46::i;:::-;59966:115;59929:152::o:0;41540:185::-;41678:39;41695:4;41701:2;41705:7;41678:39;;;;;;;;;;;;:16;:39::i;:::-;41540:185;;;:::o;59708:104::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59797:7:::1;59781:13;:23;;;;;;:::i;:::-;;59708:104:::0;:::o;57372:42::-;;;;;;;;;;;;;;;;;:::o;38738:125::-;38802:7;38829:21;38842:7;38829:12;:21::i;:::-;:26;;;38822:33;;38738:125;;;:::o;36184:206::-;36248:7;36289:1;36272:19;;:5;:19;;;36268:60;;36300:28;;;;;;;;;;;;;;36268:60;36354:12;:19;36367:5;36354:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;36346:36;;36339:43;;36184:206;;;:::o;56342:103::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56407:30:::1;56434:1;56407:18;:30::i;:::-;56342:103::o:0;57593:26::-;;;;:::o;57555:31::-;;;;:::o;55691:87::-;55737:7;55764:6;;;;;;;;;;;55757:13;;55691:87;:::o;57793:51::-;;;:::o;39099:104::-;39155:13;39188:7;39181:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39099:104;:::o;57663:39::-;;;;:::o;58638:866::-;58708:4;24085:1;24683:7;;:19;24675:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24085:1;24816:7;:18;;;;58761:9:::1;58749:7;58734:12;;:22;;;;:::i;:::-;58733:37;;58725:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58862:7;;58850;58828;:19;58836:10;58828:19;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;58827:42;;58819:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;58917:14;58984:11;;58973:7;58951;:19;58959:10;58951:19;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;58950:45;58946:279;;;59039:11;;59016:7;:19;59024:10;59016:19;;;;;;;;;;;;;;;;:34;59012:202;;59090:5;;59080:7;:15;;;;:::i;:::-;59071:24;;59012:202;;;59193:5;;59178:11;;59168:7;59146;:19;59154:10;59146:19;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:43;;;;:::i;:::-;59145:53;;;;:::i;:::-;59136:62;;59012:202;58946:279;59270:6;59257:9;:19;;59235:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;59378:7;59356;:19;59364:10;59356:19;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;59334:7;:19;59342:10;59334:19;;;;;;;;;;;;;;;:51;;;;59426:7;59411:12;;:22;;;;:::i;:::-;59396:12;:37;;;;59444:30;59454:10;59466:7;59444:9;:30::i;:::-;59492:4;59485:11;;;24041:1:::0;24995:7;:22;;;;58638:866;;;:::o;40710:287::-;40821:12;:10;:12::i;:::-;40809:24;;:8;:24;;;40805:54;;40842:17;;;;;;;;;;;;;;40805:54;40917:8;40872:18;:32;40891:12;:10;:12::i;:::-;40872:32;;;;;;;;;;;;;;;:42;40905:8;40872:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40970:8;40941:48;;40956:12;:10;:12::i;:::-;40941:48;;;40980:8;40941:48;;;;;;:::i;:::-;;;;;;;;40710:287;;:::o;57626:30::-;;;;:::o;57520:28::-;;;;:::o;41796:370::-;41963:28;41973:4;41979:2;41983:7;41963:9;:28::i;:::-;42006:15;:2;:13;;;:15::i;:::-;42002:157;;;42027:56;42058:4;42064:2;42068:7;42077:5;42027:30;:56::i;:::-;42023:136;;42107:40;;;;;;;;;;;;;;42023:136;42002:157;41796:370;;;;:::o;60089:411::-;60183:13;60236:16;60244:7;60236;:16::i;:::-;60214:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;60393:13;60425:25;60442:7;60425:16;:25::i;:::-;60358:133;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60330:162;;60089:411;;;:::o;59512:188::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59622:8:::1;59612:18;;:7;:18;;;;59655:12;59641:26;;:11;:26;;;;59686:6;59678:5;:14;;;;59512:188:::0;;;:::o;57717:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57421:41::-;;;:::o;41068:164::-;41165:4;41189:18;:25;41208:5;41189:25;;;;;;;;;;;;;;;:35;41215:8;41189:35;;;;;;;;;;;;;;;;;;;;;;;;;41182:42;;41068:164;;;;:::o;56600:201::-;55922:12;:10;:12::i;:::-;55911:23;;:7;:5;:7::i;:::-;:23;;;55903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56709:1:::1;56689:22;;:8;:22;;::::0;56681:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56765:28;56784:8;56765:18;:28::i;:::-;56600:201:::0;:::o;57469:44::-;;;:::o;13463:157::-;13548:4;13587:25;13572:40;;;:11;:40;;;;13565:47;;13463:157;;;:::o;42421:174::-;42478:4;42521:7;42502:15;:13;:15::i;:::-;:26;;:53;;;;;42542:13;;42532:7;:23;42502:53;:85;;;;;42560:11;:20;42572:7;42560:20;;;;;;;;;;;:27;;;;;;;;;;;;42559:28;42502:85;42495:92;;42421:174;;;:::o;32752:98::-;32805:7;32832:10;32825:17;;32752:98;:::o;51643:196::-;51785:2;51758:15;:24;51774:7;51758:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51823:7;51819:2;51803:28;;51812:5;51803:28;;;;;;;;;;;;51643:196;;;:::o;59820:101::-;59885:7;59912:1;59905:8;;59820:101;:::o;46591:2130::-;46706:35;46744:21;46757:7;46744:12;:21::i;:::-;46706:59;;46804:4;46782:26;;:13;:18;;;:26;;;46778:67;;46817:28;;;;;;;;;;;;;;46778:67;46858:22;46900:4;46884:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;46921:36;46938:4;46944:12;:10;:12::i;:::-;46921:16;:36::i;:::-;46884:73;:126;;;;46998:12;:10;:12::i;:::-;46974:36;;:20;46986:7;46974:11;:20::i;:::-;:36;;;46884:126;46858:153;;47029:17;47024:66;;47055:35;;;;;;;;;;;;;;47024:66;47119:1;47105:16;;:2;:16;;;47101:52;;47130:23;;;;;;;;;;;;;;47101:52;47166:43;47188:4;47194:2;47198:7;47207:1;47166:21;:43::i;:::-;47274:35;47291:1;47295:7;47304:4;47274:8;:35::i;:::-;47635:1;47605:12;:18;47618:4;47605:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47679:1;47651:12;:16;47664:2;47651:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47697:31;47731:11;:20;47743:7;47731:20;;;;;;;;;;;47697:54;;47782:2;47766:8;:13;;;:18;;;;;;;;;;;;;;;;;;47832:15;47799:8;:23;;;:49;;;;;;;;;;;;;;;;;;48100:19;48132:1;48122:7;:11;48100:33;;48148:31;48182:11;:24;48194:11;48182:24;;;;;;;;;;;48148:58;;48250:1;48225:27;;:8;:13;;;;;;;;;;;;:27;;;48221:384;;48435:13;;48420:11;:28;48416:174;;48489:4;48473:8;:13;;;:20;;;;;;;;;;;;;;;;;;48542:13;:28;;;48516:8;:23;;;:54;;;;;;;;;;;;;;;;;;48416:174;48221:384;47580:1036;;;48652:7;48648:2;48633:27;;48642:4;48633:27;;;;;;;;;;;;48671:42;48692:4;48698:2;48702:7;48711:1;48671:20;:42::i;:::-;46695:2026;;46591:2130;;;:::o;42679:104::-;42748:27;42758:2;42762:8;42748:27;;;;;;;;;;;;:9;:27::i;:::-;42679:104;;:::o;4618:317::-;4733:6;4708:21;:31;;4700:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4787:12;4805:9;:14;;4827:6;4805:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4786:52;;;4857:7;4849:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;4689:246;4618:317;;:::o;37565:1111::-;37627:21;;:::i;:::-;37661:12;37676:7;37661:22;;37744:4;37725:15;:13;:15::i;:::-;:23;37721:888;;37761:13;;37754:4;:20;37750:859;;;37795:31;37829:11;:17;37841:4;37829:17;;;;;;;;;;;37795:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37870:9;:16;;;37865:729;;37941:1;37915:28;;:9;:14;;;:28;;;37911:101;;37979:9;37972:16;;;;;;37911:101;38314:261;38321:4;38314:261;;;38354:6;;;;;;;;38399:11;:17;38411:4;38399:17;;;;;;;;;;;38387:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38473:1;38447:28;;:9;:14;;;:28;;;38443:109;;38515:9;38508:16;;;;;;38443:109;38314:261;;;37865:729;37776:833;37750:859;37721:888;38637:31;;;;;;;;;;;;;;37565:1111;;;;:::o;56961:191::-;57035:16;57054:6;;;;;;;;;;;57035:25;;57080:8;57071:6;;:17;;;;;;;;;;;;;;;;;;57135:8;57104:40;;57125:8;57104:40;;;;;;;;;;;;57024:128;56961:191;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;52331:667::-;52494:4;52531:2;52515:36;;;52552:12;:10;:12::i;:::-;52566:4;52572:7;52581:5;52515:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52511:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52766:1;52749:6;:13;:18;52745:235;;52795:40;;;;;;;;;;;;;;52745:235;52938:6;52932:13;52923:6;52919:2;52915:15;52908:38;52511:480;52644:45;;;52634:55;;;:6;:55;;;;52627:62;;;52331:667;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;53646:159::-;;;;;:::o;54464:158::-;;;;;:::o;43156:1749::-;43279:20;43302:13;;43279:36;;43344:1;43330:16;;:2;:16;;;43326:48;;43355:19;;;;;;;;;;;;;;43326:48;43401:1;43389:8;:13;43385:44;;43411:18;;;;;;;;;;;;;;43385:44;43442:61;43472:1;43476:2;43480:12;43494:8;43442:21;:61::i;:::-;43815:8;43780:12;:16;43793:2;43780:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43879:8;43839:12;:16;43852:2;43839:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43938:2;43905:11;:25;43917:12;43905:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44005:15;43955:11;:25;43967:12;43955:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44038:20;44061:12;44038:35;;44088:11;44117:8;44102:12;:23;44088:37;;44146:15;:2;:13;;;:15::i;:::-;44142:631;;;44182:313;44238:12;44234:2;44213:38;;44230:1;44213:38;;;;;;;;;;;;44279:69;44318:1;44322:2;44326:14;;;;;;44342:5;44279:30;:69::i;:::-;44274:174;;44384:40;;;;;;;;;;;;;;44274:174;44490:3;44475:12;:18;44182:313;;44576:12;44559:13;;:29;44555:43;;44590:8;;;44555:43;44142:631;;;44639:119;44695:14;;;;;;44691:2;44670:40;;44687:1;44670:40;;;;;;;;;;;;44753:3;44738:12;:18;44639:119;;44142:631;44803:12;44787:13;:28;;;;43755:1072;;44837:60;44866:1;44870:2;44874:12;44888:8;44837:20;:60::i;:::-;43268:1637;43156:1749;;;:::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:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:104::-;8916:7;8945:24;8963:5;8945:24;:::i;:::-;8934:35;;8871:104;;;:::o;8981:142::-;9084:32;9110:5;9084:32;:::i;:::-;9079:3;9072:45;8981:142;;:::o;9129:254::-;9238:4;9276:2;9265:9;9261:18;9253:26;;9289:87;9373:1;9362:9;9358:17;9349:6;9289:87;:::i;:::-;9129:254;;;;:::o;9389:116::-;9459:21;9474:5;9459:21;:::i;:::-;9452:5;9449:32;9439:60;;9495:1;9492;9485:12;9439:60;9389:116;:::o;9511:133::-;9554:5;9592:6;9579:20;9570:29;;9608:30;9632:5;9608:30;:::i;:::-;9511:133;;;;:::o;9650:468::-;9715:6;9723;9772:2;9760:9;9751:7;9747:23;9743:32;9740:119;;;9778:79;;:::i;:::-;9740:119;9898:1;9923:53;9968:7;9959:6;9948:9;9944:22;9923:53;:::i;:::-;9913:63;;9869:117;10025:2;10051:50;10093:7;10084:6;10073:9;10069:22;10051:50;:::i;:::-;10041:60;;9996:115;9650:468;;;;;:::o;10124:307::-;10185:4;10275:18;10267:6;10264:30;10261:56;;;10297:18;;:::i;:::-;10261:56;10335:29;10357:6;10335:29;:::i;:::-;10327:37;;10419:4;10413;10409:15;10401:23;;10124:307;;;:::o;10437:410::-;10514:5;10539:65;10555:48;10596:6;10555:48;:::i;:::-;10539:65;:::i;:::-;10530:74;;10627:6;10620:5;10613:21;10665:4;10658:5;10654:16;10703:3;10694:6;10689:3;10685:16;10682:25;10679:112;;;10710:79;;:::i;:::-;10679:112;10800:41;10834:6;10829:3;10824;10800:41;:::i;:::-;10520:327;10437:410;;;;;:::o;10866:338::-;10921:5;10970:3;10963:4;10955:6;10951:17;10947:27;10937:122;;10978:79;;:::i;:::-;10937:122;11095:6;11082:20;11120:78;11194:3;11186:6;11179:4;11171:6;11167:17;11120:78;:::i;:::-;11111:87;;10927:277;10866:338;;;;:::o;11210:943::-;11305:6;11313;11321;11329;11378:3;11366:9;11357:7;11353:23;11349:33;11346:120;;;11385:79;;:::i;:::-;11346:120;11505:1;11530:53;11575:7;11566:6;11555:9;11551:22;11530:53;:::i;:::-;11520:63;;11476:117;11632:2;11658:53;11703:7;11694:6;11683:9;11679:22;11658:53;:::i;:::-;11648:63;;11603:118;11760:2;11786:53;11831:7;11822:6;11811:9;11807:22;11786:53;:::i;:::-;11776:63;;11731:118;11916:2;11905:9;11901:18;11888:32;11947:18;11939:6;11936:30;11933:117;;;11969:79;;:::i;:::-;11933:117;12074:62;12128:7;12119:6;12108:9;12104:22;12074:62;:::i;:::-;12064:72;;11859:287;11210:943;;;;;;;:::o;12159:109::-;12195:7;12235:26;12228:5;12224:38;12213:49;;12159:109;;;:::o;12274:120::-;12346:23;12363:5;12346:23;:::i;:::-;12339:5;12336:34;12326:62;;12384:1;12381;12374:12;12326:62;12274:120;:::o;12400:137::-;12445:5;12483:6;12470:20;12461:29;;12499:32;12525:5;12499:32;:::i;:::-;12400:137;;;;:::o;12543:615::-;12618:6;12626;12634;12683:2;12671:9;12662:7;12658:23;12654:32;12651:119;;;12689:79;;:::i;:::-;12651:119;12809:1;12834:52;12878:7;12869:6;12858:9;12854:22;12834:52;:::i;:::-;12824:62;;12780:116;12935:2;12961:52;13005:7;12996:6;12985:9;12981:22;12961:52;:::i;:::-;12951:62;;12906:117;13062:2;13088:53;13133:7;13124:6;13113:9;13109:22;13088:53;:::i;:::-;13078:63;;13033:118;12543:615;;;;;:::o;13164:474::-;13232:6;13240;13289:2;13277:9;13268:7;13264:23;13260:32;13257:119;;;13295:79;;:::i;:::-;13257:119;13415:1;13440:53;13485:7;13476:6;13465:9;13461:22;13440:53;:::i;:::-;13430:63;;13386:117;13542:2;13568:53;13613:7;13604:6;13593:9;13589:22;13568:53;:::i;:::-;13558:63;;13513:118;13164:474;;;;;:::o;13644:180::-;13692:77;13689:1;13682:88;13789:4;13786:1;13779:15;13813:4;13810:1;13803:15;13830:320;13874:6;13911:1;13905:4;13901:12;13891:22;;13958:1;13952:4;13948:12;13979:18;13969:81;;14035:4;14027:6;14023:17;14013:27;;13969:81;14097:2;14089:6;14086:14;14066:18;14063:38;14060:84;;14116:18;;:::i;:::-;14060:84;13881:269;13830:320;;;:::o;14156:182::-;14296:34;14292:1;14284:6;14280:14;14273:58;14156:182;:::o;14344:366::-;14486:3;14507:67;14571:2;14566:3;14507:67;:::i;:::-;14500:74;;14583:93;14672:3;14583:93;:::i;:::-;14701:2;14696:3;14692:12;14685:19;;14344:366;;;:::o;14716:419::-;14882:4;14920:2;14909:9;14905:18;14897:26;;14969:9;14963:4;14959:20;14955:1;14944:9;14940:17;14933:47;14997:131;15123:4;14997:131;:::i;:::-;14989:139;;14716:419;;;:::o;15141:180::-;15189:77;15186:1;15179:88;15286:4;15283:1;15276:15;15310:4;15307:1;15300:15;15327:305;15367:3;15386:20;15404:1;15386:20;:::i;:::-;15381:25;;15420:20;15438:1;15420:20;:::i;:::-;15415:25;;15574:1;15506:66;15502:74;15499:1;15496:81;15493:107;;;15580:18;;:::i;:::-;15493:107;15624:1;15621;15617:9;15610:16;;15327:305;;;;:::o;15638:169::-;15778:21;15774:1;15766:6;15762:14;15755:45;15638:169;:::o;15813:366::-;15955:3;15976:67;16040:2;16035:3;15976:67;:::i;:::-;15969:74;;16052:93;16141:3;16052:93;:::i;:::-;16170:2;16165:3;16161:12;16154:19;;15813:366;;;:::o;16185:419::-;16351:4;16389:2;16378:9;16374:18;16366:26;;16438:9;16432:4;16428:20;16424:1;16413:9;16409:17;16402:47;16466:131;16592:4;16466:131;:::i;:::-;16458:139;;16185:419;;;:::o;16610:141::-;16659:4;16682:3;16674:11;;16705:3;16702:1;16695:14;16739:4;16736:1;16726:18;16718:26;;16610:141;;;:::o;16757:93::-;16794:6;16841:2;16836;16829:5;16825:14;16821:23;16811:33;;16757:93;;;:::o;16856:107::-;16900:8;16950:5;16944:4;16940:16;16919:37;;16856:107;;;;:::o;16969:393::-;17038:6;17088:1;17076:10;17072:18;17111:97;17141:66;17130:9;17111:97;:::i;:::-;17229:39;17259:8;17248:9;17229:39;:::i;:::-;17217:51;;17301:4;17297:9;17290:5;17286:21;17277:30;;17350:4;17340:8;17336:19;17329:5;17326:30;17316:40;;17045:317;;16969:393;;;;;:::o;17368:60::-;17396:3;17417:5;17410:12;;17368:60;;;:::o;17434:142::-;17484:9;17517:53;17535:34;17544:24;17562:5;17544:24;:::i;:::-;17535:34;:::i;:::-;17517:53;:::i;:::-;17504:66;;17434:142;;;:::o;17582:75::-;17625:3;17646:5;17639:12;;17582:75;;;:::o;17663:269::-;17773:39;17804:7;17773:39;:::i;:::-;17834:91;17883:41;17907:16;17883:41;:::i;:::-;17875:6;17868:4;17862:11;17834:91;:::i;:::-;17828:4;17821:105;17739:193;17663:269;;;:::o;17938:73::-;17983:3;17938:73;:::o;18017:189::-;18094:32;;:::i;:::-;18135:65;18193:6;18185;18179:4;18135:65;:::i;:::-;18070:136;18017:189;;:::o;18212:186::-;18272:120;18289:3;18282:5;18279:14;18272:120;;;18343:39;18380:1;18373:5;18343:39;:::i;:::-;18316:1;18309:5;18305:13;18296:22;;18272:120;;;18212:186;;:::o;18404:543::-;18505:2;18500:3;18497:11;18494:446;;;18539:38;18571:5;18539:38;:::i;:::-;18623:29;18641:10;18623:29;:::i;:::-;18613:8;18609:44;18806:2;18794:10;18791:18;18788:49;;;18827:8;18812:23;;18788:49;18850:80;18906:22;18924:3;18906:22;:::i;:::-;18896:8;18892:37;18879:11;18850:80;:::i;:::-;18509:431;;18494:446;18404:543;;;:::o;18953:117::-;19007:8;19057:5;19051:4;19047:16;19026:37;;18953:117;;;;:::o;19076:169::-;19120:6;19153:51;19201:1;19197:6;19189:5;19186:1;19182:13;19153:51;:::i;:::-;19149:56;19234:4;19228;19224:15;19214:25;;19127:118;19076:169;;;;:::o;19250:295::-;19326:4;19472:29;19497:3;19491:4;19472:29;:::i;:::-;19464:37;;19534:3;19531:1;19527:11;19521:4;19518:21;19510:29;;19250:295;;;;:::o;19550:1395::-;19667:37;19700:3;19667:37;:::i;:::-;19769:18;19761:6;19758:30;19755:56;;;19791:18;;:::i;:::-;19755:56;19835:38;19867:4;19861:11;19835:38;:::i;:::-;19920:67;19980:6;19972;19966:4;19920:67;:::i;:::-;20014:1;20038:4;20025:17;;20070:2;20062:6;20059:14;20087:1;20082:618;;;;20744:1;20761:6;20758:77;;;20810:9;20805:3;20801:19;20795:26;20786:35;;20758:77;20861:67;20921:6;20914:5;20861:67;:::i;:::-;20855:4;20848:81;20717:222;20052:887;;20082:618;20134:4;20130:9;20122:6;20118:22;20168:37;20200:4;20168:37;:::i;:::-;20227:1;20241:208;20255:7;20252:1;20249:14;20241:208;;;20334:9;20329:3;20325:19;20319:26;20311:6;20304:42;20385:1;20377:6;20373:14;20363:24;;20432:2;20421:9;20417:18;20404:31;;20278:4;20275:1;20271:12;20266:17;;20241:208;;;20477:6;20468:7;20465:19;20462:179;;;20535:9;20530:3;20526:19;20520:26;20578:48;20620:4;20612:6;20608:17;20597:9;20578:48;:::i;:::-;20570:6;20563:64;20485:156;20462:179;20687:1;20683;20675:6;20671:14;20667:22;20661:4;20654:36;20089:611;;;20052:887;;19642:1303;;;19550:1395;;:::o;20951:181::-;21091:33;21087:1;21079:6;21075:14;21068:57;20951:181;:::o;21138:366::-;21280:3;21301:67;21365:2;21360:3;21301:67;:::i;:::-;21294:74;;21377:93;21466:3;21377:93;:::i;:::-;21495:2;21490:3;21486:12;21479:19;;21138:366;;;:::o;21510:419::-;21676:4;21714:2;21703:9;21699:18;21691:26;;21763:9;21757:4;21753:20;21749:1;21738:9;21734:17;21727:47;21791:131;21917:4;21791:131;:::i;:::-;21783:139;;21510:419;;;:::o;21935:220::-;22075:34;22071:1;22063:6;22059:14;22052:58;22144:3;22139:2;22131:6;22127:15;22120:28;21935:220;:::o;22161:366::-;22303:3;22324:67;22388:2;22383:3;22324:67;:::i;:::-;22317:74;;22400:93;22489:3;22400:93;:::i;:::-;22518:2;22513:3;22509:12;22502:19;;22161:366;;;:::o;22533:419::-;22699:4;22737:2;22726:9;22722:18;22714:26;;22786:9;22780:4;22776:20;22772:1;22761:9;22757:17;22750:47;22814:131;22940:4;22814:131;:::i;:::-;22806:139;;22533:419;;;:::o;22958:182::-;23098:34;23094:1;23086:6;23082:14;23075:58;22958:182;:::o;23146:366::-;23288:3;23309:67;23373:2;23368:3;23309:67;:::i;:::-;23302:74;;23385:93;23474:3;23385:93;:::i;:::-;23503:2;23498:3;23494:12;23487:19;;23146:366;;;:::o;23518:419::-;23684:4;23722:2;23711:9;23707:18;23699:26;;23771:9;23765:4;23761:20;23757:1;23746:9;23742:17;23735:47;23799:131;23925:4;23799:131;:::i;:::-;23791:139;;23518:419;;;:::o;23943:348::-;23983:7;24006:20;24024:1;24006:20;:::i;:::-;24001:25;;24040:20;24058:1;24040:20;:::i;:::-;24035:25;;24228:1;24160:66;24156:74;24153:1;24150:81;24145:1;24138:9;24131:17;24127:105;24124:131;;;24235:18;;:::i;:::-;24124:131;24283:1;24280;24276:9;24265:20;;23943:348;;;;:::o;24297:191::-;24337:4;24357:20;24375:1;24357:20;:::i;:::-;24352:25;;24391:20;24409:1;24391:20;:::i;:::-;24386:25;;24430:1;24427;24424:8;24421:34;;;24435:18;;:::i;:::-;24421:34;24480:1;24477;24473:9;24465:17;;24297:191;;;;:::o;24494:169::-;24634:21;24630:1;24622:6;24618:14;24611:45;24494:169;:::o;24669:366::-;24811:3;24832:67;24896:2;24891:3;24832:67;:::i;:::-;24825:74;;24908:93;24997:3;24908:93;:::i;:::-;25026:2;25021:3;25017:12;25010:19;;24669:366;;;:::o;25041:419::-;25207:4;25245:2;25234:9;25230:18;25222:26;;25294:9;25288:4;25284:20;25280:1;25269:9;25265:17;25258:47;25322:131;25448:4;25322:131;:::i;:::-;25314:139;;25041:419;;;:::o;25466:226::-;25606:34;25602:1;25594:6;25590:14;25583:58;25675:9;25670:2;25662:6;25658:15;25651:34;25466:226;:::o;25698:366::-;25840:3;25861:67;25925:2;25920:3;25861:67;:::i;:::-;25854:74;;25937:93;26026:3;25937:93;:::i;:::-;26055:2;26050:3;26046:12;26039:19;;25698:366;;;:::o;26070:419::-;26236:4;26274:2;26263:9;26259:18;26251:26;;26323:9;26317:4;26313:20;26309:1;26298:9;26294:17;26287:47;26351:131;26477:4;26351:131;:::i;:::-;26343:139;;26070:419;;;:::o;26495:148::-;26597:11;26634:3;26619:18;;26495:148;;;;:::o;26673:874::-;26776:3;26813:5;26807:12;26842:36;26868:9;26842:36;:::i;:::-;26894:89;26976:6;26971:3;26894:89;:::i;:::-;26887:96;;27014:1;27003:9;26999:17;27030:1;27025:166;;;;27205:1;27200:341;;;;26992:549;;27025:166;27109:4;27105:9;27094;27090:25;27085:3;27078:38;27171:6;27164:14;27157:22;27149:6;27145:35;27140:3;27136:45;27129:52;;27025:166;;27200:341;27267:38;27299:5;27267:38;:::i;:::-;27327:1;27341:154;27355:6;27352:1;27349:13;27341:154;;;27429:7;27423:14;27419:1;27414:3;27410:11;27403:35;27479:1;27470:7;27466:15;27455:26;;27377:4;27374:1;27370:12;27365:17;;27341:154;;;27524:6;27519:3;27515:16;27508:23;;27207:334;;26992:549;;26780:767;;26673:874;;;;:::o;27553:377::-;27659:3;27687:39;27720:5;27687:39;:::i;:::-;27742:89;27824:6;27819:3;27742:89;:::i;:::-;27735:96;;27840:52;27885:6;27880:3;27873:4;27866:5;27862:16;27840:52;:::i;:::-;27917:6;27912:3;27908:16;27901:23;;27663:267;27553:377;;;;:::o;27936:155::-;28076:7;28072:1;28064:6;28060:14;28053:31;27936:155;:::o;28097:400::-;28257:3;28278:84;28360:1;28355:3;28278:84;:::i;:::-;28271:91;;28371:93;28460:3;28371:93;:::i;:::-;28489:1;28484:3;28480:11;28473:18;;28097:400;;;:::o;28503:695::-;28781:3;28803:92;28891:3;28882:6;28803:92;:::i;:::-;28796:99;;28912:95;29003:3;28994:6;28912:95;:::i;:::-;28905:102;;29024:148;29168:3;29024:148;:::i;:::-;29017:155;;29189:3;29182:10;;28503:695;;;;;:::o;29204:225::-;29344:34;29340:1;29332:6;29328:14;29321:58;29413:8;29408:2;29400:6;29396:15;29389:33;29204:225;:::o;29435:366::-;29577:3;29598:67;29662:2;29657:3;29598:67;:::i;:::-;29591:74;;29674:93;29763:3;29674:93;:::i;:::-;29792:2;29787:3;29783:12;29776:19;;29435:366;;;:::o;29807:419::-;29973:4;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29807:419;;;:::o;30232:179::-;30372:31;30368:1;30360:6;30356:14;30349:55;30232:179;:::o;30417:366::-;30559:3;30580:67;30644:2;30639:3;30580:67;:::i;:::-;30573:74;;30656:93;30745:3;30656:93;:::i;:::-;30774:2;30769:3;30765:12;30758:19;;30417:366;;;:::o;30789:419::-;30955:4;30993:2;30982:9;30978:18;30970:26;;31042:9;31036:4;31032:20;31028:1;31017:9;31013:17;31006:47;31070:131;31196:4;31070:131;:::i;:::-;31062:139;;30789:419;;;:::o;31214:147::-;31315:11;31352:3;31337:18;;31214:147;;;;:::o;31367:114::-;;:::o;31487:398::-;31646:3;31667:83;31748:1;31743:3;31667:83;:::i;:::-;31660:90;;31759:93;31848:3;31759:93;:::i;:::-;31877:1;31872:3;31868:11;31861:18;;31487:398;;;:::o;31891:379::-;32075:3;32097:147;32240:3;32097:147;:::i;:::-;32090:154;;32261:3;32254:10;;31891:379;;;:::o;32276:245::-;32416:34;32412:1;32404:6;32400:14;32393:58;32485:28;32480:2;32472:6;32468:15;32461:53;32276:245;:::o;32527:366::-;32669:3;32690:67;32754:2;32749:3;32690:67;:::i;:::-;32683:74;;32766:93;32855:3;32766:93;:::i;:::-;32884:2;32879:3;32875:12;32868:19;;32527:366;;;:::o;32899:419::-;33065:4;33103:2;33092:9;33088:18;33080:26;;33152:9;33146:4;33142:20;33138:1;33127:9;33123:17;33116:47;33180:131;33306:4;33180:131;:::i;:::-;33172:139;;32899:419;;;:::o;33324:98::-;33375:6;33409:5;33403:12;33393:22;;33324:98;;;:::o;33428:168::-;33511:11;33545:6;33540:3;33533:19;33585:4;33580:3;33576:14;33561:29;;33428:168;;;;:::o;33602:360::-;33688:3;33716:38;33748:5;33716:38;:::i;:::-;33770:70;33833:6;33828:3;33770:70;:::i;:::-;33763:77;;33849:52;33894:6;33889:3;33882:4;33875:5;33871:16;33849:52;:::i;:::-;33926:29;33948:6;33926:29;:::i;:::-;33921:3;33917:39;33910:46;;33692:270;33602:360;;;;:::o;33968:640::-;34163:4;34201:3;34190:9;34186:19;34178:27;;34215:71;34283:1;34272:9;34268:17;34259:6;34215:71;:::i;:::-;34296:72;34364:2;34353:9;34349:18;34340:6;34296:72;:::i;:::-;34378;34446:2;34435:9;34431:18;34422:6;34378:72;:::i;:::-;34497:9;34491:4;34487:20;34482:2;34471:9;34467:18;34460:48;34525:76;34596:4;34587:6;34525:76;:::i;:::-;34517:84;;33968:640;;;;;;;:::o;34614:141::-;34670:5;34701:6;34695:13;34686:22;;34717:32;34743:5;34717:32;:::i;:::-;34614:141;;;;:::o;34761:349::-;34830:6;34879:2;34867:9;34858:7;34854:23;34850:32;34847:119;;;34885:79;;:::i;:::-;34847:119;35005:1;35030:63;35085:7;35076:6;35065:9;35061:22;35030:63;:::i;:::-;35020:73;;34976:127;34761:349;;;;:::o;35116:233::-;35155:3;35178:24;35196:5;35178:24;:::i;:::-;35169:33;;35224:66;35217:5;35214:77;35211:103;;35294:18;;:::i;:::-;35211:103;35341:1;35334:5;35330:13;35323:20;;35116:233;;;:::o;35355:180::-;35403:77;35400:1;35393:88;35500:4;35497:1;35490:15;35524:4;35521:1;35514:15;35541:185;35581:1;35598:20;35616:1;35598:20;:::i;:::-;35593:25;;35632:20;35650:1;35632:20;:::i;:::-;35627:25;;35671:1;35661:35;;35676:18;;:::i;:::-;35661:35;35718:1;35715;35711:9;35706:14;;35541:185;;;;:::o;35732:176::-;35764:1;35781:20;35799:1;35781:20;:::i;:::-;35776:25;;35815:20;35833:1;35815:20;:::i;:::-;35810:25;;35854:1;35844:35;;35859:18;;:::i;:::-;35844:35;35900:1;35897;35893:9;35888:14;;35732:176;;;;:::o;35914:180::-;35962:77;35959:1;35952:88;36059:4;36056:1;36049:15;36083:4;36080:1;36073:15

Swarm Source

ipfs://855fc176ee078877df0b89ea77c26b7df43d5ebbb21bc10d6b7fa75f57c43c41
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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