ETH Price: $2,506.34 (+0.31%)

Token

moonbirdPUNKS (mbPUNKS)
 

Overview

Max Total Supply

0 mbPUNKS

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 mbPUNKS
0x36dCA19E3F0a9C35461c891215e0e9D21a5D21A6
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:
multichainmoonbirdPUNKS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-16
*/

//SPDX-License-Identifier: MIT
// File: /ILayerZeroReceiver.sol



pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}
// File: /ILayerZeroUserApplicationConfig.sol



pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}
// File: /ILayerZeroEndpoint.sol



pragma solidity >=0.5.0;


interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: /NonblockingReceiver.sol


pragma solidity ^0.8.9;




abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]),
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: eightbitbayc.sol


pragma solidity ^0.8.9;



contract multichainmoonbirdPUNKS is ERC721, NonblockingReceiver {

    string public baseURI = "ipfs://QmaJebT6ZGgKWQj5TzJnNg2yUHBTnCEZi6ffuBdLhcJzqs/";
    string public contractURI = "ipfs://Qmbht14SgQMmySpm8BHL6CwB47ErhTaHYLYLcE8mYEniZw";
    string public constant baseExtension = ".json";

    uint256 nextTokenId;
    uint256 MAX_MINT;

    uint256 gasForDestinationLzReceive = 350000;

    uint256 public constant MAX_PER_TX = 2;
    uint256 public constant MAX_PER_WALLET = 30;
    mapping(address => uint256) public minted;

    bool public paused = false;

    constructor(
        address _endpoint,
        uint256 startId,
        uint256 _max
    ) ERC721("moonbirdPUNKS", "mbPUNKS") {
        endpoint = ILayerZeroEndpoint(_endpoint);
        nextTokenId = startId;
        MAX_MINT = _max;
    }

    function mint(uint256 _amount) external payable {
        address _caller = _msgSender();
        require(!paused, "moonbirdPUNKS: Paused");
        require(nextTokenId + _amount <= MAX_MINT, "moonbirdPUNKS: Mint exceeds supply");
        require(MAX_PER_TX >= _amount , "moonbirdPUNKS: Excess max per tx");
        require(MAX_PER_WALLET >= minted[_caller] + _amount, "moonbirdPUNKS: Excess max per wallet");
        minted[_caller] += _amount;

        for(uint256 i = 0; i < _amount; i++) {
            _safeMint(_caller, ++nextTokenId);
        }
    }

    // This function transfers the nft from your address on the
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint256 tokenId) public payable {
        require(
            msg.sender == ownerOf(tokenId),
            "You must own the token to traverse"
        );
        require(
            trustedRemoteLookup[_chainId].length > 0,
            "This chain is currently unavailable for travel"
        );

        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(
            version,
            gasForDestinationLzReceive
        );

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint256 messageFee, ) = endpoint.estimateFees(
            _chainId,
            address(this),
            payload,
            false,
            adapterParams
        );

        require(
            msg.value >= messageFee,
            "moonbirdPUNKS: msg.value not enough to cover messageFee. Send gas for message fees"
        );

        endpoint.send{value: msg.value}(
            _chainId, // destination chainId
            trustedRemoteLookup[_chainId], // destination address of nft contract
            payload, // abi.encoded()'ed bytes
            payable(msg.sender), // refund address
            address(0x0), // 'zroPaymentAddress' unused for this
            adapterParams // txParameters
        );
    }

    function getEstimatedFees(uint16 _chainId, uint256 tokenId) public view returns (uint) {
        bytes memory payload = abi.encode(msg.sender, tokenId);
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);
        (uint quotedLayerZeroFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);
        return quotedLayerZeroFee;
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

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

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              baseExtension
            )
        ) : "";
    }

    function setGasForDestinationLzReceive(uint256 _gasForDestinationLzReceive) external onlyOwner {
        gasForDestinationLzReceive = _gasForDestinationLzReceive;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }

    // ------------------
    // Internal Functions
    // ------------------

    function _LzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal override {
        // decode
        (address toAddr, uint256 tokenId) = abi.decode(
            _payload,
            (address, uint256)
        );

        // mint the tokens back into existence on destination chain
        _safeMint(toAddr, tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEstimatedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasForDestinationLzReceive","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040526036608081815290620030b960a03980516200002991600a91602090910190620001a6565b50604051806060016040528060358152602001620030ef6035913980516200005a91600b91602090910190620001a6565b5062055730600e556010805460ff191690553480156200007957600080fd5b5060405162003124380380620031248339810160408190526200009c916200024c565b604080518082018252600d81526c6d6f6f6e6269726450554e4b5360981b6020808301918252835180850190945260078452666d6250554e4b5360c81b908401528151919291620000f091600091620001a6565b50805162000106906001906020840190620001a6565b505050620001236200011d6200015060201b60201c565b62000154565b600780546001600160a01b0319166001600160a01b039490941693909317909255600c55600d55620002cd565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001b49062000291565b90600052602060002090601f016020900481019282620001d8576000855562000223565b82601f10620001f357805160ff191683800117855562000223565b8280016001018555821562000223579182015b828111156200022357825182559160200191906001019062000206565b506200023192915062000235565b5090565b5b8082111562000231576000815560010162000236565b6000806000606084860312156200026257600080fd5b83516001600160a01b03811681146200027a57600080fd5b602085015160409095015190969495509392505050565b600181811c90821680620002a657607f821691505b602082108103620002c757634e487b7160e01b600052602260045260246000fd5b50919050565b612ddc80620002dd6000396000f3fe6080604052600436106102195760003560e01c80637533d78811610123578063c6682862116100ab578063e8a3d4851161006f578063e8a3d48514610660578063e985e9c514610675578063eb8d72b7146106be578063f2fde38b146106de578063f43a22dc146106fe57600080fd5b8063c6682862146105c9578063c7afa661146105fa578063c87b56dd1461061a578063cf89fa031461063a578063d1deba1f1461064d57600080fd5b8063943fb872116100f2578063943fb8721461054157806395d89b4114610561578063a0712d6814610576578063a22cb46514610589578063b88d4fde146105a957600080fd5b80637533d788146104785780638da5cb5b146104985780638ee74912146104b6578063938e3d7b1461052157600080fd5b806323b872dd116101a65780635c975abb116101755780635c975abb146103f45780636352211e1461040e5780636c0360eb1461042e57806370a0823114610443578063715018a61461046357600080fd5b806323b872dd1461037f5780633ccfd60b1461039f57806342842e0e146103b457806355f804b3146103d457600080fd5b8063081812fc116101ed578063081812fc146102b7578063095ea7b3146102ef5780630f2cdd6c1461030f5780631c37a822146103325780631e7269c51461035257600080fd5b80621d35671461021e57806301ffc9a71461024057806302329a291461027557806306fdde0314610295575b600080fd5b34801561022a57600080fd5b5061023e6102393660046123ac565b610713565b005b34801561024c57600080fd5b5061026061025b366004612446565b61090d565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061023e610290366004612473565b61095f565b3480156102a157600080fd5b506102aa61099c565b60405161026c91906124e6565b3480156102c357600080fd5b506102d76102d23660046124f9565b610a2e565b6040516001600160a01b03909116815260200161026c565b3480156102fb57600080fd5b5061023e61030a366004612527565b610ac3565b34801561031b57600080fd5b50610324601e81565b60405190815260200161026c565b34801561033e57600080fd5b5061023e61034d3660046123ac565b610bd8565b34801561035e57600080fd5b5061032461036d366004612553565b600f6020526000908152604090205481565b34801561038b57600080fd5b5061023e61039a366004612570565b610c47565b3480156103ab57600080fd5b5061023e610c78565b3480156103c057600080fd5b5061023e6103cf366004612570565b610d31565b3480156103e057600080fd5b5061023e6103ef3660046125b1565b610d4c565b34801561040057600080fd5b506010546102609060ff1681565b34801561041a57600080fd5b506102d76104293660046124f9565b610d89565b34801561043a57600080fd5b506102aa610e00565b34801561044f57600080fd5b5061032461045e366004612553565b610e8e565b34801561046f57600080fd5b5061023e610f15565b34801561048457600080fd5b506102aa6104933660046125f9565b610f4b565b3480156104a457600080fd5b506006546001600160a01b03166102d7565b3480156104c257600080fd5b5061050c6104d1366004612614565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161026c565b34801561052d57600080fd5b5061023e61053c3660046125b1565b610f64565b34801561054d57600080fd5b5061023e61055c3660046124f9565b610fa1565b34801561056d57600080fd5b506102aa610fd0565b61023e6105843660046124f9565b610fdf565b34801561059557600080fd5b5061023e6105a436600461266a565b6111cf565b3480156105b557600080fd5b5061023e6105c436600461269f565b6111da565b3480156105d557600080fd5b506102aa60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561060657600080fd5b506103246106153660046126fe565b61120c565b34801561062657600080fd5b506102aa6106353660046124f9565b6112df565b61023e6106483660046126fe565b6113b9565b61023e61065b366004612762565b611696565b34801561066c57600080fd5b506102aa611823565b34801561068157600080fd5b506102606106903660046127ed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b5061023e6106d9366004612826565b611830565b3480156106ea57600080fd5b5061023e6106f9366004612553565b611878565b34801561070a57600080fd5b50610324600281565b6007546001600160a01b0316331461072a57600080fd5b61ffff84166000908152600960205260409020805461074890612878565b90508351148015610787575061ffff84166000908152600960205260409081902090516107759190612921565b60405180910390208380519060200120145b6107f55760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a8229061081e90879087908790879060040161292d565b600060405180830381600087803b15801561083857600080fd5b505af1925050508015610849575060015b610907576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516108939190612976565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906108fe90869086908690869061292d565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061093e57506001600160e01b03198216635b5e139f60e01b145b8061095957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146109895760405162461bcd60e51b81526004016107ec90612992565b6010805460ff1916911515919091179055565b6060600080546109ab90612878565b80601f01602080910402602001604051908101604052809291908181526020018280546109d790612878565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610aa75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ec565b506000908152600460205260409020546001600160a01b031690565b6000610ace82610d89565b9050806001600160a01b0316836001600160a01b031603610b3b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107ec565b336001600160a01b0382161480610b575750610b578133610690565b610bc95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ec565b610bd38383611913565b505050565b333014610c3b5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016107ec565b61090784848484611981565b610c5133826119ae565b610c6d5760405162461bcd60e51b81526004016107ec906129c7565b610bd3838383611aa5565b6006546001600160a01b03163314610ca25760405162461bcd60e51b81526004016107ec90612992565b6040514790600090339083908381818185875af1925050503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050905080610d2d5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b60448201526064016107ec565b5050565b610bd3838383604051806020016040528060008152506111da565b6006546001600160a01b03163314610d765760405162461bcd60e51b81526004016107ec90612992565b8051610d2d90600a9060208401906121bf565b6000818152600260205260408120546001600160a01b0316806109595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107ec565b600a8054610e0d90612878565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990612878565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b505050505081565b60006001600160a01b038216610ef95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107ec565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f3f5760405162461bcd60e51b81526004016107ec90612992565b610f496000611c41565b565b60096020526000908152604090208054610e0d90612878565b6006546001600160a01b03163314610f8e5760405162461bcd60e51b81526004016107ec90612992565b8051610d2d90600b9060208401906121bf565b6006546001600160a01b03163314610fcb5760405162461bcd60e51b81526004016107ec90612992565b600e55565b6060600180546109ab90612878565b601054339060ff161561102c5760405162461bcd60e51b81526020600482015260156024820152741b5bdbdb989a5c9914155392d4ce8814185d5cd959605a1b60448201526064016107ec565b600d5482600c5461103d9190612a2e565b11156110965760405162461bcd60e51b815260206004820152602260248201527f6d6f6f6e6269726450554e4b533a204d696e74206578636565647320737570706044820152616c7960f01b60648201526084016107ec565b81600210156110e75760405162461bcd60e51b815260206004820181905260248201527f6d6f6f6e6269726450554e4b533a20457863657373206d61782070657220747860448201526064016107ec565b6001600160a01b0381166000908152600f602052604090205461110b908390612a2e565b601e10156111675760405162461bcd60e51b8152602060048201526024808201527f6d6f6f6e6269726450554e4b533a20457863657373206d6178207065722077616044820152631b1b195d60e21b60648201526084016107ec565b6001600160a01b0381166000908152600f60205260408120805484929061118f908490612a2e565b90915550600090505b82811015610bd3576111bd82600c600081546111b390612a46565b9182905550611c93565b806111c781612a46565b915050611198565b610d2d338383611cad565b6111e433836119ae565b6112005760405162461bcd60e51b81526004016107ec906129c7565b61090784848484611d7b565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b909452600093919260019285916001600160a01b03909116906340a7bb1090611293908a90309089908790899060a601612a5f565b6040805180830381865afa1580156112af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d39190612ab3565b50979650505050505050565b6000818152600260205260409020546060906001600160a01b031661133e5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016107ec565b6000600a805461134d90612878565b9050116113695760405180602001604052806000815250610959565b600a61137483611dae565b60405180604001604052806005815260200164173539b7b760d91b8152506040516020016113a493929190612ad7565b60405160208183030381529060405292915050565b6113c281610d89565b6001600160a01b0316336001600160a01b03161461142d5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016107ec565b61ffff82166000908152600960205260408120805461144b90612878565b9050116114b15760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016107ec565b6114ba81611eae565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061153d908990309089908790899060a601612a5f565b6040805180830381865afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157d9190612ab3565b509050803410156116115760405162461bcd60e51b815260206004820152605260248201527f6d6f6f6e6269726450554e4b533a206d73672e76616c7565206e6f7420656e6f60448201527f75676820746f20636f766572206d6573736167654665652e2053656e642067616064820152717320666f72206d657373616765206665657360701b608482015260a4016107ec565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c580310092349261165c928c928b913391908b90600401612b10565b6000604051808303818588803b15801561167557600080fd5b505af1158015611689573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516116b7908790612976565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061173e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016107ec565b80548214801561176857508060010154838360405161175e929190612bf0565b6040518091039020145b6117b45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016107ec565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906117e99089908990899089908990600401612c00565b600060405180830381600087803b15801561180357600080fd5b505af1158015611817573d6000803e3d6000fd5b50505050505050505050565b600b8054610e0d90612878565b6006546001600160a01b0316331461185a5760405162461bcd60e51b81526004016107ec90612992565b61ffff83166000908152600960205260409020610907908383612243565b6006546001600160a01b031633146118a25760405162461bcd60e51b81526004016107ec90612992565b6001600160a01b0381166119075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ec565b61191081611c41565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061194882610d89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906119989190612c61565b915091506119a68282611c93565b505050505050565b6000818152600260205260408120546001600160a01b0316611a275760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ec565b6000611a3283610d89565b9050806001600160a01b0316846001600160a01b03161480611a6d5750836001600160a01b0316611a6284610a2e565b6001600160a01b0316145b80611a9d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab882610d89565b6001600160a01b031614611b1c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107ec565b6001600160a01b038216611b7e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107ec565b611b89600082611913565b6001600160a01b0383166000908152600360205260408120805460019290611bb2908490612c8f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611be0908490612a2e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d2d828260405180602001604052806000815250611f49565b816001600160a01b0316836001600160a01b031603611d0e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ec565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d86848484611aa5565b611d9284848484611f7c565b6109075760405162461bcd60e51b81526004016107ec90612ca6565b606081600003611dd55750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dff5780611de981612a46565b9150611df89050600a83612d0e565b9150611dd9565b6000816001600160401b03811115611e1957611e196122e3565b6040519080825280601f01601f191660200182016040528015611e43576020820181803683370190505b5090505b8415611a9d57611e58600183612c8f565b9150611e65600a86612d22565b611e70906030612a2e565b60f81b818381518110611e8557611e85612d36565b60200101906001600160f81b031916908160001a905350611ea7600a86612d0e565b9450611e47565b6000611eb982610d89565b9050611ec6600083611913565b6001600160a01b0381166000908152600360205260408120805460019290611eef908490612c8f565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611f53838361207d565b611f606000848484611f7c565b610bd35760405162461bcd60e51b81526004016107ec90612ca6565b60006001600160a01b0384163b1561207257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fc0903390899088908890600401612d4c565b6020604051808303816000875af1925050508015611ffb575060408051601f3d908101601f19168201909252611ff891810190612d89565b60015b612058573d808015612029576040519150601f19603f3d011682016040523d82523d6000602084013e61202e565b606091505b5080516000036120505760405162461bcd60e51b81526004016107ec90612ca6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a9d565b506001949350505050565b6001600160a01b0382166120d35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ec565b6000818152600260205260409020546001600160a01b0316156121385760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ec565b6001600160a01b0382166000908152600360205260408120805460019290612161908490612a2e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121cb90612878565b90600052602060002090601f0160209004810192826121ed5760008555612233565b82601f1061220657805160ff1916838001178555612233565b82800160010185558215612233579182015b82811115612233578251825591602001919060010190612218565b5061223f9291506122b7565b5090565b82805461224f90612878565b90600052602060002090601f0160209004810192826122715760008555612233565b82601f1061228a5782800160ff19823516178555612233565b82800160010185558215612233579182015b8281111561223357823582559160200191906001019061229c565b5b8082111561223f57600081556001016122b8565b803561ffff811681146122de57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612313576123136122e3565b604051601f8501601f19908116603f0116810190828211818310171561233b5761233b6122e3565b8160405280935085815286868601111561235457600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261237f57600080fd5b61238e838335602085016122f9565b9392505050565b80356001600160401b03811681146122de57600080fd5b600080600080608085870312156123c257600080fd5b6123cb856122cc565b935060208501356001600160401b03808211156123e757600080fd5b6123f38883890161236e565b945061240160408801612395565b9350606087013591508082111561241757600080fd5b506124248782880161236e565b91505092959194509250565b6001600160e01b03198116811461191057600080fd5b60006020828403121561245857600080fd5b813561238e81612430565b803580151581146122de57600080fd5b60006020828403121561248557600080fd5b61238e82612463565b60005b838110156124a9578181015183820152602001612491565b838111156109075750506000910152565b600081518084526124d281602086016020860161248e565b601f01601f19169290920160200192915050565b60208152600061238e60208301846124ba565b60006020828403121561250b57600080fd5b5035919050565b6001600160a01b038116811461191057600080fd5b6000806040838503121561253a57600080fd5b823561254581612512565b946020939093013593505050565b60006020828403121561256557600080fd5b813561238e81612512565b60008060006060848603121561258557600080fd5b833561259081612512565b925060208401356125a081612512565b929592945050506040919091013590565b6000602082840312156125c357600080fd5b81356001600160401b038111156125d957600080fd5b8201601f810184136125ea57600080fd5b611a9d848235602084016122f9565b60006020828403121561260b57600080fd5b61238e826122cc565b60008060006060848603121561262957600080fd5b612632846122cc565b925060208401356001600160401b0381111561264d57600080fd5b6126598682870161236e565b925050604084013590509250925092565b6000806040838503121561267d57600080fd5b823561268881612512565b915061269660208401612463565b90509250929050565b600080600080608085870312156126b557600080fd5b84356126c081612512565b935060208501356126d081612512565b92506040850135915060608501356001600160401b038111156126f257600080fd5b6124248782880161236e565b6000806040838503121561271157600080fd5b612545836122cc565b60008083601f84011261272c57600080fd5b5081356001600160401b0381111561274357600080fd5b60208301915083602082850101111561275b57600080fd5b9250929050565b60008060008060006080868803121561277a57600080fd5b612783866122cc565b945060208601356001600160401b038082111561279f57600080fd5b6127ab89838a0161236e565b95506127b960408901612395565b945060608801359150808211156127cf57600080fd5b506127dc8882890161271a565b969995985093965092949392505050565b6000806040838503121561280057600080fd5b823561280b81612512565b9150602083013561281b81612512565b809150509250929050565b60008060006040848603121561283b57600080fd5b612844846122cc565b925060208401356001600160401b0381111561285f57600080fd5b61286b8682870161271a565b9497909650939450505050565b600181811c9082168061288c57607f821691505b6020821081036128ac57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546128bf81612878565b600182811680156128d757600181146128e857612917565b60ff19841687528287019450612917565b8560005260208060002060005b8581101561290e5781548a8201529084019082016128f5565b50505082870194505b5050505092915050565b600061238e82846128b2565b61ffff8516815260806020820152600061294a60808301866124ba565b6001600160401b0385166040840152828103606084015261296b81856124ba565b979650505050505050565b6000825161298881846020870161248e565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a4157612a41612a18565b500190565b600060018201612a5857612a58612a18565b5060010190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612a8d908301866124ba565b84151560608401528281036080840152612aa781856124ba565b98975050505050505050565b60008060408385031215612ac657600080fd5b505080516020909101519092909150565b6000612ae382866128b2565b8451612af381836020890161248e565b8451910190612b0681836020880161248e565b0195945050505050565b61ffff871681526000602060c08184015260008854612b2e81612878565b8060c087015260e0600180841660008114612b505760018114612b6557612b93565b60ff1985168984015261010089019550612b93565b8d6000528660002060005b85811015612b8b5781548b8201860152908301908801612b70565b8a0184019650505b50505050508381036040850152612baa81896124ba565b915050612bc260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612be381856124ba565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000612c1d60808301876124ba565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215612c7457600080fd5b8251612c7f81612512565b6020939093015192949293505050565b600082821015612ca157612ca1612a18565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d1d57612d1d612cf8565b500490565b600082612d3157612d31612cf8565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7f908301846124ba565b9695505050505050565b600060208284031215612d9b57600080fd5b815161238e8161243056fea264697066735822122073410c0028e62eb73d9ad58b8199b5eaadd838b8f39047514935f9b4f65fce3f64736f6c634300080d0033697066733a2f2f516d614a656254365a47674b57516a35547a4a6e4e673279554842546e43455a693666667542644c68634a7a71732f697066733a2f2f516d62687431345367514d6d7953706d3842484c364377423437457268546148594c594c6345386d59456e695a7700000000000000000000000041bb40e3179b006354f0b82ecd309de72d5b96cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e7

Deployed Bytecode

0x6080604052600436106102195760003560e01c80637533d78811610123578063c6682862116100ab578063e8a3d4851161006f578063e8a3d48514610660578063e985e9c514610675578063eb8d72b7146106be578063f2fde38b146106de578063f43a22dc146106fe57600080fd5b8063c6682862146105c9578063c7afa661146105fa578063c87b56dd1461061a578063cf89fa031461063a578063d1deba1f1461064d57600080fd5b8063943fb872116100f2578063943fb8721461054157806395d89b4114610561578063a0712d6814610576578063a22cb46514610589578063b88d4fde146105a957600080fd5b80637533d788146104785780638da5cb5b146104985780638ee74912146104b6578063938e3d7b1461052157600080fd5b806323b872dd116101a65780635c975abb116101755780635c975abb146103f45780636352211e1461040e5780636c0360eb1461042e57806370a0823114610443578063715018a61461046357600080fd5b806323b872dd1461037f5780633ccfd60b1461039f57806342842e0e146103b457806355f804b3146103d457600080fd5b8063081812fc116101ed578063081812fc146102b7578063095ea7b3146102ef5780630f2cdd6c1461030f5780631c37a822146103325780631e7269c51461035257600080fd5b80621d35671461021e57806301ffc9a71461024057806302329a291461027557806306fdde0314610295575b600080fd5b34801561022a57600080fd5b5061023e6102393660046123ac565b610713565b005b34801561024c57600080fd5b5061026061025b366004612446565b61090d565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061023e610290366004612473565b61095f565b3480156102a157600080fd5b506102aa61099c565b60405161026c91906124e6565b3480156102c357600080fd5b506102d76102d23660046124f9565b610a2e565b6040516001600160a01b03909116815260200161026c565b3480156102fb57600080fd5b5061023e61030a366004612527565b610ac3565b34801561031b57600080fd5b50610324601e81565b60405190815260200161026c565b34801561033e57600080fd5b5061023e61034d3660046123ac565b610bd8565b34801561035e57600080fd5b5061032461036d366004612553565b600f6020526000908152604090205481565b34801561038b57600080fd5b5061023e61039a366004612570565b610c47565b3480156103ab57600080fd5b5061023e610c78565b3480156103c057600080fd5b5061023e6103cf366004612570565b610d31565b3480156103e057600080fd5b5061023e6103ef3660046125b1565b610d4c565b34801561040057600080fd5b506010546102609060ff1681565b34801561041a57600080fd5b506102d76104293660046124f9565b610d89565b34801561043a57600080fd5b506102aa610e00565b34801561044f57600080fd5b5061032461045e366004612553565b610e8e565b34801561046f57600080fd5b5061023e610f15565b34801561048457600080fd5b506102aa6104933660046125f9565b610f4b565b3480156104a457600080fd5b506006546001600160a01b03166102d7565b3480156104c257600080fd5b5061050c6104d1366004612614565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161026c565b34801561052d57600080fd5b5061023e61053c3660046125b1565b610f64565b34801561054d57600080fd5b5061023e61055c3660046124f9565b610fa1565b34801561056d57600080fd5b506102aa610fd0565b61023e6105843660046124f9565b610fdf565b34801561059557600080fd5b5061023e6105a436600461266a565b6111cf565b3480156105b557600080fd5b5061023e6105c436600461269f565b6111da565b3480156105d557600080fd5b506102aa60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561060657600080fd5b506103246106153660046126fe565b61120c565b34801561062657600080fd5b506102aa6106353660046124f9565b6112df565b61023e6106483660046126fe565b6113b9565b61023e61065b366004612762565b611696565b34801561066c57600080fd5b506102aa611823565b34801561068157600080fd5b506102606106903660046127ed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b5061023e6106d9366004612826565b611830565b3480156106ea57600080fd5b5061023e6106f9366004612553565b611878565b34801561070a57600080fd5b50610324600281565b6007546001600160a01b0316331461072a57600080fd5b61ffff84166000908152600960205260409020805461074890612878565b90508351148015610787575061ffff84166000908152600960205260409081902090516107759190612921565b60405180910390208380519060200120145b6107f55760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a8229061081e90879087908790879060040161292d565b600060405180830381600087803b15801561083857600080fd5b505af1925050508015610849575060015b610907576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516108939190612976565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906108fe90869086908690869061292d565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061093e57506001600160e01b03198216635b5e139f60e01b145b8061095957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146109895760405162461bcd60e51b81526004016107ec90612992565b6010805460ff1916911515919091179055565b6060600080546109ab90612878565b80601f01602080910402602001604051908101604052809291908181526020018280546109d790612878565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610aa75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ec565b506000908152600460205260409020546001600160a01b031690565b6000610ace82610d89565b9050806001600160a01b0316836001600160a01b031603610b3b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107ec565b336001600160a01b0382161480610b575750610b578133610690565b610bc95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ec565b610bd38383611913565b505050565b333014610c3b5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016107ec565b61090784848484611981565b610c5133826119ae565b610c6d5760405162461bcd60e51b81526004016107ec906129c7565b610bd3838383611aa5565b6006546001600160a01b03163314610ca25760405162461bcd60e51b81526004016107ec90612992565b6040514790600090339083908381818185875af1925050503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050905080610d2d5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b60448201526064016107ec565b5050565b610bd3838383604051806020016040528060008152506111da565b6006546001600160a01b03163314610d765760405162461bcd60e51b81526004016107ec90612992565b8051610d2d90600a9060208401906121bf565b6000818152600260205260408120546001600160a01b0316806109595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107ec565b600a8054610e0d90612878565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990612878565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b505050505081565b60006001600160a01b038216610ef95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107ec565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f3f5760405162461bcd60e51b81526004016107ec90612992565b610f496000611c41565b565b60096020526000908152604090208054610e0d90612878565b6006546001600160a01b03163314610f8e5760405162461bcd60e51b81526004016107ec90612992565b8051610d2d90600b9060208401906121bf565b6006546001600160a01b03163314610fcb5760405162461bcd60e51b81526004016107ec90612992565b600e55565b6060600180546109ab90612878565b601054339060ff161561102c5760405162461bcd60e51b81526020600482015260156024820152741b5bdbdb989a5c9914155392d4ce8814185d5cd959605a1b60448201526064016107ec565b600d5482600c5461103d9190612a2e565b11156110965760405162461bcd60e51b815260206004820152602260248201527f6d6f6f6e6269726450554e4b533a204d696e74206578636565647320737570706044820152616c7960f01b60648201526084016107ec565b81600210156110e75760405162461bcd60e51b815260206004820181905260248201527f6d6f6f6e6269726450554e4b533a20457863657373206d61782070657220747860448201526064016107ec565b6001600160a01b0381166000908152600f602052604090205461110b908390612a2e565b601e10156111675760405162461bcd60e51b8152602060048201526024808201527f6d6f6f6e6269726450554e4b533a20457863657373206d6178207065722077616044820152631b1b195d60e21b60648201526084016107ec565b6001600160a01b0381166000908152600f60205260408120805484929061118f908490612a2e565b90915550600090505b82811015610bd3576111bd82600c600081546111b390612a46565b9182905550611c93565b806111c781612a46565b915050611198565b610d2d338383611cad565b6111e433836119ae565b6112005760405162461bcd60e51b81526004016107ec906129c7565b61090784848484611d7b565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b909452600093919260019285916001600160a01b03909116906340a7bb1090611293908a90309089908790899060a601612a5f565b6040805180830381865afa1580156112af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d39190612ab3565b50979650505050505050565b6000818152600260205260409020546060906001600160a01b031661133e5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016107ec565b6000600a805461134d90612878565b9050116113695760405180602001604052806000815250610959565b600a61137483611dae565b60405180604001604052806005815260200164173539b7b760d91b8152506040516020016113a493929190612ad7565b60405160208183030381529060405292915050565b6113c281610d89565b6001600160a01b0316336001600160a01b03161461142d5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016107ec565b61ffff82166000908152600960205260408120805461144b90612878565b9050116114b15760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016107ec565b6114ba81611eae565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061153d908990309089908790899060a601612a5f565b6040805180830381865afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157d9190612ab3565b509050803410156116115760405162461bcd60e51b815260206004820152605260248201527f6d6f6f6e6269726450554e4b533a206d73672e76616c7565206e6f7420656e6f60448201527f75676820746f20636f766572206d6573736167654665652e2053656e642067616064820152717320666f72206d657373616765206665657360701b608482015260a4016107ec565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c580310092349261165c928c928b913391908b90600401612b10565b6000604051808303818588803b15801561167557600080fd5b505af1158015611689573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516116b7908790612976565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061173e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016107ec565b80548214801561176857508060010154838360405161175e929190612bf0565b6040518091039020145b6117b45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016107ec565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906117e99089908990899089908990600401612c00565b600060405180830381600087803b15801561180357600080fd5b505af1158015611817573d6000803e3d6000fd5b50505050505050505050565b600b8054610e0d90612878565b6006546001600160a01b0316331461185a5760405162461bcd60e51b81526004016107ec90612992565b61ffff83166000908152600960205260409020610907908383612243565b6006546001600160a01b031633146118a25760405162461bcd60e51b81526004016107ec90612992565b6001600160a01b0381166119075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ec565b61191081611c41565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061194882610d89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906119989190612c61565b915091506119a68282611c93565b505050505050565b6000818152600260205260408120546001600160a01b0316611a275760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ec565b6000611a3283610d89565b9050806001600160a01b0316846001600160a01b03161480611a6d5750836001600160a01b0316611a6284610a2e565b6001600160a01b0316145b80611a9d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab882610d89565b6001600160a01b031614611b1c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107ec565b6001600160a01b038216611b7e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107ec565b611b89600082611913565b6001600160a01b0383166000908152600360205260408120805460019290611bb2908490612c8f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611be0908490612a2e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d2d828260405180602001604052806000815250611f49565b816001600160a01b0316836001600160a01b031603611d0e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ec565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d86848484611aa5565b611d9284848484611f7c565b6109075760405162461bcd60e51b81526004016107ec90612ca6565b606081600003611dd55750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dff5780611de981612a46565b9150611df89050600a83612d0e565b9150611dd9565b6000816001600160401b03811115611e1957611e196122e3565b6040519080825280601f01601f191660200182016040528015611e43576020820181803683370190505b5090505b8415611a9d57611e58600183612c8f565b9150611e65600a86612d22565b611e70906030612a2e565b60f81b818381518110611e8557611e85612d36565b60200101906001600160f81b031916908160001a905350611ea7600a86612d0e565b9450611e47565b6000611eb982610d89565b9050611ec6600083611913565b6001600160a01b0381166000908152600360205260408120805460019290611eef908490612c8f565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611f53838361207d565b611f606000848484611f7c565b610bd35760405162461bcd60e51b81526004016107ec90612ca6565b60006001600160a01b0384163b1561207257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fc0903390899088908890600401612d4c565b6020604051808303816000875af1925050508015611ffb575060408051601f3d908101601f19168201909252611ff891810190612d89565b60015b612058573d808015612029576040519150601f19603f3d011682016040523d82523d6000602084013e61202e565b606091505b5080516000036120505760405162461bcd60e51b81526004016107ec90612ca6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a9d565b506001949350505050565b6001600160a01b0382166120d35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ec565b6000818152600260205260409020546001600160a01b0316156121385760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ec565b6001600160a01b0382166000908152600360205260408120805460019290612161908490612a2e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121cb90612878565b90600052602060002090601f0160209004810192826121ed5760008555612233565b82601f1061220657805160ff1916838001178555612233565b82800160010185558215612233579182015b82811115612233578251825591602001919060010190612218565b5061223f9291506122b7565b5090565b82805461224f90612878565b90600052602060002090601f0160209004810192826122715760008555612233565b82601f1061228a5782800160ff19823516178555612233565b82800160010185558215612233579182015b8281111561223357823582559160200191906001019061229c565b5b8082111561223f57600081556001016122b8565b803561ffff811681146122de57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612313576123136122e3565b604051601f8501601f19908116603f0116810190828211818310171561233b5761233b6122e3565b8160405280935085815286868601111561235457600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261237f57600080fd5b61238e838335602085016122f9565b9392505050565b80356001600160401b03811681146122de57600080fd5b600080600080608085870312156123c257600080fd5b6123cb856122cc565b935060208501356001600160401b03808211156123e757600080fd5b6123f38883890161236e565b945061240160408801612395565b9350606087013591508082111561241757600080fd5b506124248782880161236e565b91505092959194509250565b6001600160e01b03198116811461191057600080fd5b60006020828403121561245857600080fd5b813561238e81612430565b803580151581146122de57600080fd5b60006020828403121561248557600080fd5b61238e82612463565b60005b838110156124a9578181015183820152602001612491565b838111156109075750506000910152565b600081518084526124d281602086016020860161248e565b601f01601f19169290920160200192915050565b60208152600061238e60208301846124ba565b60006020828403121561250b57600080fd5b5035919050565b6001600160a01b038116811461191057600080fd5b6000806040838503121561253a57600080fd5b823561254581612512565b946020939093013593505050565b60006020828403121561256557600080fd5b813561238e81612512565b60008060006060848603121561258557600080fd5b833561259081612512565b925060208401356125a081612512565b929592945050506040919091013590565b6000602082840312156125c357600080fd5b81356001600160401b038111156125d957600080fd5b8201601f810184136125ea57600080fd5b611a9d848235602084016122f9565b60006020828403121561260b57600080fd5b61238e826122cc565b60008060006060848603121561262957600080fd5b612632846122cc565b925060208401356001600160401b0381111561264d57600080fd5b6126598682870161236e565b925050604084013590509250925092565b6000806040838503121561267d57600080fd5b823561268881612512565b915061269660208401612463565b90509250929050565b600080600080608085870312156126b557600080fd5b84356126c081612512565b935060208501356126d081612512565b92506040850135915060608501356001600160401b038111156126f257600080fd5b6124248782880161236e565b6000806040838503121561271157600080fd5b612545836122cc565b60008083601f84011261272c57600080fd5b5081356001600160401b0381111561274357600080fd5b60208301915083602082850101111561275b57600080fd5b9250929050565b60008060008060006080868803121561277a57600080fd5b612783866122cc565b945060208601356001600160401b038082111561279f57600080fd5b6127ab89838a0161236e565b95506127b960408901612395565b945060608801359150808211156127cf57600080fd5b506127dc8882890161271a565b969995985093965092949392505050565b6000806040838503121561280057600080fd5b823561280b81612512565b9150602083013561281b81612512565b809150509250929050565b60008060006040848603121561283b57600080fd5b612844846122cc565b925060208401356001600160401b0381111561285f57600080fd5b61286b8682870161271a565b9497909650939450505050565b600181811c9082168061288c57607f821691505b6020821081036128ac57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546128bf81612878565b600182811680156128d757600181146128e857612917565b60ff19841687528287019450612917565b8560005260208060002060005b8581101561290e5781548a8201529084019082016128f5565b50505082870194505b5050505092915050565b600061238e82846128b2565b61ffff8516815260806020820152600061294a60808301866124ba565b6001600160401b0385166040840152828103606084015261296b81856124ba565b979650505050505050565b6000825161298881846020870161248e565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a4157612a41612a18565b500190565b600060018201612a5857612a58612a18565b5060010190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612a8d908301866124ba565b84151560608401528281036080840152612aa781856124ba565b98975050505050505050565b60008060408385031215612ac657600080fd5b505080516020909101519092909150565b6000612ae382866128b2565b8451612af381836020890161248e565b8451910190612b0681836020880161248e565b0195945050505050565b61ffff871681526000602060c08184015260008854612b2e81612878565b8060c087015260e0600180841660008114612b505760018114612b6557612b93565b60ff1985168984015261010089019550612b93565b8d6000528660002060005b85811015612b8b5781548b8201860152908301908801612b70565b8a0184019650505b50505050508381036040850152612baa81896124ba565b915050612bc260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612be381856124ba565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000612c1d60808301876124ba565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215612c7457600080fd5b8251612c7f81612512565b6020939093015192949293505050565b600082821015612ca157612ca1612a18565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d1d57612d1d612cf8565b500490565b600082612d3157612d31612cf8565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7f908301846124ba565b9695505050505050565b600060208284031215612d9b57600080fd5b815161238e8161243056fea264697066735822122073410c0028e62eb73d9ad58b8199b5eaadd838b8f39047514935f9b4f65fce3f64736f6c634300080d0033

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

00000000000000000000000041bb40e3179b006354f0b82ecd309de72d5b96cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e7

-----Decoded View---------------
Arg [0] : _endpoint (address): 0x41Bb40E3179b006354f0b82eCd309DE72D5b96cB
Arg [1] : startId (uint256): 0
Arg [2] : _max (uint256): 999

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000041bb40e3179b006354f0b82ecd309de72d5b96cb
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e7


Deployed Bytecode Sourcemap

48330:5303:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13875:948;;;;;;;;;;-1:-1:-1;13875:948:0;;;;;:::i;:::-;;:::i;:::-;;35154:305;;;;;;;;;;-1:-1:-1;35154:305:0;;;;;:::i;:::-;;:::i;:::-;;;2587:14:1;;2580:22;2562:41;;2550:2;2535:18;35154:305:0;;;;;;;;52035:81;;;;;;;;;;-1:-1:-1;52035:81:0;;;;;:::i;:::-;;:::i;36099:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37658:221::-;;;;;;;;;;-1:-1:-1;37658:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4173:32:1;;;4155:51;;4143:2;4128:18;37658:221:0;4009:203:1;37181:411:0;;;;;;;;;;-1:-1:-1;37181:411:0;;;;;:::i;:::-;;:::i;48783:43::-;;;;;;;;;;;;48824:2;48783:43;;;;;4819:25:1;;;4807:2;4792:18;48783:43:0;4673:177:1;14831:356:0;;;;;;;;;;-1:-1:-1;14831:356:0;;;;;:::i;:::-;;:::i;48833:41::-;;;;;;;;;;-1:-1:-1;48833:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;38408:339;;;;;;;;;;-1:-1:-1;38408:339:0;;;;;:::i;:::-;;:::i;52904:209::-;;;;;;;;;;;;;:::i;38818:185::-;;;;;;;;;;-1:-1:-1;38818:185:0;;;;;:::i;:::-;;:::i;52124:100::-;;;;;;;;;;-1:-1:-1;52124:100:0;;;;;:::i;:::-;;:::i;48883:26::-;;;;;;;;;;-1:-1:-1;48883:26:0;;;;;;;;35793:239;;;;;;;;;;-1:-1:-1;35793:239:0;;;;;:::i;:::-;;:::i;48403:80::-;;;;;;;;;;;;;:::i;35523:208::-;;;;;;;;;;-1:-1:-1;35523:208:0;;;;;:::i;:::-;;:::i;12511:103::-;;;;;;;;;;;;;:::i;13717:51::-;;;;;;;;;;-1:-1:-1;13717:51:0;;;;;:::i;:::-;;:::i;11860:87::-;;;;;;;;;;-1:-1:-1;11933:6:0;;-1:-1:-1;;;;;11933:6:0;11860:87;;13620:90;;;;;;;;;;-1:-1:-1;13620:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7074:25:1;;;7130:2;7115:18;;7108:34;;;;7047:18;13620:90:0;6900:248:1;52232:116:0;;;;;;;;;;-1:-1:-1;52232:116:0;;;;;:::i;:::-;;:::i;52726:170::-;;;;;;;;;;-1:-1:-1;52726:170:0;;;;;:::i;:::-;;:::i;36268:104::-;;;;;;;;;;;;;:::i;49174:567::-;;;;;;:::i;:::-;;:::i;37951:155::-;;;;;;;;;;-1:-1:-1;37951:155:0;;;;;:::i;:::-;;:::i;39074:328::-;;;;;;;;;;-1:-1:-1;39074:328:0;;;;;:::i;:::-;;:::i;48580:46::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48580:46:0;;;;;51591:436;;;;;;;;;;-1:-1:-1;51591:436:0;;;;;:::i;:::-;;:::i;52356:362::-;;;;;;;;;;-1:-1:-1;52356:362:0;;;;;:::i;:::-;;:::i;49880:1703::-;;;;;;:::i;:::-;;:::i;15663:758::-;;;;;;:::i;:::-;;:::i;48490:83::-;;;;;;;;;;;;;:::i;38177:164::-;;;;;;;;;;-1:-1:-1;38177:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38298:25:0;;;38274:4;38298:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38177:164;16429:158;;;;;;;;;;-1:-1:-1;16429:158:0;;;;;:::i;:::-;;:::i;12769:201::-;;;;;;;;;;-1:-1:-1;12769:201:0;;;;;:::i;:::-;;:::i;48738:38::-;;;;;;;;;;;;48775:1;48738:38;;13875:948;14037:8;;-1:-1:-1;;;;;14037:8:0;14015:10;:31;14007:40;;;;;;14158:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;14136:11;:18;:61;:134;;;;-1:-1:-1;14237:32:0;;;;;;;:19;:32;;;;;;;14227:43;;;;14237:32;14227:43;:::i;:::-;;;;;;;;14211:11;14201:22;;;;;;:69;14136:134;14128:212;;;;-1:-1:-1;;;14128:212:0;;11892:2:1;14128:212:0;;;11874:21:1;11931:2;11911:18;;;11904:30;11970:34;11950:18;;;11943:62;-1:-1:-1;;;12021:18:1;;;12014:50;12081:19;;14128:212:0;;;;;;;;;14468:60;;-1:-1:-1;;;14468:60:0;;:4;;:16;;:60;;14485:11;;14498;;14511:6;;14519:8;;14468:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14464:352;;14675:52;;;;;;;;14690:8;:15;14675:52;;;;14717:8;14707:19;;;;;;14675:52;;;14624:14;:27;14639:11;14624:27;;;;;;;;;;;;;;;14652:11;14624:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14624:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;14747:57;;;;14761:11;;14774;;14665:6;;14795:8;;14747:57;:::i;:::-;;;;;;;;14464:352;13875:948;;;;:::o;35154:305::-;35256:4;-1:-1:-1;;;;;;35293:40:0;;-1:-1:-1;;;35293:40:0;;:105;;-1:-1:-1;;;;;;;35350:48:0;;-1:-1:-1;;;35350:48:0;35293:105;:158;;;-1:-1:-1;;;;;;;;;;28017:40:0;;;35415:36;35273:178;35154:305;-1:-1:-1;;35154:305:0:o;52035:81::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;52093:6:::1;:15:::0;;-1:-1:-1;;52093:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52035:81::o;36099:100::-;36153:13;36186:5;36179:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36099:100;:::o;37658:221::-;37734:7;41001:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41001:16:0;37754:73;;;;-1:-1:-1;;;37754:73:0;;13515:2:1;37754:73:0;;;13497:21:1;13554:2;13534:18;;;13527:30;13593:34;13573:18;;;13566:62;-1:-1:-1;;;13644:18:1;;;13637:42;13696:19;;37754:73:0;13313:408:1;37754:73:0;-1:-1:-1;37847:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37847:24:0;;37658:221::o;37181:411::-;37262:13;37278:23;37293:7;37278:14;:23::i;:::-;37262:39;;37326:5;-1:-1:-1;;;;;37320:11:0;:2;-1:-1:-1;;;;;37320:11:0;;37312:57;;;;-1:-1:-1;;;37312:57:0;;13928:2:1;37312:57:0;;;13910:21:1;13967:2;13947:18;;;13940:30;14006:34;13986:18;;;13979:62;-1:-1:-1;;;14057:18:1;;;14050:31;14098:19;;37312:57:0;13726:397:1;37312:57:0;10664:10;-1:-1:-1;;;;;37404:21:0;;;;:62;;-1:-1:-1;37429:37:0;37446:5;10664:10;38177:164;:::i;37429:37::-;37382:168;;;;-1:-1:-1;;;37382:168:0;;14330:2:1;37382:168:0;;;14312:21:1;14369:2;14349:18;;;14342:30;14408:34;14388:18;;;14381:62;14479:26;14459:18;;;14452:54;14523:19;;37382:168:0;14128:420:1;37382:168:0;37563:21;37572:2;37576:7;37563:8;:21::i;:::-;37251:341;37181:411;;:::o;14831:356::-;15000:10;15022:4;15000:27;14992:83;;;;-1:-1:-1;;;14992:83:0;;14755:2:1;14992:83:0;;;14737:21:1;14794:2;14774:18;;;14767:30;14833:34;14813:18;;;14806:62;-1:-1:-1;;;14884:18:1;;;14877:41;14935:19;;14992:83:0;14553:407:1;14992:83:0;15124:55;15136:11;15149;15162:6;15170:8;15124:10;:55::i;38408:339::-;38603:41;10664:10;38636:7;38603:18;:41::i;:::-;38595:103;;;;-1:-1:-1;;;38595:103:0;;;;;;;:::i;:::-;38711:28;38721:4;38727:2;38731:7;38711:9;:28::i;52904:209::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;53023:37:::1;::::0;52972:21:::1;::::0;52954:15:::1;::::0;10664:10;;52972:21;;52954:15;53023:37;52954:15;53023:37;52972:21;10664:10;53023:37:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53004:56;;;53079:7;53071:34;;;::::0;-1:-1:-1;;;53071:34:0;;15795:2:1;53071:34:0::1;::::0;::::1;15777:21:1::0;15834:2;15814:18;;;15807:30;-1:-1:-1;;;15853:18:1;;;15846:44;15907:18;;53071:34:0::1;15593:338:1::0;53071:34:0::1;52943:170;;52904:209::o:0;38818:185::-;38956:39;38973:4;38979:2;38983:7;38956:39;;;;;;;;;;;;:16;:39::i;52124:100::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;52198:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;35793:239::-:0;35865:7;35901:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35901:16:0;;35928:73;;;;-1:-1:-1;;;35928:73:0;;16138:2:1;35928:73:0;;;16120:21:1;16177:2;16157:18;;;16150:30;16216:34;16196:18;;;16189:62;-1:-1:-1;;;16267:18:1;;;16260:39;16316:19;;35928:73:0;15936:405:1;48403:80:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35523:208::-;35595:7;-1:-1:-1;;;;;35623:19:0;;35615:74;;;;-1:-1:-1;;;35615:74:0;;16548:2:1;35615:74:0;;;16530:21:1;16587:2;16567:18;;;16560:30;16626:34;16606:18;;;16599:62;-1:-1:-1;;;16677:18:1;;;16670:40;16727:19;;35615:74:0;16346:406:1;35615:74:0;-1:-1:-1;;;;;;35707:16:0;;;;;:9;:16;;;;;;;35523:208::o;12511:103::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;12576:30:::1;12603:1;12576:18;:30::i;:::-;12511:103::o:0;13717:51::-;;;;;;;;;;;;;;;;:::i;52232:116::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;52314:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;52726:170::-:0;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;52832:26:::1;:56:::0;52726:170::o;36268:104::-;36324:13;36357:7;36350:14;;;;;:::i;49174:567::-;49283:6;;10664:10;;49283:6;;49282:7;49274:41;;;;-1:-1:-1;;;49274:41:0;;16959:2:1;49274:41:0;;;16941:21:1;16998:2;16978:18;;;16971:30;-1:-1:-1;;;17017:18:1;;;17010:51;17078:18;;49274:41:0;16757:345:1;49274:41:0;49359:8;;49348:7;49334:11;;:21;;;;:::i;:::-;:33;;49326:80;;;;-1:-1:-1;;;49326:80:0;;17574:2:1;49326:80:0;;;17556:21:1;17613:2;17593:18;;;17586:30;17652:34;17632:18;;;17625:62;-1:-1:-1;;;17703:18:1;;;17696:32;17745:19;;49326:80:0;17372:398:1;49326:80:0;49439:7;48775:1;49425:21;;49417:67;;;;-1:-1:-1;;;49417:67:0;;17977:2:1;49417:67:0;;;17959:21:1;;;17996:18;;;17989:30;18055:34;18035:18;;;18028:62;18107:18;;49417:67:0;17775:356:1;49417:67:0;-1:-1:-1;;;;;49521:15:0;;;;;;:6;:15;;;;;;:25;;49539:7;;49521:25;:::i;:::-;48824:2;49503:43;;49495:92;;;;-1:-1:-1;;;49495:92:0;;18338:2:1;49495:92:0;;;18320:21:1;18377:2;18357:18;;;18350:30;18416:34;18396:18;;;18389:62;-1:-1:-1;;;18467:18:1;;;18460:34;18511:19;;49495:92:0;18136:400:1;49495:92:0;-1:-1:-1;;;;;49598:15:0;;;;;;:6;:15;;;;;:26;;49617:7;;49598:15;:26;;49617:7;;49598:26;:::i;:::-;;;;-1:-1:-1;49641:9:0;;-1:-1:-1;49637:97:0;49660:7;49656:1;:11;49637:97;;;49689:33;49699:7;49710:11;;49708:13;;;;;:::i;:::-;;;;;-1:-1:-1;49689:9:0;:33::i;:::-;49669:3;;;;:::i;:::-;;;;49637:97;;37951:155;38046:52;10664:10;38079:8;38089;38046:18;:52::i;39074:328::-;39249:41;10664:10;39282:7;39249:18;:41::i;:::-;39241:103;;;;-1:-1:-1;;;39241:103:0;;;;;;;:::i;:::-;39355:39;39369:4;39375:2;39379:7;39388:5;39355:13;:39::i;51591:436::-;51712:31;;;51723:10;51712:31;;;18855:51:1;18922:18;;;18915:34;;;51712:31:0;;;;;;;;;18828:18:1;;;51712:31:0;;51838:26;;-1:-1:-1;;;51812:53:0;;;19115:51:1;19182:11;;;;19175:27;;;;51812:53:0;;;;;;;;;;19218:12:1;;;51812:53:0;;;;51906:8;;-1:-1:-1;;;51906:77:0;;;-1:-1:-1;;51712:31:0;;51771:1;;-1:-1:-1;;;;;;;51906:8:0;;;;:21;;:77;;51928:8;;51946:4;;51712:31;;-1:-1:-1;;51812:53:0;;51906:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51876:107:0;51591:436;-1:-1:-1;;;;;;;51591:436:0:o;52356:362::-;40977:4;41001:16;;;:7;:16;;;;;;52422:13;;-1:-1:-1;;;;;41001:16:0;52448:51;;;;-1:-1:-1;;;52448:51:0;;20340:2:1;52448:51:0;;;20322:21:1;20379:2;20359:18;;;20352:30;-1:-1:-1;;;20398:18:1;;;20391:51;20459:18;;52448:51:0;20138:345:1;52448:51:0;52541:1;52523:7;52517:21;;;;;:::i;:::-;;;:25;:193;;;;;;;;;;;;;;;;;52599:7;52623:26;52640:8;52623:16;:26::i;:::-;52666:13;;;;;;;;;;;;;-1:-1:-1;;;52666:13:0;;;52566:128;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52510:200;52356:362;-1:-1:-1;;52356:362:0:o;49880:1703::-;50000:16;50008:7;50000;:16::i;:::-;-1:-1:-1;;;;;49986:30:0;:10;-1:-1:-1;;;;;49986:30:0;;49964:114;;;;-1:-1:-1;;;49964:114:0;;21264:2:1;49964:114:0;;;21246:21:1;21303:2;21283:18;;;21276:30;21342:34;21322:18;;;21315:62;-1:-1:-1;;;21393:18:1;;;21386:32;21435:19;;49964:114:0;21062:398:1;49964:114:0;50111:29;;;50150:1;50111:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;50089:136;;;;-1:-1:-1;;;50089:136:0;;21667:2:1;50089:136:0;;;21649:21:1;21706:2;21686:18;;;21679:30;21745:34;21725:18;;;21718:62;-1:-1:-1;;;21796:18:1;;;21789:44;21850:19;;50089:136:0;21465:410:1;50089:136:0;50305:14;50311:7;50305:5;:14::i;:::-;50416:31;;;50427:10;50416:31;;;18855:51:1;18922:18;;;18915:34;;;50416:31:0;;;;;;;;;18828:18:1;;;50416:31:0;;50644:26;;-1:-1:-1;;;50591:90:0;;;19115:51:1;19182:11;;;;19175:27;;;;50591:90:0;;;;;;;;;;19218:12:1;;;50591:90:0;;;;50860:8;;-1:-1:-1;;;50860:153:0;;;50416:31;;50550:1;;-1:-1:-1;;;;;;;50860:8:0;;:21;;:153;;50896:8;;50927:4;;50416:31;;-1:-1:-1;;50591:90:0;;50860:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50835:178;;;51061:10;51048:9;:23;;51026:155;;;;-1:-1:-1;;;51026:155:0;;22082:2:1;51026:155:0;;;22064:21:1;22121:2;22101:18;;;22094:30;22160:34;22140:18;;;22133:62;22231:34;22211:18;;;22204:62;-1:-1:-1;;;22282:19:1;;;22275:49;22341:19;;51026:155:0;21880:486:1;51026:155:0;51194:8;;51286:29;;;51194:8;51286:29;;;:19;:29;;;;;;51194:381;;-1:-1:-1;;;51194:381:0;;-1:-1:-1;;;;;51194:8:0;;;;:13;;51215:9;;51194:381;;51240:8;;51369:7;;51425:10;;51194:8;51535:13;;51194:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49953:1630;;;;49880:1703;;:::o;15663:758::-;15879:27;;;15844:32;15879:27;;;:14;:27;;;;;;:40;;;;15907:11;;15879:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15879:48:0;;;;;;;;;;15946:21;;;;15879:48;;-1:-1:-1;15938:86:0;;;;-1:-1:-1;;;15938:86:0;;24062:2:1;15938:86:0;;;24044:21:1;24101:2;24081:18;;;24074:30;24140:34;24120:18;;;24113:62;-1:-1:-1;;;24191:18:1;;;24184:36;24237:19;;15938:86:0;23860:402:1;15938:86:0;16062:23;;16043:42;;:90;;;;;16112:9;:21;;;16099:8;;16089:19;;;;;;;:::i;:::-;;;;;;;;:44;16043:90;16035:129;;;;-1:-1:-1;;;16035:129:0;;24745:2:1;16035:129:0;;;24727:21:1;24784:2;24764:18;;;24757:30;24823:28;24803:18;;;24796:56;24869:18;;16035:129:0;24543:350:1;16035:129:0;16238:1;16212:27;;;16250:21;;;:34;16353:60;;-1:-1:-1;;;16353:60:0;;:4;;:16;;:60;;16370:11;;16383;;16396:6;;16404:8;;;;16353:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15788:633;15663:758;;;;;:::o;48490:83::-;;;;;;;:::i;16429:158::-;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;16533:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;16565:14;;16533:46:::1;:::i;12769:201::-:0;11933:6;;-1:-1:-1;;;;;11933:6:0;10664:10;12080:23;12072:68;;;;-1:-1:-1;;;12072:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12858:22:0;::::1;12850:73;;;::::0;-1:-1:-1;;;12850:73:0;;25823:2:1;12850:73:0::1;::::0;::::1;25805:21:1::0;25862:2;25842:18;;;25835:30;25901:34;25881:18;;;25874:62;-1:-1:-1;;;25952:18:1;;;25945:36;25998:19;;12850:73:0::1;25621:402:1::0;12850:73:0::1;12934:28;12953:8;12934:18;:28::i;:::-;12769:201:::0;:::o;45058:174::-;45133:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45133:29:0;-1:-1:-1;;;;;45133:29:0;;;;;;;;:24;;45187:23;45133:24;45187:14;:23::i;:::-;-1:-1:-1;;;;;45178:46:0;;;;;;;;;;;45058:174;;:::o;53204:424::-;53400:14;53416:15;53460:8;53435:77;;;;;;;;;;;;:::i;:::-;53399:113;;;;53594:26;53604:6;53612:7;53594:9;:26::i;:::-;53369:259;;53204:424;;;;:::o;41206:348::-;41299:4;41001:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41001:16:0;41316:73;;;;-1:-1:-1;;;41316:73:0;;26555:2:1;41316:73:0;;;26537:21:1;26594:2;26574:18;;;26567:30;26633:34;26613:18;;;26606:62;-1:-1:-1;;;26684:18:1;;;26677:42;26736:19;;41316:73:0;26353:408:1;41316:73:0;41400:13;41416:23;41431:7;41416:14;:23::i;:::-;41400:39;;41469:5;-1:-1:-1;;;;;41458:16:0;:7;-1:-1:-1;;;;;41458:16:0;;:51;;;;41502:7;-1:-1:-1;;;;;41478:31:0;:20;41490:7;41478:11;:20::i;:::-;-1:-1:-1;;;;;41478:31:0;;41458:51;:87;;;-1:-1:-1;;;;;;38298:25:0;;;38274:4;38298:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41513:32;41450:96;41206:348;-1:-1:-1;;;;41206:348:0:o;44315:625::-;44474:4;-1:-1:-1;;;;;44447:31:0;:23;44462:7;44447:14;:23::i;:::-;-1:-1:-1;;;;;44447:31:0;;44439:81;;;;-1:-1:-1;;;44439:81:0;;26968:2:1;44439:81:0;;;26950:21:1;27007:2;26987:18;;;26980:30;27046:34;27026:18;;;27019:62;-1:-1:-1;;;27097:18:1;;;27090:35;27142:19;;44439:81:0;26766:401:1;44439:81:0;-1:-1:-1;;;;;44539:16:0;;44531:65;;;;-1:-1:-1;;;44531:65:0;;27374:2:1;44531:65:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:34;27432:18;;;27425:62;-1:-1:-1;;;27503:18:1;;;27496:34;27547:19;;44531:65:0;27172:400:1;44531:65:0;44713:29;44730:1;44734:7;44713:8;:29::i;:::-;-1:-1:-1;;;;;44755:15:0;;;;;;:9;:15;;;;;:20;;44774:1;;44755:15;:20;;44774:1;;44755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44786:13:0;;;;;;:9;:13;;;;;:18;;44803:1;;44786:13;:18;;44803:1;;44786:18;:::i;:::-;;;;-1:-1:-1;;44815:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44815:21:0;-1:-1:-1;;;;;44815:21:0;;;;;;;;;44854:27;;44815:16;;44854:27;;;;;;;37251:341;37181:411;;:::o;13130:191::-;13223:6;;;-1:-1:-1;;;;;13240:17:0;;;-1:-1:-1;;;;;;13240:17:0;;;;;;;13273:40;;13223:6;;;13240:17;13223:6;;13273:40;;13204:16;;13273:40;13193:128;13130:191;:::o;41896:110::-;41972:26;41982:2;41986:7;41972:26;;;;;;;;;;;;:9;:26::i;45374:315::-;45529:8;-1:-1:-1;;;;;45520:17:0;:5;-1:-1:-1;;;;;45520:17:0;;45512:55;;;;-1:-1:-1;;;45512:55:0;;27909:2:1;45512:55:0;;;27891:21:1;27948:2;27928:18;;;27921:30;27987:27;27967:18;;;27960:55;28032:18;;45512:55:0;27707:349:1;45512:55:0;-1:-1:-1;;;;;45578:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45578:46:0;;;;;;;;;;45640:41;;2562::1;;;45640::0;;2535:18:1;45640:41:0;;;;;;;45374:315;;;:::o;40284:::-;40441:28;40451:4;40457:2;40461:7;40441:9;:28::i;:::-;40488:48;40511:4;40517:2;40521:7;40530:5;40488:22;:48::i;:::-;40480:111;;;;-1:-1:-1;;;40480:111:0;;;;;;;:::i;8146:723::-;8202:13;8423:5;8432:1;8423:10;8419:53;;-1:-1:-1;;8450:10:0;;;;;;;;;;;;-1:-1:-1;;;8450:10:0;;;;;8146:723::o;8419:53::-;8497:5;8482:12;8538:78;8545:9;;8538:78;;8571:8;;;;:::i;:::-;;-1:-1:-1;8594:10:0;;-1:-1:-1;8602:2:0;8594:10;;:::i;:::-;;;8538:78;;;8626:19;8658:6;-1:-1:-1;;;;;8648:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8648:17:0;;8626:39;;8676:154;8683:10;;8676:154;;8710:11;8720:1;8710:11;;:::i;:::-;;-1:-1:-1;8779:10:0;8787:2;8779:5;:10;:::i;:::-;8766:24;;:2;:24;:::i;:::-;8753:39;;8736:6;8743;8736:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8736:56:0;;;;;;;;-1:-1:-1;8807:11:0;8816:2;8807:11;;:::i;:::-;;;8676:154;;43558:420;43618:13;43634:23;43649:7;43634:14;:23::i;:::-;43618:39;;43759:29;43776:1;43780:7;43759:8;:29::i;:::-;-1:-1:-1;;;;;43801:16:0;;;;;;:9;:16;;;;;:21;;43821:1;;43801:16;:21;;43821:1;;43801:21;:::i;:::-;;;;-1:-1:-1;;43840:16:0;;;;:7;:16;;;;;;43833:23;;-1:-1:-1;;;;;;43833:23:0;;;43874:36;43848:7;;43840:16;-1:-1:-1;;;;;43874:36:0;;;;;43840:16;;43874:36;52943:170:::1;;52904:209::o:0;42233:321::-;42363:18;42369:2;42373:7;42363:5;:18::i;:::-;42414:54;42445:1;42449:2;42453:7;42462:5;42414:22;:54::i;:::-;42392:154;;;;-1:-1:-1;;;42392:154:0;;;;;;;:::i;46254:799::-;46409:4;-1:-1:-1;;;;;46430:13:0;;18120:19;:23;46426:620;;46466:72;;-1:-1:-1;;;46466:72:0;;-1:-1:-1;;;;;46466:36:0;;;;;:72;;10664:10;;46517:4;;46523:7;;46532:5;;46466:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46466:72:0;;;;;;;;-1:-1:-1;;46466:72:0;;;;;;;;;;;;:::i;:::-;;;46462:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46708:6;:13;46725:1;46708:18;46704:272;;46751:60;;-1:-1:-1;;;46751:60:0;;;;;;;:::i;46704:272::-;46926:6;46920:13;46911:6;46907:2;46903:15;46896:38;46462:529;-1:-1:-1;;;;;;46589:51:0;-1:-1:-1;;;46589:51:0;;-1:-1:-1;46582:58:0;;46426:620;-1:-1:-1;47030:4:0;46254:799;;;;;;:::o;42890:439::-;-1:-1:-1;;;;;42970:16:0;;42962:61;;;;-1:-1:-1;;;42962:61:0;;29936:2:1;42962:61:0;;;29918:21:1;;;29955:18;;;29948:30;30014:34;29994:18;;;29987:62;30066:18;;42962:61:0;29734:356:1;42962:61:0;40977:4;41001:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41001:16:0;:30;43034:58;;;;-1:-1:-1;;;43034:58:0;;30297:2:1;43034:58:0;;;30279:21:1;30336:2;30316:18;;;30309:30;30375;30355:18;;;30348:58;30423:18;;43034:58:0;30095:352:1;43034:58:0;-1:-1:-1;;;;;43163:13:0;;;;;;:9;:13;;;;;:18;;43180:1;;43163:13;:18;;43180:1;;43163:18;:::i;:::-;;;;-1:-1:-1;;43192:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43192:21:0;-1:-1:-1;;;;;43192:21:0;;;;;;;;43231:33;;43192:16;;;43231:33;;43192:16;;43231:33;52943:170:::1;;52904:209::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:127::-;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:631;374:5;-1:-1:-1;;;;;445:2:1;437:6;434:14;431:40;;;451:18;;:::i;:::-;526:2;520:9;494:2;580:15;;-1:-1:-1;;576:24:1;;;602:2;572:33;568:42;556:55;;;626:18;;;646:22;;;623:46;620:72;;;672:18;;:::i;:::-;712:10;708:2;701:22;741:6;732:15;;771:6;763;756:22;811:3;802:6;797:3;793:16;790:25;787:45;;;828:1;825;818:12;787:45;878:6;873:3;866:4;858:6;854:17;841:44;933:1;926:4;917:6;909;905:19;901:30;894:41;;;;310:631;;;;;:::o;946:220::-;988:5;1041:3;1034:4;1026:6;1022:17;1018:27;1008:55;;1059:1;1056;1049:12;1008:55;1081:79;1156:3;1147:6;1134:20;1127:4;1119:6;1115:17;1081:79;:::i;:::-;1072:88;946:220;-1:-1:-1;;;946:220:1:o;1171:171::-;1238:20;;-1:-1:-1;;;;;1287:30:1;;1277:41;;1267:69;;1332:1;1329;1322:12;1347:684;1449:6;1457;1465;1473;1526:3;1514:9;1505:7;1501:23;1497:33;1494:53;;;1543:1;1540;1533:12;1494:53;1566:28;1584:9;1566:28;:::i;:::-;1556:38;;1645:2;1634:9;1630:18;1617:32;-1:-1:-1;;;;;1709:2:1;1701:6;1698:14;1695:34;;;1725:1;1722;1715:12;1695:34;1748:49;1789:7;1780:6;1769:9;1765:22;1748:49;:::i;:::-;1738:59;;1816:37;1849:2;1838:9;1834:18;1816:37;:::i;:::-;1806:47;;1906:2;1895:9;1891:18;1878:32;1862:48;;1935:2;1925:8;1922:16;1919:36;;;1951:1;1948;1941:12;1919:36;;1974:51;2017:7;2006:8;1995:9;1991:24;1974:51;:::i;:::-;1964:61;;;1347:684;;;;;;;:::o;2036:131::-;-1:-1:-1;;;;;;2110:32:1;;2100:43;;2090:71;;2157:1;2154;2147:12;2172:245;2230:6;2283:2;2271:9;2262:7;2258:23;2254:32;2251:52;;;2299:1;2296;2289:12;2251:52;2338:9;2325:23;2357:30;2381:5;2357:30;:::i;2614:160::-;2679:20;;2735:13;;2728:21;2718:32;;2708:60;;2764:1;2761;2754:12;2779:180;2835:6;2888:2;2876:9;2867:7;2863:23;2859:32;2856:52;;;2904:1;2901;2894:12;2856:52;2927:26;2943:9;2927:26;:::i;2964:258::-;3036:1;3046:113;3060:6;3057:1;3054:13;3046:113;;;3136:11;;;3130:18;3117:11;;;3110:39;3082:2;3075:10;3046:113;;;3177:6;3174:1;3171:13;3168:48;;;-1:-1:-1;;3212:1:1;3194:16;;3187:27;2964:258::o;3227:::-;3269:3;3307:5;3301:12;3334:6;3329:3;3322:19;3350:63;3406:6;3399:4;3394:3;3390:14;3383:4;3376:5;3372:16;3350:63;:::i;:::-;3467:2;3446:15;-1:-1:-1;;3442:29:1;3433:39;;;;3474:4;3429:50;;3227:258;-1:-1:-1;;3227:258:1:o;3490:220::-;3639:2;3628:9;3621:21;3602:4;3659:45;3700:2;3689:9;3685:18;3677:6;3659:45;:::i;3715:180::-;3774:6;3827:2;3815:9;3806:7;3802:23;3798:32;3795:52;;;3843:1;3840;3833:12;3795:52;-1:-1:-1;3866:23:1;;3715:180;-1:-1:-1;3715:180:1:o;4217:131::-;-1:-1:-1;;;;;4292:31:1;;4282:42;;4272:70;;4338:1;4335;4328:12;4353:315;4421:6;4429;4482:2;4470:9;4461:7;4457:23;4453:32;4450:52;;;4498:1;4495;4488:12;4450:52;4537:9;4524:23;4556:31;4581:5;4556:31;:::i;:::-;4606:5;4658:2;4643:18;;;;4630:32;;-1:-1:-1;;;4353:315:1:o;4855:247::-;4914:6;4967:2;4955:9;4946:7;4942:23;4938:32;4935:52;;;4983:1;4980;4973:12;4935:52;5022:9;5009:23;5041:31;5066:5;5041:31;:::i;5107:456::-;5184:6;5192;5200;5253:2;5241:9;5232:7;5228:23;5224:32;5221:52;;;5269:1;5266;5259:12;5221:52;5308:9;5295:23;5327:31;5352:5;5327:31;:::i;:::-;5377:5;-1:-1:-1;5434:2:1;5419:18;;5406:32;5447:33;5406:32;5447:33;:::i;:::-;5107:456;;5499:7;;-1:-1:-1;;;5553:2:1;5538:18;;;;5525:32;;5107:456::o;5568:450::-;5637:6;5690:2;5678:9;5669:7;5665:23;5661:32;5658:52;;;5706:1;5703;5696:12;5658:52;5746:9;5733:23;-1:-1:-1;;;;;5771:6:1;5768:30;5765:50;;;5811:1;5808;5801:12;5765:50;5834:22;;5887:4;5879:13;;5875:27;-1:-1:-1;5865:55:1;;5916:1;5913;5906:12;5865:55;5939:73;6004:7;5999:2;5986:16;5981:2;5977;5973:11;5939:73;:::i;6023:184::-;6081:6;6134:2;6122:9;6113:7;6109:23;6105:32;6102:52;;;6150:1;6147;6140:12;6102:52;6173:28;6191:9;6173:28;:::i;6435:460::-;6520:6;6528;6536;6589:2;6577:9;6568:7;6564:23;6560:32;6557:52;;;6605:1;6602;6595:12;6557:52;6628:28;6646:9;6628:28;:::i;:::-;6618:38;;6707:2;6696:9;6692:18;6679:32;-1:-1:-1;;;;;6726:6:1;6723:30;6720:50;;;6766:1;6763;6756:12;6720:50;6789:49;6830:7;6821:6;6810:9;6806:22;6789:49;:::i;:::-;6779:59;;;6885:2;6874:9;6870:18;6857:32;6847:42;;6435:460;;;;;:::o;7153:315::-;7218:6;7226;7279:2;7267:9;7258:7;7254:23;7250:32;7247:52;;;7295:1;7292;7285:12;7247:52;7334:9;7321:23;7353:31;7378:5;7353:31;:::i;:::-;7403:5;-1:-1:-1;7427:35:1;7458:2;7443:18;;7427:35;:::i;:::-;7417:45;;7153:315;;;;;:::o;7473:665::-;7568:6;7576;7584;7592;7645:3;7633:9;7624:7;7620:23;7616:33;7613:53;;;7662:1;7659;7652:12;7613:53;7701:9;7688:23;7720:31;7745:5;7720:31;:::i;:::-;7770:5;-1:-1:-1;7827:2:1;7812:18;;7799:32;7840:33;7799:32;7840:33;:::i;:::-;7892:7;-1:-1:-1;7946:2:1;7931:18;;7918:32;;-1:-1:-1;8001:2:1;7986:18;;7973:32;-1:-1:-1;;;;;8017:30:1;;8014:50;;;8060:1;8057;8050:12;8014:50;8083:49;8124:7;8115:6;8104:9;8100:22;8083:49;:::i;8143:252::-;8210:6;8218;8271:2;8259:9;8250:7;8246:23;8242:32;8239:52;;;8287:1;8284;8277:12;8239:52;8310:28;8328:9;8310:28;:::i;8400:347::-;8451:8;8461:6;8515:3;8508:4;8500:6;8496:17;8492:27;8482:55;;8533:1;8530;8523:12;8482:55;-1:-1:-1;8556:20:1;;-1:-1:-1;;;;;8588:30:1;;8585:50;;;8631:1;8628;8621:12;8585:50;8668:4;8660:6;8656:17;8644:29;;8720:3;8713:4;8704:6;8696;8692:19;8688:30;8685:39;8682:59;;;8737:1;8734;8727:12;8682:59;8400:347;;;;;:::o;8752:773::-;8856:6;8864;8872;8880;8888;8941:3;8929:9;8920:7;8916:23;8912:33;8909:53;;;8958:1;8955;8948:12;8909:53;8981:28;8999:9;8981:28;:::i;:::-;8971:38;;9060:2;9049:9;9045:18;9032:32;-1:-1:-1;;;;;9124:2:1;9116:6;9113:14;9110:34;;;9140:1;9137;9130:12;9110:34;9163:49;9204:7;9195:6;9184:9;9180:22;9163:49;:::i;:::-;9153:59;;9231:37;9264:2;9253:9;9249:18;9231:37;:::i;:::-;9221:47;;9321:2;9310:9;9306:18;9293:32;9277:48;;9350:2;9340:8;9337:16;9334:36;;;9366:1;9363;9356:12;9334:36;;9405:60;9457:7;9446:8;9435:9;9431:24;9405:60;:::i;:::-;8752:773;;;;-1:-1:-1;8752:773:1;;-1:-1:-1;9484:8:1;;9379:86;8752:773;-1:-1:-1;;;8752:773:1:o;9530:388::-;9598:6;9606;9659:2;9647:9;9638:7;9634:23;9630:32;9627:52;;;9675:1;9672;9665:12;9627:52;9714:9;9701:23;9733:31;9758:5;9733:31;:::i;:::-;9783:5;-1:-1:-1;9840:2:1;9825:18;;9812:32;9853:33;9812:32;9853:33;:::i;:::-;9905:7;9895:17;;;9530:388;;;;;:::o;9923:481::-;10001:6;10009;10017;10070:2;10058:9;10049:7;10045:23;10041:32;10038:52;;;10086:1;10083;10076:12;10038:52;10109:28;10127:9;10109:28;:::i;:::-;10099:38;;10188:2;10177:9;10173:18;10160:32;-1:-1:-1;;;;;10207:6:1;10204:30;10201:50;;;10247:1;10244;10237:12;10201:50;10286:58;10336:7;10327:6;10316:9;10312:22;10286:58;:::i;:::-;9923:481;;10363:8;;-1:-1:-1;10260:84:1;;-1:-1:-1;;;;9923:481:1:o;10409:380::-;10488:1;10484:12;;;;10531;;;10552:61;;10606:4;10598:6;10594:17;10584:27;;10552:61;10659:2;10651:6;10648:14;10628:18;10625:38;10622:161;;10705:10;10700:3;10696:20;10693:1;10686:31;10740:4;10737:1;10730:15;10768:4;10765:1;10758:15;10622:161;;10409:380;;;:::o;10794:692::-;10843:3;10884:5;10878:12;10913:36;10939:9;10913:36;:::i;:::-;10968:1;10985:18;;;11012:104;;;;11130:1;11125:355;;;;10978:502;;11012:104;-1:-1:-1;;11045:24:1;;11033:37;;11090:16;;;;-1:-1:-1;11012:104:1;;11125:355;11156:5;11153:1;11146:16;11185:4;11230:2;11227:1;11217:16;11255:1;11269:165;11283:6;11280:1;11277:13;11269:165;;;11361:14;;11348:11;;;11341:35;11404:16;;;;11298:10;;11269:165;;;11273:3;;;11463:6;11458:3;11454:16;11447:23;;10978:502;;;;;10794:692;;;;:::o;11491:194::-;11617:3;11642:37;11675:3;11667:6;11642:37;:::i;12111:557::-;12368:6;12360;12356:19;12345:9;12338:38;12412:3;12407:2;12396:9;12392:18;12385:31;12319:4;12439:46;12480:3;12469:9;12465:19;12457:6;12439:46;:::i;:::-;-1:-1:-1;;;;;12525:6:1;12521:31;12516:2;12505:9;12501:18;12494:59;12601:9;12593:6;12589:22;12584:2;12573:9;12569:18;12562:50;12629:33;12655:6;12647;12629:33;:::i;:::-;12621:41;12111:557;-1:-1:-1;;;;;;;12111:557:1:o;12673:274::-;12802:3;12840:6;12834:13;12856:53;12902:6;12897:3;12890:4;12882:6;12878:17;12856:53;:::i;:::-;12925:16;;;;;12673:274;-1:-1:-1;;12673:274:1:o;12952:356::-;13154:2;13136:21;;;13173:18;;;13166:30;13232:34;13227:2;13212:18;;13205:62;13299:2;13284:18;;12952:356::o;14965:413::-;15167:2;15149:21;;;15206:2;15186:18;;;15179:30;15245:34;15240:2;15225:18;;15218:62;-1:-1:-1;;;15311:2:1;15296:18;;15289:47;15368:3;15353:19;;14965:413::o;17107:127::-;17168:10;17163:3;17159:20;17156:1;17149:31;17199:4;17196:1;17189:15;17223:4;17220:1;17213:15;17239:128;17279:3;17310:1;17306:6;17303:1;17300:13;17297:39;;;17316:18;;:::i;:::-;-1:-1:-1;17352:9:1;;17239:128::o;18541:135::-;18580:3;18601:17;;;18598:43;;18621:18;;:::i;:::-;-1:-1:-1;18668:1:1;18657:13;;18541:135::o;19241:642::-;19522:6;19510:19;;19492:38;;-1:-1:-1;;;;;19566:32:1;;19561:2;19546:18;;19539:60;19586:3;19630:2;19615:18;;19608:31;;;-1:-1:-1;;19662:46:1;;19688:19;;19680:6;19662:46;:::i;:::-;19758:6;19751:14;19744:22;19739:2;19728:9;19724:18;19717:50;19816:9;19808:6;19804:22;19798:3;19787:9;19783:19;19776:51;19844:33;19870:6;19862;19844:33;:::i;:::-;19836:41;19241:642;-1:-1:-1;;;;;;;;19241:642:1:o;19888:245::-;19967:6;19975;20028:2;20016:9;20007:7;20003:23;19999:32;19996:52;;;20044:1;20041;20034:12;19996:52;-1:-1:-1;;20067:16:1;;20123:2;20108:18;;;20102:25;20067:16;;20102:25;;-1:-1:-1;19888:245:1:o;20488:569::-;20712:3;20740:37;20773:3;20765:6;20740:37;:::i;:::-;20806:6;20800:13;20822:52;20867:6;20863:2;20856:4;20848:6;20844:17;20822:52;:::i;:::-;20936:13;;20896:15;;;20958:57;20936:13;20896:15;20992:4;20980:17;;20958:57;:::i;:::-;21031:20;;20488:569;-1:-1:-1;;;;;20488:569:1:o;22371:1484::-;22717:6;22709;22705:19;22694:9;22687:38;22668:4;22744:2;22782:3;22777:2;22766:9;22762:18;22755:31;22806:1;22839:6;22833:13;22869:36;22895:9;22869:36;:::i;:::-;22942:6;22936:3;22925:9;22921:19;22914:35;22968:3;22990:1;23022:2;23011:9;23007:18;23039:1;23034:122;;;;23170:1;23165:354;;;;23000:519;;23034:122;-1:-1:-1;;23082:24:1;;23062:18;;;23055:52;23142:3;23127:19;;;-1:-1:-1;23034:122:1;;23165:354;23196:6;23193:1;23186:17;23244:2;23241:1;23231:16;23269:1;23283:180;23297:6;23294:1;23291:13;23283:180;;;23390:14;;23366:17;;;23362:26;;23355:50;23433:16;;;;23312:10;;23283:180;;;23487:17;;23483:26;;;-1:-1:-1;;23000:519:1;;;;;;23564:9;23559:3;23555:19;23550:2;23539:9;23535:18;23528:47;23598:30;23624:3;23616:6;23598:30;:::i;:::-;23584:44;;;23637:46;23679:2;23668:9;23664:18;23656:6;-1:-1:-1;;;;;3966:31:1;3954:44;;3900:104;23637:46;-1:-1:-1;;;;;3966:31:1;;23734:3;23719:19;;3954:44;23788:9;23780:6;23776:22;23770:3;23759:9;23755:19;23748:51;23816:33;23842:6;23834;23816:33;:::i;:::-;23808:41;22371:1484;-1:-1:-1;;;;;;;;;22371:1484:1:o;24267:271::-;24450:6;24442;24437:3;24424:33;24406:3;24476:16;;24501:13;;;24476:16;24267:271;-1:-1:-1;24267:271:1:o;24898:718::-;25165:6;25157;25153:19;25142:9;25135:38;25209:3;25204:2;25193:9;25189:18;25182:31;25116:4;25236:46;25277:3;25266:9;25262:19;25254:6;25236:46;:::i;:::-;-1:-1:-1;;;;;25322:6:1;25318:31;25313:2;25302:9;25298:18;25291:59;25398:9;25390:6;25386:22;25381:2;25370:9;25366:18;25359:50;25433:6;25425;25418:22;25487:6;25479;25474:2;25466:6;25462:15;25449:45;25540:1;25535:2;25526:6;25518;25514:19;25510:28;25503:39;25607:2;25600;25596:7;25591:2;25583:6;25579:15;25575:29;25567:6;25563:42;25559:51;25551:59;;;24898:718;;;;;;;;:::o;26028:320::-;26115:6;26123;26176:2;26164:9;26155:7;26151:23;26147:32;26144:52;;;26192:1;26189;26182:12;26144:52;26224:9;26218:16;26243:31;26268:5;26243:31;:::i;:::-;26338:2;26323:18;;;;26317:25;26293:5;;26317:25;;-1:-1:-1;;;26028:320:1:o;27577:125::-;27617:4;27645:1;27642;27639:8;27636:34;;;27650:18;;:::i;:::-;-1:-1:-1;27687:9:1;;27577:125::o;28061:414::-;28263:2;28245:21;;;28302:2;28282:18;;;28275:30;28341:34;28336:2;28321:18;;28314:62;-1:-1:-1;;;28407:2:1;28392:18;;28385:48;28465:3;28450:19;;28061:414::o;28480:127::-;28541:10;28536:3;28532:20;28529:1;28522:31;28572:4;28569:1;28562:15;28596:4;28593:1;28586:15;28612:120;28652:1;28678;28668:35;;28683:18;;:::i;:::-;-1:-1:-1;28717:9:1;;28612:120::o;28737:112::-;28769:1;28795;28785:35;;28800:18;;:::i;:::-;-1:-1:-1;28834:9:1;;28737:112::o;28854:127::-;28915:10;28910:3;28906:20;28903:1;28896:31;28946:4;28943:1;28936:15;28970:4;28967:1;28960:15;28986:489;-1:-1:-1;;;;;29255:15:1;;;29237:34;;29307:15;;29302:2;29287:18;;29280:43;29354:2;29339:18;;29332:34;;;29402:3;29397:2;29382:18;;29375:31;;;29180:4;;29423:46;;29449:19;;29441:6;29423:46;:::i;:::-;29415:54;28986:489;-1:-1:-1;;;;;;28986:489:1:o;29480:249::-;29549:6;29602:2;29590:9;29581:7;29577:23;29573:32;29570:52;;;29618:1;29615;29608:12;29570:52;29650:9;29644:16;29669:30;29693:5;29669:30;:::i

Swarm Source

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