ETH Price: $3,810.21 (+4.97%)

Token

IllumHelix (ILHX)
 

Overview

Max Total Supply

8,132 ILHX

Holders

3,685

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nft-pizza.eth
0x7667f9bf30460286f3af0c2f333e1a1aceb8fd44
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:
IllumHelix

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-19
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }
    
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

pragma solidity ^0.8.7;

contract IllumHelix is ERC1155, Ownable, DefaultOperatorFilterer {    

    string public metadata;
    string public name_;
    string public symbol_;  
    
    constructor() ERC1155(metadata)  {
        name_ = "IllumHelix";
        symbol_ = "ILHX";
    }
    
    function airdrop(uint256[] calldata tokenAmount, address[] calldata wallet, uint256 tokenId) public onlyOwner {
        for(uint256 i = 0; i < wallet.length; i++) 
            _mint(wallet[i], tokenId, tokenAmount[i], "");
    }

    function setMetadata(string calldata _uri) public onlyOwner {
        metadata = _uri;
    }

    function uri(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(metadata, Strings.toString(tokenId)));
    }

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenAmount","type":"uint256[]"},{"internalType":"address[]","name":"wallet","type":"address[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"_uri","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb66001600480546200003890620002e6565b80601f01602080910402602001604051908101604052809291908181526020018280546200006690620002e6565b8015620000b75780601f106200008b57610100808354040283529160200191620000b7565b820191906000526020600020905b8154815290600101906020018083116200009957829003601f168201915b5050505050620000cd816200028260201b60201c565b50620000d93362000294565b6daaeb6d7670e522a718067333cd4e3b156200021e5780156200016c57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200014d57600080fd5b505af115801562000162573d6000803e3d6000fd5b505050506200021e565b6001600160a01b03821615620001bd5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000132565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200020457600080fd5b505af115801562000219573d6000803e3d6000fd5b505050505b505060408051808201909152600a815269092d8d8eada90cad8d2f60b31b60208201526005906200025090826200038b565b506040805180820190915260048152630929890b60e31b60208201526006906200027b90826200038b565b5062000457565b60026200029082826200038b565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600181811c90821680620002fb57607f821691505b6020821081036200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f8211156200038657600081815260208120601f850160051c81016020861015620003615750805b601f850160051c820191505b8181101562000382578281556001016200036d565b5050505b505050565b81516001600160401b03811115620003a757620003a762000322565b620003bf81620003b88454620002e6565b8462000338565b602080601f831160018114620003f75760008415620003de5750858301515b600019600386901b1c1916600185901b17855562000382565b600085815260208120601f198616915b82811015620004285788860151825594840194600190910190840162000407565b5085821015620004475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611df280620004676000396000f3fe608060405234801561001057600080fd5b50600436106101205760003560e01c80638da5cb5b116100ad578063da0890a811610071578063da0890a81461024f578063e2b9e18614610262578063e985e9c51461026a578063f242432a146102a6578063f2fde38b146102b957600080fd5b80638da5cb5b1461020857806395d89b4114610219578063a22cb46514610221578063a49a1e7d14610234578063af17dea61461024757600080fd5b80632eb2c2d6116100f45780632eb2c2d614610196578063392f37e9146101ab57806341f43434146101b35780634e1273f4146101e0578063715018a61461020057600080fd5b8062fdd58e1461012557806301ffc9a71461014b57806306fdde031461016e5780630e89341c14610183575b600080fd5b610138610133366004611267565b6102cc565b6040519081526020015b60405180910390f35b61015e6101593660046112a7565b610365565b6040519015158152602001610142565b6101766103b5565b604051610142919061131b565b61017661019136600461132e565b610447565b6101a96101a4366004611490565b61047b565b005b6101766104aa565b6101c86daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610142565b6101f36101ee366004611539565b610538565b604051610142919061163e565b6101a9610661565b6003546001600160a01b03166101c8565b610176610675565b6101a961022f36600461165f565b610684565b6101a9610242366004611696565b61069d565b6101766106b2565b6101a961025d366004611752565b6106bf565b61017661073d565b61015e6102783660046117c5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a96102b43660046117f8565b61074a565b6101a96102c736600461185c565b610771565b60006001600160a01b03831661033c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061039657506001600160e01b031982166303a24d0760e21b145b8061035f57506301ffc9a760e01b6001600160e01b031983161461035f565b6060600580546103c490611877565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611877565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60606004610454836107ea565b6040516020016104659291906118b1565b6040516020818303038152906040529050919050565b846001600160a01b038116331461049557610495336108f2565b6104a286868686866109ab565b505050505050565b600480546104b790611877565b80601f01602080910402602001604051908101604052809291908181526020018280546104e390611877565b80156105305780601f1061050557610100808354040283529160200191610530565b820191906000526020600020905b81548152906001019060200180831161051357829003601f168201915b505050505081565b6060815183511461059d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610333565b600083516001600160401b038111156105b8576105b8611347565b6040519080825280602002602001820160405280156105e1578160200160208202803683370190505b50905060005b84518110156106595761062c85828151811061060557610605611938565b602002602001015185838151811061061f5761061f611938565b60200260200101516102cc565b82828151811061063e5761063e611938565b602090810291909101015261065281611964565b90506105e7565b509392505050565b6106696109f7565b6106736000610a51565b565b6060600680546103c490611877565b8161068e816108f2565b6106988383610aa3565b505050565b6106a56109f7565b60046106988284836119c3565b600680546104b790611877565b6106c76109f7565b60005b828110156104a25761072b8484838181106106e7576106e7611938565b90506020020160208101906106fc919061185c565b8388888581811061070f5761070f611938565b9050602002013560405180602001604052806000815250610ab2565b8061073581611964565b9150506106ca565b600580546104b790611877565b846001600160a01b038116331461076457610764336108f2565b6104a28686868686610bc6565b6107796109f7565b6001600160a01b0381166107de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610333565b6107e781610a51565b50565b6060816000036108115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561083b578061082581611964565b91506108349050600a83611a98565b9150610815565b6000816001600160401b0381111561085557610855611347565b6040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b5090505b84156108ea57610894600183611aac565b91506108a1600a86611abf565b6108ac906030611ad3565b60f81b8183815181106108c1576108c1611938565b60200101906001600160f81b031916908160001a9053506108e3600a86611a98565b9450610883565b949350505050565b6daaeb6d7670e522a718067333cd4e3b156107e757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190611ae6565b6107e757604051633b79c77360e21b81526001600160a01b0382166004820152602401610333565b6001600160a01b0385163314806109c757506109c78533610278565b6109e35760405162461bcd60e51b815260040161033390611b03565b6109f08585858585610c0b565b5050505050565b6003546001600160a01b031633146106735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610333565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610aae338383610de0565b5050565b6001600160a01b038416610b125760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610333565b336000610b1e85610ec0565b90506000610b2b85610ec0565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610b5d908490611ad3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610bbd83600089898989610f0b565b50505050505050565b6001600160a01b038516331480610be25750610be28533610278565b610bfe5760405162461bcd60e51b815260040161033390611b03565b6109f08585858585611066565b8151835114610c6d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610333565b6001600160a01b038416610c935760405162461bcd60e51b815260040161033390611b52565b3360005b8451811015610d7a576000858281518110610cb457610cb4611938565b602002602001015190506000858381518110610cd257610cd2611938565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d225760405162461bcd60e51b815260040161033390611b97565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d5f908490611ad3565b9250508190555050505080610d7390611964565b9050610c97565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610dca929190611be1565b60405180910390a46104a2818787878787611190565b816001600160a01b0316836001600160a01b031603610e535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610333565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610efa57610efa611938565b602090810291909101015292915050565b6001600160a01b0384163b156104a25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610f4f9089908990889088908890600401611c0f565b6020604051808303816000875af1925050508015610f8a575060408051601f3d908101601f19168201909252610f8791810190611c54565b60015b61103657610f96611c71565b806308c379a003610fcf5750610faa611c8d565b80610fb55750610fd1565b8060405162461bcd60e51b8152600401610333919061131b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610333565b6001600160e01b0319811663f23a6e6160e01b14610bbd5760405162461bcd60e51b815260040161033390611d16565b6001600160a01b03841661108c5760405162461bcd60e51b815260040161033390611b52565b33600061109885610ec0565b905060006110a585610ec0565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156110e85760405162461bcd60e51b815260040161033390611b97565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611125908490611ad3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611185848a8a8a8a8a610f0b565b505050505050505050565b6001600160a01b0384163b156104a25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906111d49089908990889088908890600401611d5e565b6020604051808303816000875af192505050801561120f575060408051601f3d908101601f1916820190925261120c91810190611c54565b60015b61121b57610f96611c71565b6001600160e01b0319811663bc197c8160e01b14610bbd5760405162461bcd60e51b815260040161033390611d16565b80356001600160a01b038116811461126257600080fd5b919050565b6000806040838503121561127a57600080fd5b6112838361124b565b946020939093013593505050565b6001600160e01b0319811681146107e757600080fd5b6000602082840312156112b957600080fd5b81356112c481611291565b9392505050565b60005b838110156112e65781810151838201526020016112ce565b50506000910152565b600081518084526113078160208601602086016112cb565b601f01601f19169290920160200192915050565b6020815260006112c460208301846112ef565b60006020828403121561134057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561138257611382611347565b6040525050565b60006001600160401b038211156113a2576113a2611347565b5060051b60200190565b600082601f8301126113bd57600080fd5b813560206113ca82611389565b6040516113d7828261135d565b83815260059390931b85018201928281019150868411156113f757600080fd5b8286015b8481101561141257803583529183019183016113fb565b509695505050505050565b600082601f83011261142e57600080fd5b81356001600160401b0381111561144757611447611347565b60405161145e601f8301601f19166020018261135d565b81815284602083860101111561147357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114a857600080fd5b6114b18661124b565b94506114bf6020870161124b565b935060408601356001600160401b03808211156114db57600080fd5b6114e789838a016113ac565b945060608801359150808211156114fd57600080fd5b61150989838a016113ac565b9350608088013591508082111561151f57600080fd5b5061152c8882890161141d565b9150509295509295909350565b6000806040838503121561154c57600080fd5b82356001600160401b038082111561156357600080fd5b818501915085601f83011261157757600080fd5b8135602061158482611389565b604051611591828261135d565b83815260059390931b85018201928281019150898411156115b157600080fd5b948201945b838610156115d6576115c78661124b565b825294820194908201906115b6565b965050860135925050808211156115ec57600080fd5b506115f9858286016113ac565b9150509250929050565b600081518084526020808501945080840160005b8381101561163357815187529582019590820190600101611617565b509495945050505050565b6020815260006112c46020830184611603565b80151581146107e757600080fd5b6000806040838503121561167257600080fd5b61167b8361124b565b9150602083013561168b81611651565b809150509250929050565b600080602083850312156116a957600080fd5b82356001600160401b03808211156116c057600080fd5b818501915085601f8301126116d457600080fd5b8135818111156116e357600080fd5b8660208285010111156116f557600080fd5b60209290920196919550909350505050565b60008083601f84011261171957600080fd5b5081356001600160401b0381111561173057600080fd5b6020830191508360208260051b850101111561174b57600080fd5b9250929050565b60008060008060006060868803121561176a57600080fd5b85356001600160401b038082111561178157600080fd5b61178d89838a01611707565b909750955060208801359150808211156117a657600080fd5b506117b388828901611707565b96999598509660400135949350505050565b600080604083850312156117d857600080fd5b6117e18361124b565b91506117ef6020840161124b565b90509250929050565b600080600080600060a0868803121561181057600080fd5b6118198661124b565b94506118276020870161124b565b9350604086013592506060860135915060808601356001600160401b0381111561185057600080fd5b61152c8882890161141d565b60006020828403121561186e57600080fd5b6112c48261124b565b600181811c9082168061188b57607f821691505b6020821081036118ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546118bf81611877565b600182811680156118d757600181146118ec5761191b565b60ff198416875282151583028701945061191b565b8860005260208060002060005b858110156119125781548a8201529084019082016118f9565b50505082870194505b50505050835161192f8183602088016112cb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016119765761197661194e565b5060010190565b601f82111561069857600081815260208120601f850160051c810160208610156119a45750805b601f850160051c820191505b818110156104a2578281556001016119b0565b6001600160401b038311156119da576119da611347565b6119ee836119e88354611877565b8361197d565b6000601f841160018114611a225760008515611a0a5750838201355b600019600387901b1c1916600186901b1783556109f0565b600083815260209020601f19861690835b82811015611a535786850135825560209485019460019092019101611a33565b5086821015611a705760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601260045260246000fd5b600082611aa757611aa7611a82565b500490565b8181038181111561035f5761035f61194e565b600082611ace57611ace611a82565b500690565b8082018082111561035f5761035f61194e565b600060208284031215611af857600080fd5b81516112c481611651565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000611bf46040830185611603565b8281036020840152611c068185611603565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c49908301846112ef565b979650505050505050565b600060208284031215611c6657600080fd5b81516112c481611291565b600060033d1115611c8a5760046000803e5060005160e01c5b90565b600060443d1015611c9b5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715611cca57505050505090565b8285019150815181811115611ce25750505050505090565b843d8701016020828501011115611cfc5750505050505090565b611d0b6020828601018761135d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090611d8a90830186611603565b8281036060840152611d9c8186611603565b90508281036080840152611db081856112ef565b9897505050505050505056fea26469706673582212202ea4f897af0bc1e0e4e24858993ce38059dd136a57fcf61039827b47fd7799de64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101205760003560e01c80638da5cb5b116100ad578063da0890a811610071578063da0890a81461024f578063e2b9e18614610262578063e985e9c51461026a578063f242432a146102a6578063f2fde38b146102b957600080fd5b80638da5cb5b1461020857806395d89b4114610219578063a22cb46514610221578063a49a1e7d14610234578063af17dea61461024757600080fd5b80632eb2c2d6116100f45780632eb2c2d614610196578063392f37e9146101ab57806341f43434146101b35780634e1273f4146101e0578063715018a61461020057600080fd5b8062fdd58e1461012557806301ffc9a71461014b57806306fdde031461016e5780630e89341c14610183575b600080fd5b610138610133366004611267565b6102cc565b6040519081526020015b60405180910390f35b61015e6101593660046112a7565b610365565b6040519015158152602001610142565b6101766103b5565b604051610142919061131b565b61017661019136600461132e565b610447565b6101a96101a4366004611490565b61047b565b005b6101766104aa565b6101c86daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610142565b6101f36101ee366004611539565b610538565b604051610142919061163e565b6101a9610661565b6003546001600160a01b03166101c8565b610176610675565b6101a961022f36600461165f565b610684565b6101a9610242366004611696565b61069d565b6101766106b2565b6101a961025d366004611752565b6106bf565b61017661073d565b61015e6102783660046117c5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a96102b43660046117f8565b61074a565b6101a96102c736600461185c565b610771565b60006001600160a01b03831661033c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061039657506001600160e01b031982166303a24d0760e21b145b8061035f57506301ffc9a760e01b6001600160e01b031983161461035f565b6060600580546103c490611877565b80601f01602080910402602001604051908101604052809291908181526020018280546103f090611877565b801561043d5780601f106104125761010080835404028352916020019161043d565b820191906000526020600020905b81548152906001019060200180831161042057829003601f168201915b5050505050905090565b60606004610454836107ea565b6040516020016104659291906118b1565b6040516020818303038152906040529050919050565b846001600160a01b038116331461049557610495336108f2565b6104a286868686866109ab565b505050505050565b600480546104b790611877565b80601f01602080910402602001604051908101604052809291908181526020018280546104e390611877565b80156105305780601f1061050557610100808354040283529160200191610530565b820191906000526020600020905b81548152906001019060200180831161051357829003601f168201915b505050505081565b6060815183511461059d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610333565b600083516001600160401b038111156105b8576105b8611347565b6040519080825280602002602001820160405280156105e1578160200160208202803683370190505b50905060005b84518110156106595761062c85828151811061060557610605611938565b602002602001015185838151811061061f5761061f611938565b60200260200101516102cc565b82828151811061063e5761063e611938565b602090810291909101015261065281611964565b90506105e7565b509392505050565b6106696109f7565b6106736000610a51565b565b6060600680546103c490611877565b8161068e816108f2565b6106988383610aa3565b505050565b6106a56109f7565b60046106988284836119c3565b600680546104b790611877565b6106c76109f7565b60005b828110156104a25761072b8484838181106106e7576106e7611938565b90506020020160208101906106fc919061185c565b8388888581811061070f5761070f611938565b9050602002013560405180602001604052806000815250610ab2565b8061073581611964565b9150506106ca565b600580546104b790611877565b846001600160a01b038116331461076457610764336108f2565b6104a28686868686610bc6565b6107796109f7565b6001600160a01b0381166107de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610333565b6107e781610a51565b50565b6060816000036108115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561083b578061082581611964565b91506108349050600a83611a98565b9150610815565b6000816001600160401b0381111561085557610855611347565b6040519080825280601f01601f19166020018201604052801561087f576020820181803683370190505b5090505b84156108ea57610894600183611aac565b91506108a1600a86611abf565b6108ac906030611ad3565b60f81b8183815181106108c1576108c1611938565b60200101906001600160f81b031916908160001a9053506108e3600a86611a98565b9450610883565b949350505050565b6daaeb6d7670e522a718067333cd4e3b156107e757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190611ae6565b6107e757604051633b79c77360e21b81526001600160a01b0382166004820152602401610333565b6001600160a01b0385163314806109c757506109c78533610278565b6109e35760405162461bcd60e51b815260040161033390611b03565b6109f08585858585610c0b565b5050505050565b6003546001600160a01b031633146106735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610333565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610aae338383610de0565b5050565b6001600160a01b038416610b125760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610333565b336000610b1e85610ec0565b90506000610b2b85610ec0565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610b5d908490611ad3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610bbd83600089898989610f0b565b50505050505050565b6001600160a01b038516331480610be25750610be28533610278565b610bfe5760405162461bcd60e51b815260040161033390611b03565b6109f08585858585611066565b8151835114610c6d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610333565b6001600160a01b038416610c935760405162461bcd60e51b815260040161033390611b52565b3360005b8451811015610d7a576000858281518110610cb457610cb4611938565b602002602001015190506000858381518110610cd257610cd2611938565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d225760405162461bcd60e51b815260040161033390611b97565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d5f908490611ad3565b9250508190555050505080610d7390611964565b9050610c97565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610dca929190611be1565b60405180910390a46104a2818787878787611190565b816001600160a01b0316836001600160a01b031603610e535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610333565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610efa57610efa611938565b602090810291909101015292915050565b6001600160a01b0384163b156104a25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610f4f9089908990889088908890600401611c0f565b6020604051808303816000875af1925050508015610f8a575060408051601f3d908101601f19168201909252610f8791810190611c54565b60015b61103657610f96611c71565b806308c379a003610fcf5750610faa611c8d565b80610fb55750610fd1565b8060405162461bcd60e51b8152600401610333919061131b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610333565b6001600160e01b0319811663f23a6e6160e01b14610bbd5760405162461bcd60e51b815260040161033390611d16565b6001600160a01b03841661108c5760405162461bcd60e51b815260040161033390611b52565b33600061109885610ec0565b905060006110a585610ec0565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156110e85760405162461bcd60e51b815260040161033390611b97565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611125908490611ad3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611185848a8a8a8a8a610f0b565b505050505050505050565b6001600160a01b0384163b156104a25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906111d49089908990889088908890600401611d5e565b6020604051808303816000875af192505050801561120f575060408051601f3d908101601f1916820190925261120c91810190611c54565b60015b61121b57610f96611c71565b6001600160e01b0319811663bc197c8160e01b14610bbd5760405162461bcd60e51b815260040161033390611d16565b80356001600160a01b038116811461126257600080fd5b919050565b6000806040838503121561127a57600080fd5b6112838361124b565b946020939093013593505050565b6001600160e01b0319811681146107e757600080fd5b6000602082840312156112b957600080fd5b81356112c481611291565b9392505050565b60005b838110156112e65781810151838201526020016112ce565b50506000910152565b600081518084526113078160208601602086016112cb565b601f01601f19169290920160200192915050565b6020815260006112c460208301846112ef565b60006020828403121561134057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561138257611382611347565b6040525050565b60006001600160401b038211156113a2576113a2611347565b5060051b60200190565b600082601f8301126113bd57600080fd5b813560206113ca82611389565b6040516113d7828261135d565b83815260059390931b85018201928281019150868411156113f757600080fd5b8286015b8481101561141257803583529183019183016113fb565b509695505050505050565b600082601f83011261142e57600080fd5b81356001600160401b0381111561144757611447611347565b60405161145e601f8301601f19166020018261135d565b81815284602083860101111561147357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114a857600080fd5b6114b18661124b565b94506114bf6020870161124b565b935060408601356001600160401b03808211156114db57600080fd5b6114e789838a016113ac565b945060608801359150808211156114fd57600080fd5b61150989838a016113ac565b9350608088013591508082111561151f57600080fd5b5061152c8882890161141d565b9150509295509295909350565b6000806040838503121561154c57600080fd5b82356001600160401b038082111561156357600080fd5b818501915085601f83011261157757600080fd5b8135602061158482611389565b604051611591828261135d565b83815260059390931b85018201928281019150898411156115b157600080fd5b948201945b838610156115d6576115c78661124b565b825294820194908201906115b6565b965050860135925050808211156115ec57600080fd5b506115f9858286016113ac565b9150509250929050565b600081518084526020808501945080840160005b8381101561163357815187529582019590820190600101611617565b509495945050505050565b6020815260006112c46020830184611603565b80151581146107e757600080fd5b6000806040838503121561167257600080fd5b61167b8361124b565b9150602083013561168b81611651565b809150509250929050565b600080602083850312156116a957600080fd5b82356001600160401b03808211156116c057600080fd5b818501915085601f8301126116d457600080fd5b8135818111156116e357600080fd5b8660208285010111156116f557600080fd5b60209290920196919550909350505050565b60008083601f84011261171957600080fd5b5081356001600160401b0381111561173057600080fd5b6020830191508360208260051b850101111561174b57600080fd5b9250929050565b60008060008060006060868803121561176a57600080fd5b85356001600160401b038082111561178157600080fd5b61178d89838a01611707565b909750955060208801359150808211156117a657600080fd5b506117b388828901611707565b96999598509660400135949350505050565b600080604083850312156117d857600080fd5b6117e18361124b565b91506117ef6020840161124b565b90509250929050565b600080600080600060a0868803121561181057600080fd5b6118198661124b565b94506118276020870161124b565b9350604086013592506060860135915060808601356001600160401b0381111561185057600080fd5b61152c8882890161141d565b60006020828403121561186e57600080fd5b6112c48261124b565b600181811c9082168061188b57607f821691505b6020821081036118ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546118bf81611877565b600182811680156118d757600181146118ec5761191b565b60ff198416875282151583028701945061191b565b8860005260208060002060005b858110156119125781548a8201529084019082016118f9565b50505082870194505b50505050835161192f8183602088016112cb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016119765761197661194e565b5060010190565b601f82111561069857600081815260208120601f850160051c810160208610156119a45750805b601f850160051c820191505b818110156104a2578281556001016119b0565b6001600160401b038311156119da576119da611347565b6119ee836119e88354611877565b8361197d565b6000601f841160018114611a225760008515611a0a5750838201355b600019600387901b1c1916600186901b1783556109f0565b600083815260209020601f19861690835b82811015611a535786850135825560209485019460019092019101611a33565b5086821015611a705760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601260045260246000fd5b600082611aa757611aa7611a82565b500490565b8181038181111561035f5761035f61194e565b600082611ace57611ace611a82565b500690565b8082018082111561035f5761035f61194e565b600060208284031215611af857600080fd5b81516112c481611651565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000611bf46040830185611603565b8281036020840152611c068185611603565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c49908301846112ef565b979650505050505050565b600060208284031215611c6657600080fd5b81516112c481611291565b600060033d1115611c8a5760046000803e5060005160e01c5b90565b600060443d1015611c9b5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715611cca57505050505090565b8285019150815181811115611ce25750505050505090565b843d8701016020828501011115611cfc5750505050505090565b611d0b6020828601018761135d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090611d8a90830186611603565b8281036060840152611d9c8186611603565b90508281036080840152611db081856112ef565b9897505050505050505056fea26469706673582212202ea4f897af0bc1e0e4e24858993ce38059dd136a57fcf61039827b47fd7799de64736f6c63430008110033

Deployed Bytecode Sourcemap

45641:1726:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30087:230;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;30087:230:0;;;;;;;;29110:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;29110:310:0;1019:187:1;46432:83:0;;;:::i;:::-;;;;;;;:::i;46262:162::-;;;;;;:::i;:::-;;:::i;47062:302::-;;;;;;:::i;:::-;;:::i;:::-;;45719:22;;;:::i;2827:143::-;;2927:42;2827:143;;;;;-1:-1:-1;;;;;5158:32:1;;;5140:51;;5128:2;5113:18;2827:143:0;4963:234:1;30483:524:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9805:103::-;;;:::i;9157:87::-;9230:6;;-1:-1:-1;;;;;9230:6:0;9157:87;;46523;;;:::i;46618:176::-;;;;;;:::i;:::-;;:::i;46160:94::-;;;;;;:::i;:::-;;:::i;45774:21::-;;;:::i;45921:231::-;;;;;;:::i;:::-;;:::i;45748:19::-;;;:::i;31307:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31430:27:0;;;31406:4;31430:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31307:168;46802:252;;;;;;:::i;:::-;;:::i;10063:201::-;;;;;;:::i;:::-;;:::i;30087:230::-;30173:7;-1:-1:-1;;;;;30201:21:0;;30193:76;;;;-1:-1:-1;;;30193:76:0;;10856:2:1;30193:76:0;;;10838:21:1;10895:2;10875:18;;;10868:30;10934:34;10914:18;;;10907:62;-1:-1:-1;;;10985:18:1;;;10978:40;11035:19;;30193:76:0;;;;;;;;;-1:-1:-1;30287:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;30287:22:0;;;;;;;;;;30087:230;;;;;:::o;29110:310::-;29212:4;-1:-1:-1;;;;;;29249:41:0;;-1:-1:-1;;;29249:41:0;;:110;;-1:-1:-1;;;;;;;29307:52:0;;-1:-1:-1;;;29307:52:0;29249:110;:163;;;-1:-1:-1;;;;;;;;;;20661:40:0;;;29376:36;20552:157;46432:83;46469:13;46502:5;46495:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46432:83;:::o;46262:162::-;46322:13;46379:8;46389:25;46406:7;46389:16;:25::i;:::-;46362:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46348:68;;46262:162;;;:::o;47062:302::-;47282:4;-1:-1:-1;;;;;4168:18:0;;4176:10;4168:18;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;47299:57:::1;47327:4;47333:2;47337:3;47342:7;47351:4;47299:27;:57::i;:::-;47062:302:::0;;;;;;:::o;45719:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30483:524::-;30639:16;30700:3;:10;30681:8;:15;:29;30673:83;;;;-1:-1:-1;;;30673:83:0;;12803:2:1;30673:83:0;;;12785:21:1;12842:2;12822:18;;;12815:30;12881:34;12861:18;;;12854:62;-1:-1:-1;;;12932:18:1;;;12925:39;12981:19;;30673:83:0;12601:405:1;30673:83:0;30769:30;30816:8;:15;-1:-1:-1;;;;;30802:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30802:30:0;;30769:63;;30850:9;30845:122;30869:8;:15;30865:1;:19;30845:122;;;30925:30;30935:8;30944:1;30935:11;;;;;;;;:::i;:::-;;;;;;;30948:3;30952:1;30948:6;;;;;;;;:::i;:::-;;;;;;;30925:9;:30::i;:::-;30906:13;30920:1;30906:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;30886:3;;;:::i;:::-;;;30845:122;;;-1:-1:-1;30986:13:0;30483:524;-1:-1:-1;;;30483:524:0:o;9805:103::-;9043:13;:11;:13::i;:::-;9870:30:::1;9897:1;9870:18;:30::i;:::-;9805:103::o:0;46523:87::-;46562:13;46595:7;46588:14;;;;;:::i;46618:176::-;46722:8;4348:30;4369:8;4348:20;:30::i;:::-;46743:43:::1;46767:8;46777;46743:23;:43::i;:::-;46618:176:::0;;;:::o;46160:94::-;9043:13;:11;:13::i;:::-;46231:8:::1;:15;46242:4:::0;;46231:8;:15:::1;:::i;45774:21::-:0;;;;;;;:::i;45921:231::-;9043:13;:11;:13::i;:::-;46046:9:::1;46042:102;46061:17:::0;;::::1;46042:102;;;46099:45;46105:6;;46112:1;46105:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46116:7;46125:11;;46137:1;46125:14;;;;;;;:::i;:::-;;;;;;;46099:45;;;;;;;;;;;::::0;:5:::1;:45::i;:::-;46080:3:::0;::::1;::::0;::::1;:::i;:::-;;;;46042:102;;45748:19:::0;;;;;;;:::i;46802:252::-;46969:4;-1:-1:-1;;;;;4168:18:0;;4176:10;4168:18;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;46991:55:::1;47014:4;47020:2;47024:7;47033:6;47041:4;46991:22;:55::i;10063:201::-:0;9043:13;:11;:13::i;:::-;-1:-1:-1;;;;;10152:22:0;::::1;10144:73;;;::::0;-1:-1:-1;;;10144:73:0;;15549:2:1;10144:73:0::1;::::0;::::1;15531:21:1::0;15588:2;15568:18;;;15561:30;15627:34;15607:18;;;15600:62;-1:-1:-1;;;15678:18:1;;;15671:36;15724:19;;10144:73:0::1;15347:402:1::0;10144:73:0::1;10228:28;10247:8;10228:18;:28::i;:::-;10063:201:::0;:::o;5511:723::-;5567:13;5788:5;5797:1;5788:10;5784:53;;-1:-1:-1;;5815:10:0;;;;;;;;;;;;-1:-1:-1;;;5815:10:0;;;;;5511:723::o;5784:53::-;5862:5;5847:12;5903:78;5910:9;;5903:78;;5936:8;;;;:::i;:::-;;-1:-1:-1;5959:10:0;;-1:-1:-1;5967:2:0;5959:10;;:::i;:::-;;;5903:78;;;5991:19;6023:6;-1:-1:-1;;;;;6013:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6013:17:0;;5991:39;;6041:154;6048:10;;6041:154;;6075:11;6085:1;6075:11;;:::i;:::-;;-1:-1:-1;6144:10:0;6152:2;6144:5;:10;:::i;:::-;6131:24;;:2;:24;:::i;:::-;6118:39;;6101:6;6108;6101:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6101:56:0;;;;;;;;-1:-1:-1;6172:11:0;6181:2;6172:11;;:::i;:::-;;;6041:154;;;6219:6;5511:723;-1:-1:-1;;;;5511:723:0:o;4410:419::-;2927:42;4601:45;:49;4597:225;;4672:67;;-1:-1:-1;;;4672:67:0;;4723:4;4672:67;;;16603:34:1;-1:-1:-1;;;;;16673:15:1;;16653:18;;;16646:43;2927:42:0;;4672;;16538:18:1;;4672:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4667:144;;4767:28;;-1:-1:-1;;;4767:28:0;;-1:-1:-1;;;;;5158:32:1;;4767:28:0;;;5140:51:1;5113:18;;4767:28:0;4963:234:1;32031:439:0;-1:-1:-1;;;;;32264:20:0;;7917:10;32264:20;;:60;;-1:-1:-1;32288:36:0;32305:4;7917:10;31307:168;:::i;32288:36::-;32242:157;;;;-1:-1:-1;;;32242:157:0;;;;;;;:::i;:::-;32410:52;32433:4;32439:2;32443:3;32448:7;32457:4;32410:22;:52::i;:::-;32031:439;;;;;:::o;9322:132::-;9230:6;;-1:-1:-1;;;;;9230:6:0;7917:10;9386:23;9378:68;;;;-1:-1:-1;;;9378:68:0;;17568:2:1;9378:68:0;;;17550:21:1;;;17587:18;;;17580:30;17646:34;17626:18;;;17619:62;17698:18;;9378:68:0;17366:356:1;10424:191:0;10517:6;;;-1:-1:-1;;;;;10534:17:0;;;-1:-1:-1;;;;;;10534:17:0;;;;;;;10567:40;;10517:6;;;10534:17;10517:6;;10567:40;;10498:16;;10567:40;10487:128;10424:191;:::o;31080:155::-;31175:52;7917:10;31208:8;31218;31175:18;:52::i;:::-;31080:155;;:::o;36730:729::-;-1:-1:-1;;;;;36883:16:0;;36875:62;;;;-1:-1:-1;;;36875:62:0;;17929:2:1;36875:62:0;;;17911:21:1;17968:2;17948:18;;;17941:30;18007:34;17987:18;;;17980:62;-1:-1:-1;;;18058:18:1;;;18051:31;18099:19;;36875:62:0;17727:397:1;36875:62:0;7917:10;36950:16;37015:21;37033:2;37015:17;:21::i;:::-;36992:44;;37047:24;37074:25;37092:6;37074:17;:25::i;:::-;37047:52;;37191:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37191:17:0;;;;;;;;;:27;;37212:6;;37191:9;:27;;37212:6;;37191:27;:::i;:::-;;;;-1:-1:-1;;37234:52:0;;;18303:25:1;;;18359:2;18344:18;;18337:34;;;-1:-1:-1;;;;;37234:52:0;;;;37267:1;;37234:52;;;;;;18276:18:1;37234:52:0;;;;;;;37377:74;37408:8;37426:1;37430:2;37434;37438:6;37446:4;37377:30;:74::i;:::-;36864:595;;;36730:729;;;;:::o;31547:407::-;-1:-1:-1;;;;;31755:20:0;;7917:10;31755:20;;:60;;-1:-1:-1;31779:36:0;31796:4;7917:10;31307:168;:::i;31779:36::-;31733:157;;;;-1:-1:-1;;;31733:157:0;;;;;;;:::i;:::-;31901:45;31919:4;31925:2;31929;31933:6;31941:4;31901:17;:45::i;34266:1146::-;34493:7;:14;34479:3;:10;:28;34471:81;;;;-1:-1:-1;;;34471:81:0;;18584:2:1;34471:81:0;;;18566:21:1;18623:2;18603:18;;;18596:30;18662:34;18642:18;;;18635:62;-1:-1:-1;;;18713:18:1;;;18706:38;18761:19;;34471:81:0;18382:404:1;34471:81:0;-1:-1:-1;;;;;34571:16:0;;34563:66;;;;-1:-1:-1;;;34563:66:0;;;;;;;:::i;:::-;7917:10;34642:16;34759:421;34783:3;:10;34779:1;:14;34759:421;;;34815:10;34828:3;34832:1;34828:6;;;;;;;;:::i;:::-;;;;;;;34815:19;;34849:14;34866:7;34874:1;34866:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34893:19;34915:13;;;;;;;;;;-1:-1:-1;;;;;34915:19:0;;;;;;;;;;;;34866:10;;-1:-1:-1;34957:21:0;;;;34949:76;;;;-1:-1:-1;;;34949:76:0;;;;;;;:::i;:::-;35069:9;:13;;;;;;;;;;;-1:-1:-1;;;;;35069:19:0;;;;;;;;;;35091:20;;;35069:42;;35141:17;;;;;;;:27;;35091:20;;35069:9;35141:27;;35091:20;;35141:27;:::i;:::-;;;;;;;;34800:380;;;34795:3;;;;:::i;:::-;;;34759:421;;;;35227:2;-1:-1:-1;;;;;35197:47:0;35221:4;-1:-1:-1;;;;;35197:47:0;35211:8;-1:-1:-1;;;;;35197:47:0;;35231:3;35236:7;35197:47;;;;;;;:::i;:::-;;;;;;;;35329:75;35365:8;35375:4;35381:2;35385:3;35390:7;35399:4;35329:35;:75::i;41143:331::-;41298:8;-1:-1:-1;;;;;41289:17:0;:5;-1:-1:-1;;;;;41289:17:0;;41281:71;;;;-1:-1:-1;;;41281:71:0;;20280:2:1;41281:71:0;;;20262:21:1;20319:2;20299:18;;;20292:30;20358:34;20338:18;;;20331:62;-1:-1:-1;;;20409:18:1;;;20402:39;20458:19;;41281:71:0;20078:405:1;41281:71:0;-1:-1:-1;;;;;41363:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41363:46:0;;;;;;;;;;41425:41;;1159::1;;;41425::0;;1132:18:1;41425:41:0;;;;;;;41143:331;;;:::o;45409:198::-;45529:16;;;45543:1;45529:16;;;;;;;;;45475;;45504:22;;45529:16;;;;;;;;;;;;-1:-1:-1;45529:16:0;45504:41;;45567:7;45556:5;45562:1;45556:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;45594:5;45409:198;-1:-1:-1;;45409:198:0:o;43836:744::-;-1:-1:-1;;;;;44051:13:0;;12023:19;:23;44047:526;;44087:72;;-1:-1:-1;;;44087:72:0;;-1:-1:-1;;;;;44087:38:0;;;;;:72;;44126:8;;44136:4;;44142:2;;44146:6;;44154:4;;44087:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44087:72:0;;;;;;;;-1:-1:-1;;44087:72:0;;;;;;;;;;;;:::i;:::-;;;44083:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;44435:6;44428:14;;-1:-1:-1;;;44428:14:0;;;;;;;;:::i;44083:479::-;;;44484:62;;-1:-1:-1;;;44484:62:0;;22370:2:1;44484:62:0;;;22352:21:1;22409:2;22389:18;;;22382:30;22448:34;22428:18;;;22421:62;-1:-1:-1;;;22499:18:1;;;22492:50;22559:19;;44484:62:0;22168:416:1;44083:479:0;-1:-1:-1;;;;;;44209:55:0;;-1:-1:-1;;;44209:55:0;44205:154;;44289:50;;-1:-1:-1;;;44289:50:0;;;;;;;:::i;32934:974::-;-1:-1:-1;;;;;33122:16:0;;33114:66;;;;-1:-1:-1;;;33114:66:0;;;;;;;:::i;:::-;7917:10;33193:16;33258:21;33276:2;33258:17;:21::i;:::-;33235:44;;33290:24;33317:25;33335:6;33317:17;:25::i;:::-;33290:52;;33428:19;33450:13;;;;;;;;;;;-1:-1:-1;;;;;33450:19:0;;;;;;;;;;33488:21;;;;33480:76;;;;-1:-1:-1;;;33480:76:0;;;;;;;:::i;:::-;33592:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33592:19:0;;;;;;;;;;33614:20;;;33592:42;;33656:17;;;;;;;:27;;33614:20;;33592:9;33656:27;;33614:20;;33656:27;:::i;:::-;;;;-1:-1:-1;;33701:46:0;;;18303:25:1;;;18359:2;18344:18;;18337:34;;;-1:-1:-1;;;;;33701:46:0;;;;;;;;;;;;;;18276:18:1;33701:46:0;;;;;;;33832:68;33863:8;33873:4;33879:2;33883;33887:6;33895:4;33832:30;:68::i;:::-;33103:805;;;;32934:974;;;;;:::o;44588:813::-;-1:-1:-1;;;;;44828:13:0;;12023:19;:23;44824:570;;44864:79;;-1:-1:-1;;;44864:79:0;;-1:-1:-1;;;;;44864:43:0;;;;;:79;;44908:8;;44918:4;;44924:3;;44929:7;;44938:4;;44864:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44864:79:0;;;;;;;;-1:-1:-1;;44864:79:0;;;;;;;;;;;;:::i;:::-;;;44860:523;;;;:::i;:::-;-1:-1:-1;;;;;;45025:60:0;;-1:-1:-1;;;45025:60:0;45021:159;;45110:50;;-1:-1:-1;;;45110:50:0;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:250::-;1296:1;1306:113;1320:6;1317:1;1314:13;1306:113;;;1396:11;;;1390:18;1377:11;;;1370:39;1342:2;1335:10;1306:113;;;-1:-1:-1;;1453:1:1;1435:16;;1428:27;1211:250::o;1466:271::-;1508:3;1546:5;1540:12;1573:6;1568:3;1561:19;1589:76;1658:6;1651:4;1646:3;1642:14;1635:4;1628:5;1624:16;1589:76;:::i;:::-;1719:2;1698:15;-1:-1:-1;;1694:29:1;1685:39;;;;1726:4;1681:50;;1466:271;-1:-1:-1;;1466:271:1:o;1742:220::-;1891:2;1880:9;1873:21;1854:4;1911:45;1952:2;1941:9;1937:18;1929:6;1911:45;:::i;1967:180::-;2026:6;2079:2;2067:9;2058:7;2054:23;2050:32;2047:52;;;2095:1;2092;2085:12;2047:52;-1:-1:-1;2118:23:1;;1967:180;-1:-1:-1;1967:180:1:o;2152:127::-;2213:10;2208:3;2204:20;2201:1;2194:31;2244:4;2241:1;2234:15;2268:4;2265:1;2258:15;2284:249;2394:2;2375:13;;-1:-1:-1;;2371:27:1;2359:40;;-1:-1:-1;;;;;2414:34:1;;2450:22;;;2411:62;2408:88;;;2476:18;;:::i;:::-;2512:2;2505:22;-1:-1:-1;;2284:249:1:o;2538:183::-;2598:4;-1:-1:-1;;;;;2623:6:1;2620:30;2617:56;;;2653:18;;:::i;:::-;-1:-1:-1;2698:1:1;2694:14;2710:4;2690:25;;2538:183::o;2726:724::-;2780:5;2833:3;2826:4;2818:6;2814:17;2810:27;2800:55;;2851:1;2848;2841:12;2800:55;2887:6;2874:20;2913:4;2936:43;2976:2;2936:43;:::i;:::-;3008:2;3002:9;3020:31;3048:2;3040:6;3020:31;:::i;:::-;3086:18;;;3178:1;3174:10;;;;3162:23;;3158:32;;;3120:15;;;;-1:-1:-1;3202:15:1;;;3199:35;;;3230:1;3227;3220:12;3199:35;3266:2;3258:6;3254:15;3278:142;3294:6;3289:3;3286:15;3278:142;;;3360:17;;3348:30;;3398:12;;;;3311;;3278:142;;;-1:-1:-1;3438:6:1;2726:724;-1:-1:-1;;;;;;2726:724:1:o;3455:555::-;3497:5;3550:3;3543:4;3535:6;3531:17;3527:27;3517:55;;3568:1;3565;3558:12;3517:55;3604:6;3591:20;-1:-1:-1;;;;;3626:2:1;3623:26;3620:52;;;3652:18;;:::i;:::-;3701:2;3695:9;3713:67;3768:2;3749:13;;-1:-1:-1;;3745:27:1;3774:4;3741:38;3695:9;3713:67;:::i;:::-;3804:2;3796:6;3789:18;3850:3;3843:4;3838:2;3830:6;3826:15;3822:26;3819:35;3816:55;;;3867:1;3864;3857:12;3816:55;3931:2;3924:4;3916:6;3912:17;3905:4;3897:6;3893:17;3880:54;3978:1;3954:15;;;3971:4;3950:26;3943:37;;;;3958:6;3455:555;-1:-1:-1;;;3455:555:1:o;4015:943::-;4169:6;4177;4185;4193;4201;4254:3;4242:9;4233:7;4229:23;4225:33;4222:53;;;4271:1;4268;4261:12;4222:53;4294:29;4313:9;4294:29;:::i;:::-;4284:39;;4342:38;4376:2;4365:9;4361:18;4342:38;:::i;:::-;4332:48;;4431:2;4420:9;4416:18;4403:32;-1:-1:-1;;;;;4495:2:1;4487:6;4484:14;4481:34;;;4511:1;4508;4501:12;4481:34;4534:61;4587:7;4578:6;4567:9;4563:22;4534:61;:::i;:::-;4524:71;;4648:2;4637:9;4633:18;4620:32;4604:48;;4677:2;4667:8;4664:16;4661:36;;;4693:1;4690;4683:12;4661:36;4716:63;4771:7;4760:8;4749:9;4745:24;4716:63;:::i;:::-;4706:73;;4832:3;4821:9;4817:19;4804:33;4788:49;;4862:2;4852:8;4849:16;4846:36;;;4878:1;4875;4868:12;4846:36;;4901:51;4944:7;4933:8;4922:9;4918:24;4901:51;:::i;:::-;4891:61;;;4015:943;;;;;;;;:::o;5202:1208::-;5320:6;5328;5381:2;5369:9;5360:7;5356:23;5352:32;5349:52;;;5397:1;5394;5387:12;5349:52;5437:9;5424:23;-1:-1:-1;;;;;5507:2:1;5499:6;5496:14;5493:34;;;5523:1;5520;5513:12;5493:34;5561:6;5550:9;5546:22;5536:32;;5606:7;5599:4;5595:2;5591:13;5587:27;5577:55;;5628:1;5625;5618:12;5577:55;5664:2;5651:16;5686:4;5709:43;5749:2;5709:43;:::i;:::-;5781:2;5775:9;5793:31;5821:2;5813:6;5793:31;:::i;:::-;5859:18;;;5947:1;5943:10;;;;5935:19;;5931:28;;;5893:15;;;;-1:-1:-1;5971:19:1;;;5968:39;;;6003:1;6000;5993:12;5968:39;6027:11;;;;6047:148;6063:6;6058:3;6055:15;6047:148;;;6129:23;6148:3;6129:23;:::i;:::-;6117:36;;6080:12;;;;6173;;;;6047:148;;;6214:6;-1:-1:-1;;6258:18:1;;6245:32;;-1:-1:-1;;6289:16:1;;;6286:36;;;6318:1;6315;6308:12;6286:36;;6341:63;6396:7;6385:8;6374:9;6370:24;6341:63;:::i;:::-;6331:73;;;5202:1208;;;;;:::o;6415:435::-;6468:3;6506:5;6500:12;6533:6;6528:3;6521:19;6559:4;6588:2;6583:3;6579:12;6572:19;;6625:2;6618:5;6614:14;6646:1;6656:169;6670:6;6667:1;6664:13;6656:169;;;6731:13;;6719:26;;6765:12;;;;6800:15;;;;6692:1;6685:9;6656:169;;;-1:-1:-1;6841:3:1;;6415:435;-1:-1:-1;;;;;6415:435:1:o;6855:261::-;7034:2;7023:9;7016:21;6997:4;7054:56;7106:2;7095:9;7091:18;7083:6;7054:56;:::i;7329:118::-;7415:5;7408:13;7401:21;7394:5;7391:32;7381:60;;7437:1;7434;7427:12;7452:315;7517:6;7525;7578:2;7566:9;7557:7;7553:23;7549:32;7546:52;;;7594:1;7591;7584:12;7546:52;7617:29;7636:9;7617:29;:::i;:::-;7607:39;;7696:2;7685:9;7681:18;7668:32;7709:28;7731:5;7709:28;:::i;:::-;7756:5;7746:15;;;7452:315;;;;;:::o;7772:592::-;7843:6;7851;7904:2;7892:9;7883:7;7879:23;7875:32;7872:52;;;7920:1;7917;7910:12;7872:52;7960:9;7947:23;-1:-1:-1;;;;;8030:2:1;8022:6;8019:14;8016:34;;;8046:1;8043;8036:12;8016:34;8084:6;8073:9;8069:22;8059:32;;8129:7;8122:4;8118:2;8114:13;8110:27;8100:55;;8151:1;8148;8141:12;8100:55;8191:2;8178:16;8217:2;8209:6;8206:14;8203:34;;;8233:1;8230;8223:12;8203:34;8278:7;8273:2;8264:6;8260:2;8256:15;8252:24;8249:37;8246:57;;;8299:1;8296;8289:12;8246:57;8330:2;8322:11;;;;;8352:6;;-1:-1:-1;7772:592:1;;-1:-1:-1;;;;7772:592:1:o;8369:367::-;8432:8;8442:6;8496:3;8489:4;8481:6;8477:17;8473:27;8463:55;;8514:1;8511;8504:12;8463:55;-1:-1:-1;8537:20:1;;-1:-1:-1;;;;;8569:30:1;;8566:50;;;8612:1;8609;8602:12;8566:50;8649:4;8641:6;8637:17;8625:29;;8709:3;8702:4;8692:6;8689:1;8685:14;8677:6;8673:27;8669:38;8666:47;8663:67;;;8726:1;8723;8716:12;8663:67;8369:367;;;;;:::o;8741:841::-;8872:6;8880;8888;8896;8904;8957:2;8945:9;8936:7;8932:23;8928:32;8925:52;;;8973:1;8970;8963:12;8925:52;9013:9;9000:23;-1:-1:-1;;;;;9083:2:1;9075:6;9072:14;9069:34;;;9099:1;9096;9089:12;9069:34;9138:70;9200:7;9191:6;9180:9;9176:22;9138:70;:::i;:::-;9227:8;;-1:-1:-1;9112:96:1;-1:-1:-1;9315:2:1;9300:18;;9287:32;;-1:-1:-1;9331:16:1;;;9328:36;;;9360:1;9357;9350:12;9328:36;;9399:72;9463:7;9452:8;9441:9;9437:24;9399:72;:::i;:::-;8741:841;;;;-1:-1:-1;9490:8:1;9572:2;9557:18;9544:32;;8741:841;-1:-1:-1;;;;8741:841:1:o;9587:260::-;9655:6;9663;9716:2;9704:9;9695:7;9691:23;9687:32;9684:52;;;9732:1;9729;9722:12;9684:52;9755:29;9774:9;9755:29;:::i;:::-;9745:39;;9803:38;9837:2;9826:9;9822:18;9803:38;:::i;:::-;9793:48;;9587:260;;;;;:::o;9852:606::-;9956:6;9964;9972;9980;9988;10041:3;10029:9;10020:7;10016:23;10012:33;10009:53;;;10058:1;10055;10048:12;10009:53;10081:29;10100:9;10081:29;:::i;:::-;10071:39;;10129:38;10163:2;10152:9;10148:18;10129:38;:::i;:::-;10119:48;;10214:2;10203:9;10199:18;10186:32;10176:42;;10265:2;10254:9;10250:18;10237:32;10227:42;;10320:3;10309:9;10305:19;10292:33;-1:-1:-1;;;;;10340:6:1;10337:30;10334:50;;;10380:1;10377;10370:12;10334:50;10403:49;10444:7;10435:6;10424:9;10420:22;10403:49;:::i;10463:186::-;10522:6;10575:2;10563:9;10554:7;10550:23;10546:32;10543:52;;;10591:1;10588;10581:12;10543:52;10614:29;10633:9;10614:29;:::i;11065:380::-;11144:1;11140:12;;;;11187;;;11208:61;;11262:4;11254:6;11250:17;11240:27;;11208:61;11315:2;11307:6;11304:14;11284:18;11281:38;11278:161;;11361:10;11356:3;11352:20;11349:1;11342:31;11396:4;11393:1;11386:15;11424:4;11421:1;11414:15;11278:161;;11065:380;;;:::o;11576:1020::-;11752:3;11781:1;11814:6;11808:13;11844:36;11870:9;11844:36;:::i;:::-;11899:1;11916:18;;;11943:133;;;;12090:1;12085:356;;;;11909:532;;11943:133;-1:-1:-1;;11976:24:1;;11964:37;;12049:14;;12042:22;12030:35;;12021:45;;;-1:-1:-1;11943:133:1;;12085:356;12116:6;12113:1;12106:17;12146:4;12191:2;12188:1;12178:16;12216:1;12230:165;12244:6;12241:1;12238:13;12230:165;;;12322:14;;12309:11;;;12302:35;12365:16;;;;12259:10;;12230:165;;;12234:3;;;12424:6;12419:3;12415:16;12408:23;;11909:532;;;;;12472:6;12466:13;12488:68;12547:8;12542:3;12535:4;12527:6;12523:17;12488:68;:::i;:::-;12572:18;;11576:1020;-1:-1:-1;;;;11576:1020:1:o;13011:127::-;13072:10;13067:3;13063:20;13060:1;13053:31;13103:4;13100:1;13093:15;13127:4;13124:1;13117:15;13143:127;13204:10;13199:3;13195:20;13192:1;13185:31;13235:4;13232:1;13225:15;13259:4;13256:1;13249:15;13275:135;13314:3;13335:17;;;13332:43;;13355:18;;:::i;:::-;-1:-1:-1;13402:1:1;13391:13;;13275:135::o;13415:545::-;13517:2;13512:3;13509:11;13506:448;;;13553:1;13578:5;13574:2;13567:17;13623:4;13619:2;13609:19;13693:2;13681:10;13677:19;13674:1;13670:27;13664:4;13660:38;13729:4;13717:10;13714:20;13711:47;;;-1:-1:-1;13752:4:1;13711:47;13807:2;13802:3;13798:12;13795:1;13791:20;13785:4;13781:31;13771:41;;13862:82;13880:2;13873:5;13870:13;13862:82;;;13925:17;;;13906:1;13895:13;13862:82;;14136:1206;-1:-1:-1;;;;;14255:3:1;14252:27;14249:53;;;14282:18;;:::i;:::-;14311:94;14401:3;14361:38;14393:4;14387:11;14361:38;:::i;:::-;14355:4;14311:94;:::i;:::-;14431:1;14456:2;14451:3;14448:11;14473:1;14468:616;;;;15128:1;15145:3;15142:93;;;-1:-1:-1;15201:19:1;;;15188:33;15142:93;-1:-1:-1;;14093:1:1;14089:11;;;14085:24;14081:29;14071:40;14117:1;14113:11;;;14068:57;15248:78;;14441:895;;14468:616;11523:1;11516:14;;;11560:4;11547:18;;-1:-1:-1;;14504:17:1;;;14605:9;14627:229;14641:7;14638:1;14635:14;14627:229;;;14730:19;;;14717:33;14702:49;;14837:4;14822:20;;;;14790:1;14778:14;;;;14657:12;14627:229;;;14631:3;14884;14875:7;14872:16;14869:159;;;15008:1;15004:6;14998:3;14992;14989:1;14985:11;14981:21;14977:34;14973:39;14960:9;14955:3;14951:19;14938:33;14934:79;14926:6;14919:95;14869:159;;;15071:1;15065:3;15062:1;15058:11;15054:19;15048:4;15041:33;14441:895;;14136:1206;;;:::o;15754:127::-;15815:10;15810:3;15806:20;15803:1;15796:31;15846:4;15843:1;15836:15;15870:4;15867:1;15860:15;15886:120;15926:1;15952;15942:35;;15957:18;;:::i;:::-;-1:-1:-1;15991:9:1;;15886:120::o;16011:128::-;16078:9;;;16099:11;;;16096:37;;;16113:18;;:::i;16144:112::-;16176:1;16202;16192:35;;16207:18;;:::i;:::-;-1:-1:-1;16241:9:1;;16144:112::o;16261:125::-;16326:9;;;16347:10;;;16344:36;;;16360:18;;:::i;16700:245::-;16767:6;16820:2;16808:9;16799:7;16795:23;16791:32;16788:52;;;16836:1;16833;16826:12;16788:52;16868:9;16862:16;16887:28;16909:5;16887:28;:::i;16950:411::-;17152:2;17134:21;;;17191:2;17171:18;;;17164:30;17230:34;17225:2;17210:18;;17203:62;-1:-1:-1;;;17296:2:1;17281:18;;17274:45;17351:3;17336:19;;16950:411::o;18791:401::-;18993:2;18975:21;;;19032:2;19012:18;;;19005:30;19071:34;19066:2;19051:18;;19044:62;-1:-1:-1;;;19137:2:1;19122:18;;19115:35;19182:3;19167:19;;18791:401::o;19197:406::-;19399:2;19381:21;;;19438:2;19418:18;;;19411:30;19477:34;19472:2;19457:18;;19450:62;-1:-1:-1;;;19543:2:1;19528:18;;19521:40;19593:3;19578:19;;19197:406::o;19608:465::-;19865:2;19854:9;19847:21;19828:4;19891:56;19943:2;19932:9;19928:18;19920:6;19891:56;:::i;:::-;19995:9;19987:6;19983:22;19978:2;19967:9;19963:18;19956:50;20023:44;20060:6;20052;20023:44;:::i;:::-;20015:52;19608:465;-1:-1:-1;;;;;19608:465:1:o;20488:561::-;-1:-1:-1;;;;;20785:15:1;;;20767:34;;20837:15;;20832:2;20817:18;;20810:43;20884:2;20869:18;;20862:34;;;20927:2;20912:18;;20905:34;;;20747:3;20970;20955:19;;20948:32;;;20710:4;;20997:46;;21023:19;;21015:6;20997:46;:::i;:::-;20989:54;20488:561;-1:-1:-1;;;;;;;20488:561:1:o;21054:249::-;21123:6;21176:2;21164:9;21155:7;21151:23;21147:32;21144:52;;;21192:1;21189;21182:12;21144:52;21224:9;21218:16;21243:30;21267:5;21243:30;:::i;21308:179::-;21343:3;21385:1;21367:16;21364:23;21361:120;;;21431:1;21428;21425;21410:23;-1:-1:-1;21468:1:1;21462:8;21457:3;21453:18;21361:120;21308:179;:::o;21492:671::-;21531:3;21573:4;21555:16;21552:26;21549:39;;;21492:671;:::o;21549:39::-;21615:2;21609:9;-1:-1:-1;;21680:16:1;21676:25;;21673:1;21609:9;21652:50;21731:4;21725:11;21755:16;-1:-1:-1;;;;;21861:2:1;21854:4;21846:6;21842:17;21839:25;21834:2;21826:6;21823:14;21820:45;21817:58;;;21868:5;;;;;21492:671;:::o;21817:58::-;21905:6;21899:4;21895:17;21884:28;;21941:3;21935:10;21968:2;21960:6;21957:14;21954:27;;;21974:5;;;;;;21492:671;:::o;21954:27::-;22058:2;22039:16;22033:4;22029:27;22025:36;22018:4;22009:6;22004:3;22000:16;21996:27;21993:69;21990:82;;;22065:5;;;;;;21492:671;:::o;21990:82::-;22081:57;22132:4;22123:6;22115;22111:19;22107:30;22101:4;22081:57;:::i;:::-;-1:-1:-1;22154:3:1;;21492:671;-1:-1:-1;;;;;21492:671:1:o;22589:404::-;22791:2;22773:21;;;22830:2;22810:18;;;22803:30;22869:34;22864:2;22849:18;;22842:62;-1:-1:-1;;;22935:2:1;22920:18;;22913:38;22983:3;22968:19;;22589:404::o;22998:827::-;-1:-1:-1;;;;;23395:15:1;;;23377:34;;23447:15;;23442:2;23427:18;;23420:43;23357:3;23494:2;23479:18;;23472:31;;;23320:4;;23526:57;;23563:19;;23555:6;23526:57;:::i;:::-;23631:9;23623:6;23619:22;23614:2;23603:9;23599:18;23592:50;23665:44;23702:6;23694;23665:44;:::i;:::-;23651:58;;23758:9;23750:6;23746:22;23740:3;23729:9;23725:19;23718:51;23786:33;23812:6;23804;23786:33;:::i;:::-;23778:41;22998:827;-1:-1:-1;;;;;;;;22998:827:1:o

Swarm Source

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