ETH Price: $3,362.45 (-2.38%)
Gas: 2 Gwei

Token

TinyNinjas (TN)
 

Overview

Max Total Supply

0 TN

Holders

2,202

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
19921111.eth
Balance
2 TN
0xdE4E81A778b99e8412ea3a3F765EB6179b87f198
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:
TinyNinjas

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkOOOOOOOOOOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx:..............:kOOOOOOOOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdol'..............,lodkOOOOOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo. .;llllllllllllll;. .oOOOOOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx:,,'',:llllllllllllll:,'',,:xOOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo. .,:::::;:::::;;:::::::,. .lxxkOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo.                       .,:,...lOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo.     .;;;;;.  .;;;,,,,,'''...',;;oOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo.    .ckkOOk;  ;kOxdddddc. .;c:.  ;kO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo. .,ccodddddlcclddddodddc. .;c:.  ;kO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo.  ',;loooddoodooddddc;;'  .;c:.  ;kO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkOo.    .;oooooooooooooo,     .;c:.  ;kO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo,.,:llllc,...............  .;l:...;lldOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc  .oOOkkx;.................':l:,.,oOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc  .oOkxdddooooooooooooooooo:. .okOOOOOOO
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOdc::,,''',coddddddddoddxxxxkd:;,,,;dOOOOO
//OOOOOOOOOOOOOOOOOkdooooooooooodkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOd,..   ':clodddddodoooooolc:;..'oOOOOO
//OOOOOOOOOOOOOOOOOx,           ,xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkl.    .;oodddddo:.       .lkkOOOOOO
//OOOOOOOOOOOxc;;;;;:ccccccccccc:;;lkOOOOOOOOOOOOOOOOOOOOOd:;;;;;;;'   .',coodddddoc,,'',.   ';;;;;okO
//OOOOOOOOkxdl'....'xNNNNNNNNNNNx'.,odxkOOOOOOOOOOOOOOOOOOc            ,cccccccccccccclodc..       ;kO
//OOOOOOOOl..'okkkkO0KKKKKKKKKKK0Okc..'dOOOOOOOOOOOOOOOOOOc  .',,,,.                 .'ldollc,,'.  ;kO
//OOOOOxc::;;;clccccccccccccclccclc'  .oOOOOOOOOOOOOOOOOOOd;,'...,;,...   .,,,,,,,,,,,,,,,,;;;;,.  ;kO
//OOkkxc. ,xOd'                       .oOOOOOOOOOOOOOOOOOOOOOc. .',,,,'. .lOOOOOOOOOOOc.    .','.  ;kO
//Okc..;odc'.,dkkkkkoc:.  .:cccc'     .oOOOOOOOOOOOOOOOOOOOOOkdoc.    .;odkOOOOOOOOOOOkdooooc.     ;kO
//Ok;  ,kKl  .kNNNNX0Oxc,,lkkkkko;,.  .oOOOOkdllxOOOOOOOOOOOOOOOd;....,oOOOOOOOOOOOOOOOOOOOOd;....'lkO
//Ok;  ,kKl  .kXXNNNNNNNXXXNNNNNXXKo. .oOOOOx' .lOOOOOOOOOOOOOOOOOkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkOOO
//Ok;  ,kKl.  .,c0NNNNNNNNNNNNNNk;,;clokOOOOx'  cOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//Okc..,od;     .okkkkkkkkkkkkkkc  .loooooooc.  ;oooooooooooooooooodkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//OOkkxc.                                                          .dOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//OOOOOdc:'  .:oooooooooooooooooooooool:;;;;,.  'cccccccccccccccccc:;,;oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//OOOOOOOOc  .kNNXXXXXXNNNNNNNNNX00000Oxddddl.  :dxxxxxxxxxxxxxxxxkl'..lOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//OOOOOOOOc  .kNXkxxxxkKNNNNNNNNx'.....:llddl.   ..................'ldxkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//OOOOOOOOd:;:ccclooddxKNNNNXklcccc'   ...','   .;;;;;;;;;;;;;;;;;;cxOOOOOOOOOOOOOOxoodOOOOOOOOOOOOOOO
//OOOOOOOOkkkl. .:lloodOKKKK0c. :KNd.          .cOOOOOOOOOOOOOOOOkkkOOOOOOOOOOOOkkkd:;lxkkOOOOOOOOOOOO
//OOOOOOOOl'.,okO0KO;.......'ckk0XNo. .:ooooc. .cOOOOOOOOOOOOOOOxc;cxOOOOOOOOOOOdc:oxkdc:lxOOOOOOOOOOO
//OOkxxdc:;;,cOX0dol:,,,,,.  cKXXXXo. .oOOOOkc,;dOOOOOOOOOOOOxoolllllookOOOOOOOOdlloddollokOOkxkkOOOOO
//OOxoo;  'k0000o.  cOOOOk;  :O000Oc  .oOOOOOOOOOOOOOOOOOOOOOo,':x0x:',oOOOOOOOOOOOd:;lkOOOOkdodkOOOOO
//dddoo;   .''''.   cOOxdd,  .'''''.  .oOkxdxkOOOOOOOOOOOOOOOkddoccccclodxkOOOOOOOOdc:ldxxxxddodkOOOOO
//ooooo:............ckxdoo;...........'okxdodxkkkkkkkkkkkkkkkkkkdc;:loooodxkkkkkkkkdllloooooooodxkkkkk
//oooooollllllllllllooooooollllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
//ooolllllllllllloooooolllllllllloooooollllllllloooooooooooooooooooolllllllllllloooooooooooooooooooooo
//oolccc::::::cccloooolccc::::cccloooolccc::::::loooooooooooooooooolccc:::::::cclooooooooooooooooooooo
//ccccc;''''',:ccccccccccc;'';ccccccccccc:,''''':ccccccccccccccccccccc:,''''';cccccccccccccccccccccccc
//;;::::;,,'.',;;;;;;;;:::,'',;;;;;;;;;;;,'....',;;;;;;;;;;;;;;;;;;;;;,'....',;;;;;;;;;;;;;;;;;;;;;;;;
//.',:::;;,'..........',;;,''............'''''...............'''''.......'''''........'''''........'''
//.',::;'''.........'..''''...'..........';:;,...............,;:;'.......',;;,'.......,;:;'.......',;;
//.',,,,'.',,'''...........'.............',;,'.'',,''....'...,::;,,''....',;,''....',,,,;,'.......',,,
//.......',;:;'........''''.....''''...........',:;,''''.....,;::::;'..........'...,;:,'..'..''''''..'
//........'''''...'...',;;,'....';;,'...........''',;;;,'....''''''''..............'''''....';;;;;;'..
//....................';::,'.'..,::,'.............',;::,'.............'.....................';:::::,..

// SPDX-License-Identifier: BUSL-1.1
// File: contracts/interfaces/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,
        uint256 _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: contracts/interfaces/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,
        uint256 _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 (uint256 nativeFee, uint256 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,
        uint256 _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: contracts/interfaces/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: @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 Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

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

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

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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 v4.4.1 (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");

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

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

        emit Transfer(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);
    }

    /**
     * @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 of token that is not own"
        );
        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);
    }

    /**
     * @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 {}
}

// File: contracts/NonblockingReceiver.sol

pragma solidity ^0.8.6;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {
    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint256 payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint256 => 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
    ) internal virtual;

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

pragma solidity ^0.8.7;

contract TinyNinjas is Ownable, ERC721, NonblockingReceiver {
    address public _owner;
    string private baseURI;
    uint256 nextTokenId = 0;
    uint256 MAX_MINT_Amount = 5000;
    uint256 gasForDestinationLzReceive = 2022;
    bool public saleIsActive;

    constructor(string memory baseURI_, address _layerZeroEndpoint)
        ERC721("TinyNinjas", "TN")
    {
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
        baseURI = baseURI_;
        saleIsActive = false;
    }

    // mint function
    // you can choose to mint 1 or 2
    // mint is free, but payments are accepted
    function mint(uint8 numTokens) external payable {
        require(saleIsActive, "Sale hasn't not started yet");
        require(balanceOf(msg.sender) < 2, "Each address may only own 2 NFTs");
        require(numTokens < 3, "Tiny Ninjas: Max 2 NFTs per transaction");
        require(
            nextTokenId + numTokens <= MAX_MINT_Amount,
            "Tiny Ninjas: Mint exceeds supply"
        );
        _safeMint(msg.sender, ++nextTokenId);
        if (numTokens == 2) {
            _safeMint(msg.sender, ++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,
            "Tiny Ninjas: 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 setBaseURI(string memory URI) external onlyOwner {
        baseURI = URI;
    }

    function donate() external payable {
        // thank you
    }

    // This allows the devs to receive kind donations
    function withdraw(uint256 amt) external onlyOwner {
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "Tiny Ninjas: Failed to withdraw");
    }

    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

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

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

    function toggleSale() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"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":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"donate","outputs":[],"stateMutability":"payable","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":"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":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","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":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c55611388600d556107e6600e553480156200002257600080fd5b5060405162002f6038038062002f60833981016040819052620000459162000233565b6040518060400160405280600a81526020016954696e794e696e6a617360b01b815250604051806040016040528060028152602001612a2760f11b8152506200009d620000976200011c60201b60201c565b62000120565b8151620000b290600190602085019062000170565b508051620000c890600290602084019062000170565b5050600a8054336001600160a01b031991821617909155600780549091166001600160a01b0384161790555081516200010990600b90602085019062000170565b5050600f805460ff191690555062000377565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200017e9062000324565b90600052602060002090601f016020900481019282620001a25760008555620001ed565b82601f10620001bd57805160ff1916838001178555620001ed565b82800160010185558215620001ed579182015b82811115620001ed578251825591602001919060010190620001d0565b50620001fb929150620001ff565b5090565b5b80821115620001fb576000815560010162000200565b80516001600160a01b03811681146200022e57600080fd5b919050565b600080604083850312156200024757600080fd5b82516001600160401b03808211156200025f57600080fd5b818501915085601f8301126200027457600080fd5b81518181111562000289576200028962000361565b604051601f8201601f19908116603f01168101908382118183101715620002b457620002b462000361565b81604052828152602093508884848701011115620002d157600080fd5b600091505b82821015620002f55784820184015181830185015290830190620002d6565b82821115620003075760008484830101525b95506200031991505085820162000216565b925050509250929050565b600181811c908216806200033957607f821691505b602082108114156200035b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612bd980620003876000396000f3fe6080604052600436106101cc5760003560e01c80638da5cb5b116100f7578063c87b56dd11610095578063eb8d244411610064578063eb8d244414610585578063eb8d72b71461059f578063ed88c68e146101f1578063f2fde38b146105bf57600080fd5b8063c87b56dd146104f6578063cf89fa0314610516578063d1deba1f14610529578063e985e9c51461053c57600080fd5b806395d89b41116100d157806395d89b4114610481578063a22cb46514610496578063b2bdfa7b146104b6578063b88d4fde146104d657600080fd5b80638da5cb5b146103d85780638ee74912146103f6578063943fb8721461046157600080fd5b80632e1a7d4d1161016f5780636ecd23061161013e5780636ecd23061461036257806370a08231146103755780637533d788146103a35780637d8966e4146103c357600080fd5b80632e1a7d4d146102e257806342842e0e1461030257806355f804b3146103225780636352211e1461034257600080fd5b8063081812fc116101ab578063081812fc1461024a578063095ea7b3146102825780631c37a822146102a257806323b872dd146102c257600080fd5b80621d3567146101d157806301ffc9a7146101f357806306fdde0314610228575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046125af565b6105df565b005b3480156101ff57600080fd5b5061021361020e3660046123db565b6107e3565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610835565b60405161021f91906127d9565b34801561025657600080fd5b5061026a610265366004612644565b6108c7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506101f161029d3660046123af565b61095c565b3480156102ae57600080fd5b506101f16102bd3660046125af565b610a72565b3480156102ce57600080fd5b506101f16102dd3660046122cf565b610ae1565b3480156102ee57600080fd5b506101f16102fd366004612644565b610b5c565b34801561030e57600080fd5b506101f161031d3660046122cf565b610c4b565b34801561032e57600080fd5b506101f161033d366004612415565b610c66565b34801561034e57600080fd5b5061026a61035d366004612644565b610cc1565b6101f1610370366004612681565b610d38565b34801561038157600080fd5b5061039561039036600461224b565b610ee6565b60405190815260200161021f565b3480156103af57600080fd5b5061023d6103be36600461245e565b610f6d565b3480156103cf57600080fd5b506101f1611007565b3480156103e457600080fd5b506000546001600160a01b031661026a565b34801561040257600080fd5b5061044c6104113660046124cc565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161021f565b34801561046d57600080fd5b506101f161047c366004612644565b611063565b34801561048d57600080fd5b5061023d6110b0565b3480156104a257600080fd5b506101f16104b136600461237c565b6110bf565b3480156104c257600080fd5b50600a5461026a906001600160a01b031681565b3480156104e257600080fd5b506101f16104f1366004612310565b6110ca565b34801561050257600080fd5b5061023d610511366004612644565b611146565b6101f1610524366004612628565b611221565b6101f1610537366004612523565b61150b565b34801561054857600080fd5b50610213610557366004612296565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561059157600080fd5b50600f546102139060ff1681565b3480156105ab57600080fd5b506101f16105ba366004612479565b611699565b3480156105cb57600080fd5b506101f16105da36600461224b565b6116ff565b6007546001600160a01b031633146105f657600080fd5b61ffff84166000908152600960205260409020805461061490612a96565b90508351148015610653575061ffff841660009081526009602052604090819020905161064191906126fc565b60405180910390208380519060200120145b6106ca5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906106f39087908790879087906004016128fd565b600060405180830381600087803b15801561070d57600080fd5b505af192505050801561071e575060015b6107dd576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161076891906126e0565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107d49086908690869086906128fd565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061081457506001600160e01b03198216635b5e139f60e01b145b8061082f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461084490612a96565b80601f016020809104026020016040519081016040528092919081815260200182805461087090612a96565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c1565b506000908152600560205260409020546001600160a01b031690565b600061096782610cc1565b9050806001600160a01b0316836001600160a01b031614156109d55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106c1565b336001600160a01b03821614806109f157506109f18133610557565b610a635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106c1565b610a6d83836117b5565b505050565b333014610ad55760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106c1565b6107dd84848484611823565b610aeb3382611850565b610b515760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016106c1565b610a6d838383611947565b6000546001600160a01b03163314610ba45760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bf1576040519150601f19603f3d011682016040523d82523d6000602084013e610bf6565b606091505b5050905080610c475760405162461bcd60e51b815260206004820152601f60248201527f54696e79204e696e6a61733a204661696c656420746f2077697468647261770060448201526064016106c1565b5050565b610a6d838383604051806020016040528060008152506110ca565b6000546001600160a01b03163314610cae5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b8051610c4790600b906020840190612030565b6000818152600360205260408120546001600160a01b03168061082f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106c1565b600f5460ff16610d8a5760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106c1565b6002610d9533610ee6565b10610de25760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106c1565b60038160ff1610610e455760405162461bcd60e51b815260206004820152602760248201527f54696e79204e696e6a61733a204d61782032204e46547320706572207472616e60448201526639b0b1ba34b7b760c91b60648201526084016106c1565b600d548160ff16600c54610e599190612a27565b1115610ea75760405162461bcd60e51b815260206004820181905260248201527f54696e79204e696e6a61733a204d696e74206578636565647320737570706c7960448201526064016106c1565b610ec433600c60008154610eba90612ad1565b9182905550611ae7565b8060ff1660021415610ee357610ee333600c60008154610eba90612ad1565b50565b60006001600160a01b038216610f515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106c1565b506001600160a01b031660009081526004602052604090205490565b60096020526000908152604090208054610f8690612a96565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb290612a96565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b505050505081565b6000546001600160a01b0316331461104f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600f805460ff19811660ff90911615179055565b6000546001600160a01b031633146110ab5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600e55565b60606002805461084490612a96565b610c47338383611b01565b6110d43383611850565b61113a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016106c1565b6107dd84848484611bd0565b6000818152600360205260409020546060906001600160a01b03166111c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106c1565b60006111cf611c03565b905060008151116111ef576040518060200160405280600081525061121a565b806111f984611c12565b60405160200161120a92919061276e565b6040516020818303038152906040525b9392505050565b61122a81610cc1565b6001600160a01b0316336001600160a01b0316146112955760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106c1565b61ffff8216600090815260096020526040812080546112b390612a96565b9050116113195760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106c1565b61132281611d28565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906113a5908990309089908790899060a601612849565b604080518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f4919061265d565b509050803410156114865760405162461bcd60e51b815260206004820152605060248201527f54696e79204e696e6a61733a206d73672e76616c7565206e6f7420656e6f756760448201527f6820746f20636f766572206d6573736167654665652e2053656e64206761732060648201526f666f72206d657373616765206665657360801b608482015260a4016106c1565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926114d1928c928b913391908b90600401612947565b6000604051808303818588803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161152c9087906126e0565b908152604080516020928190038301902067ffffffffffffffff871660009081529252902060018101549091506115b45760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106c1565b8054821480156115de5750806001015483836040516115d49291906126d0565b6040518091039020145b61162a5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106c1565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061165f908990899089908990899060040161289b565b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116e15760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b61ffff831660009081526009602052604090206107dd9083836120b4565b6000546001600160a01b031633146117475760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b6001600160a01b0381166117ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c1565b610ee381611dc3565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117ea82610cc1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061183a9190612268565b915091506118488282611ae7565b505050505050565b6000818152600360205260408120546001600160a01b03166118c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c1565b60006118d483610cc1565b9050806001600160a01b0316846001600160a01b0316148061190f5750836001600160a01b0316611904846108c7565b6001600160a01b0316145b8061193f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661195a82610cc1565b6001600160a01b0316146119c25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106c1565b6001600160a01b038216611a245760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106c1565b611a2f6000826117b5565b6001600160a01b0383166000908152600460205260408120805460019290611a58908490612a53565b90915550506001600160a01b0382166000908152600460205260408120805460019290611a86908490612a27565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c47828260405180602001604052806000815250611e13565b816001600160a01b0316836001600160a01b03161415611b635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106c1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611bdb848484611947565b611be784848484611e46565b6107dd5760405162461bcd60e51b81526004016106c1906127ec565b6060600b805461084490612a96565b606081611c365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c605780611c4a81612ad1565b9150611c599050600a83612a3f565b9150611c3a565b60008167ffffffffffffffff811115611c7b57611c7b612b42565b6040519080825280601f01601f191660200182016040528015611ca5576020820181803683370190505b5090505b841561193f57611cba600183612a53565b9150611cc7600a86612aec565b611cd2906030612a27565b60f81b818381518110611ce757611ce7612b2c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d21600a86612a3f565b9450611ca9565b6000611d3382610cc1565b9050611d406000836117b5565b6001600160a01b0381166000908152600460205260408120805460019290611d69908490612a53565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611e1d8383611f53565b611e2a6000848484611e46565b610a6d5760405162461bcd60e51b81526004016106c1906127ec565b60006001600160a01b0384163b15611f4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e8a90339089908890889060040161279d565b602060405180830381600087803b158015611ea457600080fd5b505af1925050508015611ed4575060408051601f3d908101601f19168201909252611ed1918101906123f8565b60015b611f2e573d808015611f02576040519150601f19603f3d011682016040523d82523d6000602084013e611f07565b606091505b508051611f265760405162461bcd60e51b81526004016106c1906127ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193f565b506001949350505050565b6001600160a01b038216611fa95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106c1565b6001600160a01b0382166000908152600460205260408120805460019290611fd2908490612a27565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461203c90612a96565b90600052602060002090601f01602090048101928261205e57600085556120a4565b82601f1061207757805160ff19168380011785556120a4565b828001600101855582156120a4579182015b828111156120a4578251825591602001919060010190612089565b506120b0929150612128565b5090565b8280546120c090612a96565b90600052602060002090601f0160209004810192826120e257600085556120a4565b82601f106120fb5782800160ff198235161785556120a4565b828001600101855582156120a4579182015b828111156120a457823582559160200191906001019061210d565b5b808211156120b05760008155600101612129565b600067ffffffffffffffff8084111561215857612158612b42565b604051601f8501601f19908116603f0116810190828211818310171561218057612180612b42565b8160405280935085815286868601111561219957600080fd5b858560208301376000602087830101525050509392505050565b60008083601f8401126121c557600080fd5b50813567ffffffffffffffff8111156121dd57600080fd5b6020830191508360208285010111156121f557600080fd5b9250929050565b600082601f83011261220d57600080fd5b61121a8383356020850161213d565b803561ffff8116811461222e57600080fd5b919050565b803567ffffffffffffffff8116811461222e57600080fd5b60006020828403121561225d57600080fd5b813561121a81612b58565b6000806040838503121561227b57600080fd5b825161228681612b58565b6020939093015192949293505050565b600080604083850312156122a957600080fd5b82356122b481612b58565b915060208301356122c481612b58565b809150509250929050565b6000806000606084860312156122e457600080fd5b83356122ef81612b58565b925060208401356122ff81612b58565b929592945050506040919091013590565b6000806000806080858703121561232657600080fd5b843561233181612b58565b9350602085013561234181612b58565b925060408501359150606085013567ffffffffffffffff81111561236457600080fd5b612370878288016121fc565b91505092959194509250565b6000806040838503121561238f57600080fd5b823561239a81612b58565b9150602083013580151581146122c457600080fd5b600080604083850312156123c257600080fd5b82356123cd81612b58565b946020939093013593505050565b6000602082840312156123ed57600080fd5b813561121a81612b6d565b60006020828403121561240a57600080fd5b815161121a81612b6d565b60006020828403121561242757600080fd5b813567ffffffffffffffff81111561243e57600080fd5b8201601f8101841361244f57600080fd5b61193f8482356020840161213d565b60006020828403121561247057600080fd5b61121a8261221c565b60008060006040848603121561248e57600080fd5b6124978461221c565b9250602084013567ffffffffffffffff8111156124b357600080fd5b6124bf868287016121b3565b9497909650939450505050565b6000806000606084860312156124e157600080fd5b6124ea8461221c565b9250602084013567ffffffffffffffff81111561250657600080fd5b612512868287016121fc565b925050604084013590509250925092565b60008060008060006080868803121561253b57600080fd5b6125448661221c565b9450602086013567ffffffffffffffff8082111561256157600080fd5b61256d89838a016121fc565b955061257b60408901612233565b9450606088013591508082111561259157600080fd5b5061259e888289016121b3565b969995985093965092949392505050565b600080600080608085870312156125c557600080fd5b6125ce8561221c565b9350602085013567ffffffffffffffff808211156125eb57600080fd5b6125f7888389016121fc565b945061260560408801612233565b9350606087013591508082111561261b57600080fd5b50612370878288016121fc565b6000806040838503121561263b57600080fd5b6123cd8361221c565b60006020828403121561265657600080fd5b5035919050565b6000806040838503121561267057600080fd5b505080516020909101519092909150565b60006020828403121561269357600080fd5b813560ff8116811461121a57600080fd5b600081518084526126bc816020860160208601612a6a565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516126f2818460208701612a6a565b9190910192915050565b600080835461270a81612a96565b60018281168015612722576001811461273357612762565b60ff19841687528287019450612762565b8760005260208060002060005b858110156127595781548a820152908401908201612740565b50505082870194505b50929695505050505050565b60008351612780818460208801612a6a565b835190830190612794818360208801612a6a565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526127cf60808301846126a4565b9695505050505050565b60208152600061121a60208301846126a4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820152600061287560a08301866126a4565b8415156060840152828103608084015261288f81856126a4565b98975050505050505050565b61ffff861681526080602082015260006128b860808301876126a4565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff8516815260806020820152600061291a60808301866126a4565b67ffffffffffffffff85166040840152828103606084015261293c81856126a4565b979650505050505050565b61ffff871681526000602060c0818401526000885461296581612a96565b8060c087015260e0600180841660008114612987576001811461299c576129ca565b60ff19851689840152610100890195506129ca565b8d6000528660002060005b858110156129c25781548b82018601529083019088016129a7565b8a0184019650505b505050505083810360408501526129e181896126a4565b9150506129f960608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612a1a81856126a4565b9998505050505050505050565b60008219821115612a3a57612a3a612b00565b500190565b600082612a4e57612a4e612b16565b500490565b600082821015612a6557612a65612b00565b500390565b60005b83811015612a85578181015183820152602001612a6d565b838111156107dd5750506000910152565b600181811c90821680612aaa57607f821691505b60208210811415612acb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ae557612ae5612b00565b5060010190565b600082612afb57612afb612b16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ee357600080fd5b6001600160e01b031981168114610ee357600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220a79541273516e358e7c1e1e9f5b29993dcd6f0ace1d9bf1753d8c989b4ee5e1464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d516e463231335a6665507670526a687169555538587073574d6d34645555797a6a43477261735943795153462f00000000000000000000

Deployed Bytecode

0x6080604052600436106101cc5760003560e01c80638da5cb5b116100f7578063c87b56dd11610095578063eb8d244411610064578063eb8d244414610585578063eb8d72b71461059f578063ed88c68e146101f1578063f2fde38b146105bf57600080fd5b8063c87b56dd146104f6578063cf89fa0314610516578063d1deba1f14610529578063e985e9c51461053c57600080fd5b806395d89b41116100d157806395d89b4114610481578063a22cb46514610496578063b2bdfa7b146104b6578063b88d4fde146104d657600080fd5b80638da5cb5b146103d85780638ee74912146103f6578063943fb8721461046157600080fd5b80632e1a7d4d1161016f5780636ecd23061161013e5780636ecd23061461036257806370a08231146103755780637533d788146103a35780637d8966e4146103c357600080fd5b80632e1a7d4d146102e257806342842e0e1461030257806355f804b3146103225780636352211e1461034257600080fd5b8063081812fc116101ab578063081812fc1461024a578063095ea7b3146102825780631c37a822146102a257806323b872dd146102c257600080fd5b80621d3567146101d157806301ffc9a7146101f357806306fdde0314610228575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046125af565b6105df565b005b3480156101ff57600080fd5b5061021361020e3660046123db565b6107e3565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610835565b60405161021f91906127d9565b34801561025657600080fd5b5061026a610265366004612644565b6108c7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506101f161029d3660046123af565b61095c565b3480156102ae57600080fd5b506101f16102bd3660046125af565b610a72565b3480156102ce57600080fd5b506101f16102dd3660046122cf565b610ae1565b3480156102ee57600080fd5b506101f16102fd366004612644565b610b5c565b34801561030e57600080fd5b506101f161031d3660046122cf565b610c4b565b34801561032e57600080fd5b506101f161033d366004612415565b610c66565b34801561034e57600080fd5b5061026a61035d366004612644565b610cc1565b6101f1610370366004612681565b610d38565b34801561038157600080fd5b5061039561039036600461224b565b610ee6565b60405190815260200161021f565b3480156103af57600080fd5b5061023d6103be36600461245e565b610f6d565b3480156103cf57600080fd5b506101f1611007565b3480156103e457600080fd5b506000546001600160a01b031661026a565b34801561040257600080fd5b5061044c6104113660046124cc565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161021f565b34801561046d57600080fd5b506101f161047c366004612644565b611063565b34801561048d57600080fd5b5061023d6110b0565b3480156104a257600080fd5b506101f16104b136600461237c565b6110bf565b3480156104c257600080fd5b50600a5461026a906001600160a01b031681565b3480156104e257600080fd5b506101f16104f1366004612310565b6110ca565b34801561050257600080fd5b5061023d610511366004612644565b611146565b6101f1610524366004612628565b611221565b6101f1610537366004612523565b61150b565b34801561054857600080fd5b50610213610557366004612296565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561059157600080fd5b50600f546102139060ff1681565b3480156105ab57600080fd5b506101f16105ba366004612479565b611699565b3480156105cb57600080fd5b506101f16105da36600461224b565b6116ff565b6007546001600160a01b031633146105f657600080fd5b61ffff84166000908152600960205260409020805461061490612a96565b90508351148015610653575061ffff841660009081526009602052604090819020905161064191906126fc565b60405180910390208380519060200120145b6106ca5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906106f39087908790879087906004016128fd565b600060405180830381600087803b15801561070d57600080fd5b505af192505050801561071e575060015b6107dd576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161076891906126e0565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107d49086908690869086906128fd565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061081457506001600160e01b03198216635b5e139f60e01b145b8061082f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461084490612a96565b80601f016020809104026020016040519081016040528092919081815260200182805461087090612a96565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c1565b506000908152600560205260409020546001600160a01b031690565b600061096782610cc1565b9050806001600160a01b0316836001600160a01b031614156109d55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106c1565b336001600160a01b03821614806109f157506109f18133610557565b610a635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106c1565b610a6d83836117b5565b505050565b333014610ad55760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106c1565b6107dd84848484611823565b610aeb3382611850565b610b515760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016106c1565b610a6d838383611947565b6000546001600160a01b03163314610ba45760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bf1576040519150601f19603f3d011682016040523d82523d6000602084013e610bf6565b606091505b5050905080610c475760405162461bcd60e51b815260206004820152601f60248201527f54696e79204e696e6a61733a204661696c656420746f2077697468647261770060448201526064016106c1565b5050565b610a6d838383604051806020016040528060008152506110ca565b6000546001600160a01b03163314610cae5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b8051610c4790600b906020840190612030565b6000818152600360205260408120546001600160a01b03168061082f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106c1565b600f5460ff16610d8a5760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106c1565b6002610d9533610ee6565b10610de25760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106c1565b60038160ff1610610e455760405162461bcd60e51b815260206004820152602760248201527f54696e79204e696e6a61733a204d61782032204e46547320706572207472616e60448201526639b0b1ba34b7b760c91b60648201526084016106c1565b600d548160ff16600c54610e599190612a27565b1115610ea75760405162461bcd60e51b815260206004820181905260248201527f54696e79204e696e6a61733a204d696e74206578636565647320737570706c7960448201526064016106c1565b610ec433600c60008154610eba90612ad1565b9182905550611ae7565b8060ff1660021415610ee357610ee333600c60008154610eba90612ad1565b50565b60006001600160a01b038216610f515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106c1565b506001600160a01b031660009081526004602052604090205490565b60096020526000908152604090208054610f8690612a96565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb290612a96565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b505050505081565b6000546001600160a01b0316331461104f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600f805460ff19811660ff90911615179055565b6000546001600160a01b031633146110ab5760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b600e55565b60606002805461084490612a96565b610c47338383611b01565b6110d43383611850565b61113a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016106c1565b6107dd84848484611bd0565b6000818152600360205260409020546060906001600160a01b03166111c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106c1565b60006111cf611c03565b905060008151116111ef576040518060200160405280600081525061121a565b806111f984611c12565b60405160200161120a92919061276e565b6040516020818303038152906040525b9392505050565b61122a81610cc1565b6001600160a01b0316336001600160a01b0316146112955760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106c1565b61ffff8216600090815260096020526040812080546112b390612a96565b9050116113195760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106c1565b61132281611d28565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906113a5908990309089908790899060a601612849565b604080518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f4919061265d565b509050803410156114865760405162461bcd60e51b815260206004820152605060248201527f54696e79204e696e6a61733a206d73672e76616c7565206e6f7420656e6f756760448201527f6820746f20636f766572206d6573736167654665652e2053656e64206761732060648201526f666f72206d657373616765206665657360801b608482015260a4016106c1565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926114d1928c928b913391908b90600401612947565b6000604051808303818588803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161152c9087906126e0565b908152604080516020928190038301902067ffffffffffffffff871660009081529252902060018101549091506115b45760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106c1565b8054821480156115de5750806001015483836040516115d49291906126d0565b6040518091039020145b61162a5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106c1565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061165f908990899089908990899060040161289b565b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116e15760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b61ffff831660009081526009602052604090206107dd9083836120b4565b6000546001600160a01b031633146117475760405162461bcd60e51b81526020600482018190526024820152600080516020612b8483398151915260448201526064016106c1565b6001600160a01b0381166117ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c1565b610ee381611dc3565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117ea82610cc1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061183a9190612268565b915091506118488282611ae7565b505050505050565b6000818152600360205260408120546001600160a01b03166118c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c1565b60006118d483610cc1565b9050806001600160a01b0316846001600160a01b0316148061190f5750836001600160a01b0316611904846108c7565b6001600160a01b0316145b8061193f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661195a82610cc1565b6001600160a01b0316146119c25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106c1565b6001600160a01b038216611a245760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106c1565b611a2f6000826117b5565b6001600160a01b0383166000908152600460205260408120805460019290611a58908490612a53565b90915550506001600160a01b0382166000908152600460205260408120805460019290611a86908490612a27565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c47828260405180602001604052806000815250611e13565b816001600160a01b0316836001600160a01b03161415611b635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106c1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611bdb848484611947565b611be784848484611e46565b6107dd5760405162461bcd60e51b81526004016106c1906127ec565b6060600b805461084490612a96565b606081611c365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c605780611c4a81612ad1565b9150611c599050600a83612a3f565b9150611c3a565b60008167ffffffffffffffff811115611c7b57611c7b612b42565b6040519080825280601f01601f191660200182016040528015611ca5576020820181803683370190505b5090505b841561193f57611cba600183612a53565b9150611cc7600a86612aec565b611cd2906030612a27565b60f81b818381518110611ce757611ce7612b2c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d21600a86612a3f565b9450611ca9565b6000611d3382610cc1565b9050611d406000836117b5565b6001600160a01b0381166000908152600460205260408120805460019290611d69908490612a53565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611e1d8383611f53565b611e2a6000848484611e46565b610a6d5760405162461bcd60e51b81526004016106c1906127ec565b60006001600160a01b0384163b15611f4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e8a90339089908890889060040161279d565b602060405180830381600087803b158015611ea457600080fd5b505af1925050508015611ed4575060408051601f3d908101601f19168201909252611ed1918101906123f8565b60015b611f2e573d808015611f02576040519150601f19603f3d011682016040523d82523d6000602084013e611f07565b606091505b508051611f265760405162461bcd60e51b81526004016106c1906127ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193f565b506001949350505050565b6001600160a01b038216611fa95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106c1565b6001600160a01b0382166000908152600460205260408120805460019290611fd2908490612a27565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461203c90612a96565b90600052602060002090601f01602090048101928261205e57600085556120a4565b82601f1061207757805160ff19168380011785556120a4565b828001600101855582156120a4579182015b828111156120a4578251825591602001919060010190612089565b506120b0929150612128565b5090565b8280546120c090612a96565b90600052602060002090601f0160209004810192826120e257600085556120a4565b82601f106120fb5782800160ff198235161785556120a4565b828001600101855582156120a4579182015b828111156120a457823582559160200191906001019061210d565b5b808211156120b05760008155600101612129565b600067ffffffffffffffff8084111561215857612158612b42565b604051601f8501601f19908116603f0116810190828211818310171561218057612180612b42565b8160405280935085815286868601111561219957600080fd5b858560208301376000602087830101525050509392505050565b60008083601f8401126121c557600080fd5b50813567ffffffffffffffff8111156121dd57600080fd5b6020830191508360208285010111156121f557600080fd5b9250929050565b600082601f83011261220d57600080fd5b61121a8383356020850161213d565b803561ffff8116811461222e57600080fd5b919050565b803567ffffffffffffffff8116811461222e57600080fd5b60006020828403121561225d57600080fd5b813561121a81612b58565b6000806040838503121561227b57600080fd5b825161228681612b58565b6020939093015192949293505050565b600080604083850312156122a957600080fd5b82356122b481612b58565b915060208301356122c481612b58565b809150509250929050565b6000806000606084860312156122e457600080fd5b83356122ef81612b58565b925060208401356122ff81612b58565b929592945050506040919091013590565b6000806000806080858703121561232657600080fd5b843561233181612b58565b9350602085013561234181612b58565b925060408501359150606085013567ffffffffffffffff81111561236457600080fd5b612370878288016121fc565b91505092959194509250565b6000806040838503121561238f57600080fd5b823561239a81612b58565b9150602083013580151581146122c457600080fd5b600080604083850312156123c257600080fd5b82356123cd81612b58565b946020939093013593505050565b6000602082840312156123ed57600080fd5b813561121a81612b6d565b60006020828403121561240a57600080fd5b815161121a81612b6d565b60006020828403121561242757600080fd5b813567ffffffffffffffff81111561243e57600080fd5b8201601f8101841361244f57600080fd5b61193f8482356020840161213d565b60006020828403121561247057600080fd5b61121a8261221c565b60008060006040848603121561248e57600080fd5b6124978461221c565b9250602084013567ffffffffffffffff8111156124b357600080fd5b6124bf868287016121b3565b9497909650939450505050565b6000806000606084860312156124e157600080fd5b6124ea8461221c565b9250602084013567ffffffffffffffff81111561250657600080fd5b612512868287016121fc565b925050604084013590509250925092565b60008060008060006080868803121561253b57600080fd5b6125448661221c565b9450602086013567ffffffffffffffff8082111561256157600080fd5b61256d89838a016121fc565b955061257b60408901612233565b9450606088013591508082111561259157600080fd5b5061259e888289016121b3565b969995985093965092949392505050565b600080600080608085870312156125c557600080fd5b6125ce8561221c565b9350602085013567ffffffffffffffff808211156125eb57600080fd5b6125f7888389016121fc565b945061260560408801612233565b9350606087013591508082111561261b57600080fd5b50612370878288016121fc565b6000806040838503121561263b57600080fd5b6123cd8361221c565b60006020828403121561265657600080fd5b5035919050565b6000806040838503121561267057600080fd5b505080516020909101519092909150565b60006020828403121561269357600080fd5b813560ff8116811461121a57600080fd5b600081518084526126bc816020860160208601612a6a565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516126f2818460208701612a6a565b9190910192915050565b600080835461270a81612a96565b60018281168015612722576001811461273357612762565b60ff19841687528287019450612762565b8760005260208060002060005b858110156127595781548a820152908401908201612740565b50505082870194505b50929695505050505050565b60008351612780818460208801612a6a565b835190830190612794818360208801612a6a565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526127cf60808301846126a4565b9695505050505050565b60208152600061121a60208301846126a4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820152600061287560a08301866126a4565b8415156060840152828103608084015261288f81856126a4565b98975050505050505050565b61ffff861681526080602082015260006128b860808301876126a4565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff8516815260806020820152600061291a60808301866126a4565b67ffffffffffffffff85166040840152828103606084015261293c81856126a4565b979650505050505050565b61ffff871681526000602060c0818401526000885461296581612a96565b8060c087015260e0600180841660008114612987576001811461299c576129ca565b60ff19851689840152610100890195506129ca565b8d6000528660002060005b858110156129c25781548b82018601529083019088016129a7565b8a0184019650505b505050505083810360408501526129e181896126a4565b9150506129f960608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612a1a81856126a4565b9998505050505050505050565b60008219821115612a3a57612a3a612b00565b500190565b600082612a4e57612a4e612b16565b500490565b600082821015612a6557612a65612b00565b500390565b60005b83811015612a85578181015183820152602001612a6d565b838111156107dd5750506000910152565b600181811c90821680612aaa57607f821691505b60208210811415612acb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ae557612ae5612b00565b5060010190565b600082612afb57612afb612b16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ee357600080fd5b6001600160e01b031981168114610ee357600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220a79541273516e358e7c1e1e9f5b29993dcd6f0ace1d9bf1753d8c989b4ee5e1464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d516e463231335a6665507670526a687169555538587073574d6d34645555797a6a43477261735943795153462f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmQnF213ZfePvpRjhqiUU8XpsWMm4dUUyzjCGrasYCyQSF/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d516e463231335a6665507670526a687169555538587073
Arg [4] : 574d6d34645555797a6a43477261735943795153462f00000000000000000000


Deployed Bytecode Sourcemap

54912:4388:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51535:1098;;;;;;;;;;-1:-1:-1;51535:1098:0;;;;;:::i;:::-;;:::i;:::-;;37600:355;;;;;;;;;;-1:-1:-1;37600:355:0;;;;;:::i;:::-;;:::i;:::-;;;12894:14:1;;12887:22;12869:41;;12857:2;12842:18;37600:355:0;;;;;;;;38769:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40462:308::-;;;;;;;;;;-1:-1:-1;40462:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11844:55:1;;;11826:74;;11814:2;11799:18;40462:308:0;11680:226:1;39985:411:0;;;;;;;;;;-1:-1:-1;39985:411:0;;;;;:::i;:::-;;:::i;52641:435::-;;;;;;;;;;-1:-1:-1;52641:435:0;;;;;:::i;:::-;;:::i;41381:376::-;;;;;;;;;;-1:-1:-1;41381:376:0;;;;;:::i;:::-;;:::i;58188:180::-;;;;;;;;;;-1:-1:-1;58188:180:0;;;;;:::i;:::-;;:::i;41828:185::-;;;;;;;;;;-1:-1:-1;41828:185:0;;;;;:::i;:::-;;:::i;57962:90::-;;;;;;;;;;-1:-1:-1;57962:90:0;;;;;:::i;:::-;;:::i;38376:326::-;;;;;;;;;;-1:-1:-1;38376:326:0;;;;;:::i;:::-;;:::i;55563:551::-;;;;;;:::i;:::-;;:::i;38019:295::-;;;;;;;;;;-1:-1:-1;38019:295:0;;;;;:::i;:::-;;:::i;:::-;;;27739:25:1;;;27727:2;27712:18;38019:295:0;27593:177:1;51334:51:0;;;;;;;;;;-1:-1:-1;51334:51:0;;;;;:::i;:::-;;:::i;59211:86::-;;;;;;;;;;;;;:::i;17715:87::-;;;;;;;;;;-1:-1:-1;17761:7:0;17788:6;-1:-1:-1;;;;;17788:6:0;17715:87;;51225:102;;;;;;;;;;-1:-1:-1;51225:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27949:25:1;;;28005:2;27990:18;;27983:34;;;;27922:18;51225:102:0;27775:248:1;58452:128:0;;;;;;;;;;-1:-1:-1;58452:128:0;;;;;:::i;:::-;;:::i;38938:104::-;;;;;;;;;;;;;:::i;40842:187::-;;;;;;;;;;-1:-1:-1;40842:187:0;;;;;:::i;:::-;;:::i;54979:21::-;;;;;;;;;;-1:-1:-1;54979:21:0;;;;-1:-1:-1;;;;;54979:21:0;;;42084:365;;;;;;;;;;-1:-1:-1;42084:365:0;;;;;:::i;:::-;;:::i;39113:468::-;;;;;;;;;;-1:-1:-1;39113:468:0;;;;;:::i;:::-;;:::i;56253:1701::-;;;;;;:::i;:::-;;:::i;53736:916::-;;;;;;:::i;:::-;;:::i;41100:214::-;;;;;;;;;;-1:-1:-1;41100:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;41271:25:0;;;41242:4;41271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41100:214;55151:24;;;;;;;;;;-1:-1:-1;55151:24:0;;;;;;;;54660:181;;;;;;;;;;-1:-1:-1;54660:181:0;;;;;:::i;:::-;;:::i;18170:238::-;;;;;;;;;;-1:-1:-1;18170:238:0;;;;;:::i;:::-;;:::i;51535:1098::-;51740:8;;-1:-1:-1;;;;;51740:8:0;51718:10;:31;51710:40;;;;;;51875:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;51853:11;:18;:61;:168;;;;-1:-1:-1;51988:32:0;;;;;;;:19;:32;;;;;;;51978:43;;;;51988:32;51978:43;:::i;:::-;;;;;;;;51945:11;51935:22;;;;;;:86;51853:168;51831:270;;;;-1:-1:-1;;;51831:270:0;;20790:2:1;51831:270:0;;;20772:21:1;20829:2;20809:18;;;20802:30;20868:34;20848:18;;;20841:62;20939:22;20919:18;;;20912:50;20979:19;;51831:270:0;;;;;;;;;52229:60;;-1:-1:-1;;;52229:60:0;;:4;;:16;;:60;;52246:11;;52259;;52272:6;;52280:8;;52229:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52225:401;;52436:101;;;;;;;;52469:8;:15;52436:101;;;;52513:8;52503:19;;;;;;52436:101;;;52385:14;:27;52400:11;52385:27;;;;;;;;;;;;;;;52413:11;52385:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;52557:57;;;;52571:11;;52584;;52426:6;;52605:8;;52557:57;:::i;:::-;;;;;;;;52225:401;51535:1098;;;;:::o;37600:355::-;37747:4;-1:-1:-1;;;;;;37789:40:0;;-1:-1:-1;;;37789:40:0;;:105;;-1:-1:-1;;;;;;;37846:48:0;;-1:-1:-1;;;37846:48:0;37789:105;:158;;;-1:-1:-1;;;;;;;;;;30346:40:0;;;37911:36;37769:178;37600:355;-1:-1:-1;;37600:355:0:o;38769:100::-;38823:13;38856:5;38849:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38769:100;:::o;40462:308::-;40583:7;44085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44085:16:0;40608:110;;;;-1:-1:-1;;;40608:110:0;;19656:2:1;40608:110:0;;;19638:21:1;19695:2;19675:18;;;19668:30;19734:34;19714:18;;;19707:62;-1:-1:-1;;;19785:18:1;;;19778:42;19837:19;;40608:110:0;19454:408:1;40608:110:0;-1:-1:-1;40738:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40738:24:0;;40462:308::o;39985:411::-;40066:13;40082:23;40097:7;40082:14;:23::i;:::-;40066:39;;40130:5;-1:-1:-1;;;;;40124:11:0;:2;-1:-1:-1;;;;;40124:11:0;;;40116:57;;;;-1:-1:-1;;;40116:57:0;;22037:2:1;40116:57:0;;;22019:21:1;22076:2;22056:18;;;22049:30;22115:34;22095:18;;;22088:62;-1:-1:-1;;;22166:18:1;;;22159:31;22207:19;;40116:57:0;21835:397:1;40116:57:0;16498:10;-1:-1:-1;;;;;40208:21:0;;;;:62;;-1:-1:-1;40233:37:0;40250:5;16498:10;41100:214;:::i;40233:37::-;40186:168;;;;-1:-1:-1;;;40186:168:0;;17229:2:1;40186:168:0;;;17211:21:1;17268:2;17248:18;;;17241:30;17307:34;17287:18;;;17280:62;17378:26;17358:18;;;17351:54;17422:19;;40186:168:0;17027:420:1;40186:168:0;40367:21;40376:2;40380:7;40367:8;:21::i;:::-;40055:341;39985:411;;:::o;52641:435::-;52867:10;52889:4;52867:27;52845:120;;;;-1:-1:-1;;;52845:120:0;;18883:2:1;52845:120:0;;;18865:21:1;18922:2;18902:18;;;18895:30;18961:34;18941:18;;;18934:62;-1:-1:-1;;;19012:18:1;;;19005:41;19063:19;;52845:120:0;18681:407:1;52845:120:0;53014:54;53025:11;53038;53051:6;53059:8;53014:10;:54::i;41381:376::-;41590:41;16498:10;41623:7;41590:18;:41::i;:::-;41568:140;;;;-1:-1:-1;;;41568:140:0;;22439:2:1;41568:140:0;;;22421:21:1;22478:2;22458:18;;;22451:30;22517:34;22497:18;;;22490:62;-1:-1:-1;;;22568:18:1;;;22561:47;22625:19;;41568:140:0;22237:413:1;41568:140:0;41721:28;41731:4;41737:2;41741:7;41721:9;:28::i;58188:180::-;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;58273:6:::1;::::0;58265:36:::1;::::0;58250:9:::1;::::0;-1:-1:-1;;;;;58273:6:0::1;::::0;58293:3;;58250:9;58265:36;58250:9;58265:36;58293:3;58273:6;58265:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58249:52;;;58320:4;58312:48;;;::::0;-1:-1:-1;;;58312:48:0;;20430:2:1;58312:48:0::1;::::0;::::1;20412:21:1::0;20469:2;20449:18;;;20442:30;20508:33;20488:18;;;20481:61;20559:18;;58312:48:0::1;20228:355:1::0;58312:48:0::1;58238:130;58188:180:::0;:::o;41828:185::-;41966:39;41983:4;41989:2;41993:7;41966:39;;;;;;;;;;;;:16;:39::i;57962:90::-;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;58031:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;38376:326::-:0;38493:7;38534:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38534:16:0;38583:19;38561:110;;;;-1:-1:-1;;;38561:110:0;;18065:2:1;38561:110:0;;;18047:21:1;18104:2;18084:18;;;18077:30;18143:34;18123:18;;;18116:62;-1:-1:-1;;;18194:18:1;;;18187:39;18243:19;;38561:110:0;17863:405:1;55563:551:0;55630:12;;;;55622:52;;;;-1:-1:-1;;;55622:52:0;;22857:2:1;55622:52:0;;;22839:21:1;22896:2;22876:18;;;22869:30;22935:29;22915:18;;;22908:57;22982:18;;55622:52:0;22655:351:1;55622:52:0;55717:1;55693:21;55703:10;55693:9;:21::i;:::-;:25;55685:70;;;;-1:-1:-1;;;55685:70:0;;23981:2:1;55685:70:0;;;23963:21:1;;;24000:18;;;23993:30;24059:34;24039:18;;;24032:62;24111:18;;55685:70:0;23779:356:1;55685:70:0;55786:1;55774:9;:13;;;55766:65;;;;-1:-1:-1;;;55766:65:0;;18475:2:1;55766:65:0;;;18457:21:1;18514:2;18494:18;;;18487:30;18553:34;18533:18;;;18526:62;-1:-1:-1;;;18604:18:1;;;18597:37;18651:19;;55766:65:0;18273:403:1;55766:65:0;55891:15;;55878:9;55864:23;;:11;;:23;;;;:::i;:::-;:42;;55842:124;;;;-1:-1:-1;;;55842:124:0;;23620:2:1;55842:124:0;;;23602:21:1;;;23639:18;;;23632:30;23698:34;23678:18;;;23671:62;23750:18;;55842:124:0;23418:356:1;55842:124:0;55977:36;55987:10;56001:11;;55999:13;;;;;:::i;:::-;;;;;-1:-1:-1;55977:9:0;:36::i;:::-;56028:9;:14;;56041:1;56028:14;56024:83;;;56059:36;56069:10;56083:11;;56081:13;;;;;:::i;56059:36::-;55563:551;:::o;38019:295::-;38136:7;-1:-1:-1;;;;;38183:19:0;;38161:111;;;;-1:-1:-1;;;38161:111:0;;17654:2:1;38161:111:0;;;17636:21:1;17693:2;17673:18;;;17666:30;17732:34;17712:18;;;17705:62;-1:-1:-1;;;17783:18:1;;;17776:40;17833:19;;38161:111:0;17452:406:1;38161:111:0;-1:-1:-1;;;;;;38290:16:0;;;;;:9;:16;;;;;;;38019:295::o;51334:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59211:86::-;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;59277:12:::1;::::0;;-1:-1:-1;;59261:28:0;::::1;59277:12;::::0;;::::1;59276:13;59261:28;::::0;;59211:86::o;58452:128::-;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;58537:26:::1;:35:::0;58452:128::o;38938:104::-;38994:13;39027:7;39020:14;;;;;:::i;40842:187::-;40969:52;16498:10;41002:8;41012;40969:18;:52::i;42084:365::-;42273:41;16498:10;42306:7;42273:18;:41::i;:::-;42251:140;;;;-1:-1:-1;;;42251:140:0;;22439:2:1;42251:140:0;;;22421:21:1;22478:2;22458:18;;;22451:30;22517:34;22497:18;;;22490:62;-1:-1:-1;;;22568:18:1;;;22561:47;22625:19;;42251:140:0;22237:413:1;42251:140:0;42402:39;42416:4;42422:2;42426:7;42435:5;42402:13;:39::i;39113:468::-;44061:4;44085:16;;;:7;:16;;;;;;39231:13;;-1:-1:-1;;;;;44085:16:0;39262:113;;;;-1:-1:-1;;;39262:113:0;;21621:2:1;39262:113:0;;;21603:21:1;21660:2;21640:18;;;21633:30;21699:34;21679:18;;;21672:62;-1:-1:-1;;;21750:18:1;;;21743:45;21805:19;;39262:113:0;21419:411:1;39262:113:0;39388:21;39412:10;:8;:10::i;:::-;39388:34;;39477:1;39459:7;39453:21;:25;:120;;;;;;;;;;;;;;;;;39522:7;39531:18;:7;:16;:18::i;:::-;39505:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39453:120;39433:140;39113:468;-1:-1:-1;;;39113:468:0:o;56253:1701::-;56373:16;56381:7;56373;:16::i;:::-;-1:-1:-1;;;;;56359:30:0;:10;-1:-1:-1;;;;;56359:30:0;;56337:114;;;;-1:-1:-1;;;56337:114:0;;16413:2:1;56337:114:0;;;16395:21:1;16452:2;16432:18;;;16425:30;16491:34;16471:18;;;16464:62;-1:-1:-1;;;16542:18:1;;;16535:32;16584:19;;56337:114:0;16211:398:1;56337:114:0;56484:29;;;56523:1;56484:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;56462:136;;;;-1:-1:-1;;;56462:136:0;;15643:2:1;56462:136:0;;;15625:21:1;15682:2;15662:18;;;15655:30;15721:34;15701:18;;;15694:62;-1:-1:-1;;;15772:18:1;;;15765:44;15826:19;;56462:136:0;15441:410:1;56462:136:0;56678:14;56684:7;56678:5;:14::i;:::-;56789:31;;;56800:10;56789:31;;;12601:74:1;12691:18;;;12684:34;;;56789:31:0;;;;;;;;;12574:18:1;;;56789:31:0;;57017:26;;-1:-1:-1;;;56964:90:0;;;11554:51:1;11621:11;;;;11614:27;;;;56964:90:0;;;;;;;;;;11657:12:1;;;56964:90:0;;;;57233:8;;-1:-1:-1;;;57233:153:0;;;56789:31;;56923:1;;-1:-1:-1;;;;;;;57233:8:0;;:21;;:153;;57269:8;;57300:4;;56789:31;;-1:-1:-1;;56964:90:0;;57233:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57208:178;;;57434:10;57421:9;:23;;57399:153;;;;-1:-1:-1;;;57399:153:0;;14395:2:1;57399:153:0;;;14377:21:1;14434:2;14414:18;;;14407:30;14473:34;14453:18;;;14446:62;14544:34;14524:18;;;14517:62;-1:-1:-1;;;14595:19:1;;;14588:47;14652:19;;57399:153:0;14193:484:1;57399:153:0;57565:8;;57657:29;;;57565:8;57657:29;;;:19;:29;;;;;;57565:381;;-1:-1:-1;;;57565:381:0;;-1:-1:-1;;;;;57565:8:0;;;;:13;;57586:9;;57565:381;;57611:8;;57740:7;;57796:10;;57565:8;57906:13;;57565:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56326:1628;;;;56253:1701;;:::o;53736:916::-;53995:27;;;53960:32;53995:27;;;:14;:27;;;;;;:64;;;;54037:11;;53995:64;:::i;:::-;;;;;;;;;;;;;;;;:72;;;;;;;;;;;54100:21;;;;53995:72;;-1:-1:-1;54078:123:0;;;;-1:-1:-1;;;54078:123:0;;23213:2:1;54078:123:0;;;23195:21:1;23252:2;23232:18;;;23225:30;23291:34;23271:18;;;23264:62;-1:-1:-1;;;23342:18:1;;;23335:36;23388:19;;54078:123:0;23011:402:1;54078:123:0;54253:23;;54234:42;;:107;;;;;54320:9;:21;;;54307:8;;54297:19;;;;;;;:::i;:::-;;;;;;;;:44;54234:107;54212:183;;;;-1:-1:-1;;;54212:183:0;;16058:2:1;54212:183:0;;;16040:21:1;16097:2;16077:18;;;16070:30;16136:28;16116:18;;;16109:56;16182:18;;54212:183:0;15856:350:1;54212:183:0;54469:1;54443:27;;;54481:21;;;:34;54584:60;;-1:-1:-1;;;54584:60:0;;:4;;:16;;:60;;54601:11;;54614;;54627:6;;54635:8;;;;54584:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53904:748;53736:916;;;;;:::o;54660:181::-;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;54787:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;54819:14;;54787:46:::1;:::i;18170:238::-:0;17761:7;17788:6;-1:-1:-1;;;;;17788:6:0;16498:10;17935:23;17927:68;;;;-1:-1:-1;;;17927:68:0;;20069:2:1;17927:68:0;;;20051:21:1;;;20088:18;;;20081:30;-1:-1:-1;;;;;;;;;;;20127:18:1;;;20120:62;20199:18;;17927:68:0;19867:356:1;17927:68:0;-1:-1:-1;;;;;18273:22:0;::::1;18251:110;;;::::0;-1:-1:-1;;;18251:110:0;;13988:2:1;18251:110:0::1;::::0;::::1;13970:21:1::0;14027:2;14007:18;;;14000:30;14066:34;14046:18;;;14039:62;-1:-1:-1;;;14117:18:1;;;14110:36;14163:19;;18251:110:0::1;13786:402:1::0;18251:110:0::1;18372:28;18391:8;18372:18;:28::i;48050:174::-:0;48125:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;48125:29:0;-1:-1:-1;;;;;48125:29:0;;;;;;;;:24;;48179:23;48125:24;48179:14;:23::i;:::-;-1:-1:-1;;;;;48170:46:0;;;;;;;;;;;48050:174;;:::o;58671:424::-;58867:14;58883:15;58927:8;58902:77;;;;;;;;;;;;:::i;:::-;58866:113;;;;59061:26;59071:6;59079:7;59061:9;:26::i;:::-;58836:259;;58671:424;;;;:::o;44290:452::-;44419:4;44085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44085:16:0;44441:110;;;;-1:-1:-1;;;44441:110:0;;16816:2:1;44441:110:0;;;16798:21:1;16855:2;16835:18;;;16828:30;16894:34;16874:18;;;16867:62;-1:-1:-1;;;16945:18:1;;;16938:42;16997:19;;44441:110:0;16614:408:1;44441:110:0;44562:13;44578:23;44593:7;44578:14;:23::i;:::-;44562:39;;44631:5;-1:-1:-1;;;;;44620:16:0;:7;-1:-1:-1;;;;;44620:16:0;;:64;;;;44677:7;-1:-1:-1;;;;;44653:31:0;:20;44665:7;44653:11;:20::i;:::-;-1:-1:-1;;;;;44653:31:0;;44620:64;:113;;;-1:-1:-1;;;;;;41271:25:0;;;41242:4;41271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;44701:32;44612:122;44290:452;-1:-1:-1;;;;44290:452:0:o;47317:615::-;47490:4;-1:-1:-1;;;;;47463:31:0;:23;47478:7;47463:14;:23::i;:::-;-1:-1:-1;;;;;47463:31:0;;47441:122;;;;-1:-1:-1;;;47441:122:0;;21211:2:1;47441:122:0;;;21193:21:1;21250:2;21230:18;;;21223:30;21289:34;21269:18;;;21262:62;-1:-1:-1;;;21340:18:1;;;21333:39;21389:19;;47441:122:0;21009:405:1;47441:122:0;-1:-1:-1;;;;;47582:16:0;;47574:65;;;;-1:-1:-1;;;47574:65:0;;14884:2:1;47574:65:0;;;14866:21:1;14923:2;14903:18;;;14896:30;14962:34;14942:18;;;14935:62;-1:-1:-1;;;15013:18:1;;;15006:34;15057:19;;47574:65:0;14682:400:1;47574:65:0;47756:29;47773:1;47777:7;47756:8;:29::i;:::-;-1:-1:-1;;;;;47798:15:0;;;;;;:9;:15;;;;;:20;;47817:1;;47798:15;:20;;47817:1;;47798:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47829:13:0;;;;;;:9;:13;;;;;:18;;47846:1;;47829:13;:18;;47846:1;;47829:18;:::i;:::-;;;;-1:-1:-1;;47858:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47858:21:0;-1:-1:-1;;;;;47858:21:0;;;;;;;;;47897:27;;47858:16;;47897:27;;;;;;;47317:615;;;:::o;45084:110::-;45160:26;45170:2;45174:7;45160:26;;;;;;;;;;;;:9;:26::i;48366:315::-;48521:8;-1:-1:-1;;;;;48512:17:0;:5;-1:-1:-1;;;;;48512:17:0;;;48504:55;;;;-1:-1:-1;;;48504:55:0;;15289:2:1;48504:55:0;;;15271:21:1;15328:2;15308:18;;;15301:30;15367:27;15347:18;;;15340:55;15412:18;;48504:55:0;15087:349:1;48504:55:0;-1:-1:-1;;;;;48570:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;48570:46:0;;;;;;;;;;48632:41;;12869::1;;;48632::0;;12842:18:1;48632:41:0;;;;;;;48366:315;;;:::o;43331:352::-;43488:28;43498:4;43504:2;43508:7;43488:9;:28::i;:::-;43549:48;43572:4;43578:2;43582:7;43591:5;43549:22;:48::i;:::-;43527:148;;;;-1:-1:-1;;;43527:148:0;;;;;;;:::i;59103:100::-;59155:13;59188:7;59181:14;;;;;:::i;13950:723::-;14006:13;14227:10;14223:53;;-1:-1:-1;;14254:10:0;;;;;;;;;;;;-1:-1:-1;;;14254:10:0;;;;;13950:723::o;14223:53::-;14301:5;14286:12;14342:78;14349:9;;14342:78;;14375:8;;;;:::i;:::-;;-1:-1:-1;14398:10:0;;-1:-1:-1;14406:2:0;14398:10;;:::i;:::-;;;14342:78;;;14430:19;14462:6;14452:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14452:17:0;;14430:39;;14480:154;14487:10;;14480:154;;14514:11;14524:1;14514:11;;:::i;:::-;;-1:-1:-1;14583:10:0;14591:2;14583:5;:10;:::i;:::-;14570:24;;:2;:24;:::i;:::-;14557:39;;14540:6;14547;14540:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;14611:11:0;14620:2;14611:11;;:::i;:::-;;;14480:154;;46620:360;46680:13;46696:23;46711:7;46696:14;:23::i;:::-;46680:39;;46821:29;46838:1;46842:7;46821:8;:29::i;:::-;-1:-1:-1;;;;;46863:16:0;;;;;;:9;:16;;;;;:21;;46883:1;;46863:16;:21;;46883:1;;46863:21;:::i;:::-;;;;-1:-1:-1;;46902:16:0;;;;:7;:16;;;;;;46895:23;;-1:-1:-1;;;;;;46895:23:0;;;46936:36;46910:7;;46902:16;-1:-1:-1;;;;;46936:36:0;;;;;46902:16;;46936:36;46669:311;46620:360;:::o;18568:191::-;18642:16;18661:6;;-1:-1:-1;;;;;18678:17:0;;;-1:-1:-1;;;;;;18678:17:0;;;;;;18711:40;;18661:6;;;;;;;18711:40;;18642:16;18711:40;18631:128;18568:191;:::o;45421:321::-;45551:18;45557:2;45561:7;45551:5;:18::i;:::-;45602:54;45633:1;45637:2;45641:7;45650:5;45602:22;:54::i;:::-;45580:154;;;;-1:-1:-1;;;45580:154:0;;;;;;;:::i;49246:980::-;49401:4;-1:-1:-1;;;;;49422:13:0;;19907:20;19955:8;49418:801;;49475:175;;-1:-1:-1;;;49475:175:0;;-1:-1:-1;;;;;49475:36:0;;;;;:175;;16498:10;;49569:4;;49596:7;;49626:5;;49475:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49475:175:0;;;;;;;;-1:-1:-1;;49475:175:0;;;;;;;;;;;;:::i;:::-;;;49454:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49833:13:0;;49829:320;;49876:108;;-1:-1:-1;;;49876:108:0;;;;;;;:::i;49829:320::-;50099:6;50093:13;50084:6;50080:2;50076:15;50069:38;49454:710;-1:-1:-1;;;;;;49714:51:0;-1:-1:-1;;;49714:51:0;;-1:-1:-1;49707:58:0;;49418:801;-1:-1:-1;50203:4:0;49246:980;;;;;;:::o;46078:313::-;-1:-1:-1;;;;;46158:16:0;;46150:61;;;;-1:-1:-1;;;46150:61:0;;19295:2:1;46150:61:0;;;19277:21:1;;;19314:18;;;19307:30;19373:34;19353:18;;;19346:62;19425:18;;46150:61:0;19093:356:1;46150:61:0;-1:-1:-1;;;;;46282:13:0;;;;;;:9;:13;;;;;:18;;46299:1;;46282:13;:18;;46299:1;;46282:18;:::i;:::-;;;;-1:-1:-1;;46311:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46311:21:0;-1:-1:-1;;;;;46311:21:0;;;;;;;;46350:33;;46311:16;;;46350:33;;46311:16;;46350:33;46078:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:347::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;849:18;838:30;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;970:3;963:4;954:6;946;942:19;938:30;935:39;932:59;;;987:1;984;977:12;932:59;650:347;;;;;:::o;1002:220::-;1044:5;1097:3;1090:4;1082:6;1078:17;1074:27;1064:55;;1115:1;1112;1105:12;1064:55;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;1227:159::-;1294:20;;1354:6;1343:18;;1333:29;;1323:57;;1376:1;1373;1366:12;1323:57;1227:159;;;:::o;1391:171::-;1458:20;;1518:18;1507:30;;1497:41;;1487:69;;1552:1;1549;1542:12;1567:247;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;1734:9;1721:23;1753:31;1778:5;1753:31;:::i;1819:320::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2015:9;2009:16;2034:31;2059:5;2034:31;:::i;:::-;2129:2;2114:18;;;;2108:25;2084:5;;2108:25;;-1:-1:-1;;;1819:320:1:o;2144:388::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;-1:-1:-1;2454:2:1;2439:18;;2426:32;2467:33;2426:32;2467:33;:::i;:::-;2519:7;2509:17;;;2144:388;;;;;:::o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:1;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:1;2968:18;;;;2955:32;;2537:456::o;2998:665::-;3093:6;3101;3109;3117;3170:3;3158:9;3149:7;3145:23;3141:33;3138:53;;;3187:1;3184;3177:12;3138:53;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;-1:-1:-1;3352:2:1;3337:18;;3324:32;3365:33;3324:32;3365:33;:::i;:::-;3417:7;-1:-1:-1;3471:2:1;3456:18;;3443:32;;-1:-1:-1;3526:2:1;3511:18;;3498:32;3553:18;3542:30;;3539:50;;;3585:1;3582;3575:12;3539:50;3608:49;3649:7;3640:6;3629:9;3625:22;3608:49;:::i;:::-;3598:59;;;2998:665;;;;;;;:::o;3668:416::-;3733:6;3741;3794:2;3782:9;3773:7;3769:23;3765:32;3762:52;;;3810:1;3807;3800:12;3762:52;3849:9;3836:23;3868:31;3893:5;3868:31;:::i;:::-;3918:5;-1:-1:-1;3975:2:1;3960:18;;3947:32;4017:15;;4010:23;3998:36;;3988:64;;4048:1;4045;4038:12;4089:315;4157:6;4165;4218:2;4206:9;4197:7;4193:23;4189:32;4186:52;;;4234:1;4231;4224:12;4186:52;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4089:315:1:o;4409:245::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4575:9;4562:23;4594:30;4618:5;4594:30;:::i;4659:249::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4829:9;4823:16;4848:30;4872:5;4848:30;:::i;4913:450::-;4982:6;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;5124:18;5116:6;5113:30;5110:50;;;5156:1;5153;5146:12;5110:50;5179:22;;5232:4;5224:13;;5220:27;-1:-1:-1;5210:55:1;;5261:1;5258;5251:12;5210:55;5284:73;5349:7;5344:2;5331:16;5326:2;5322;5318:11;5284:73;:::i;5368:184::-;5426:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:52;;;5495:1;5492;5485:12;5447:52;5518:28;5536:9;5518:28;:::i;5557:481::-;5635:6;5643;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5743:28;5761:9;5743:28;:::i;:::-;5733:38;;5822:2;5811:9;5807:18;5794:32;5849:18;5841:6;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5920:58;5970:7;5961:6;5950:9;5946:22;5920:58;:::i;:::-;5557:481;;5997:8;;-1:-1:-1;5894:84:1;;-1:-1:-1;;;;5557:481:1:o;6043:460::-;6128:6;6136;6144;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6236:28;6254:9;6236:28;:::i;:::-;6226:38;;6315:2;6304:9;6300:18;6287:32;6342:18;6334:6;6331:30;6328:50;;;6374:1;6371;6364:12;6328:50;6397:49;6438:7;6429:6;6418:9;6414:22;6397:49;:::i;:::-;6387:59;;;6493:2;6482:9;6478:18;6465:32;6455:42;;6043:460;;;;;:::o;6508:773::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6737:28;6755:9;6737:28;:::i;:::-;6727:38;;6816:2;6805:9;6801:18;6788:32;6839:18;6880:2;6872:6;6869:14;6866:34;;;6896:1;6893;6886:12;6866:34;6919:49;6960:7;6951:6;6940:9;6936:22;6919:49;:::i;:::-;6909:59;;6987:37;7020:2;7009:9;7005:18;6987:37;:::i;:::-;6977:47;;7077:2;7066:9;7062:18;7049:32;7033:48;;7106:2;7096:8;7093:16;7090:36;;;7122:1;7119;7112:12;7090:36;;7161:60;7213:7;7202:8;7191:9;7187:24;7161:60;:::i;:::-;6508:773;;;;-1:-1:-1;6508:773:1;;-1:-1:-1;7240:8:1;;7135:86;6508:773;-1:-1:-1;;;6508:773:1:o;7286:684::-;7388:6;7396;7404;7412;7465:3;7453:9;7444:7;7440:23;7436:33;7433:53;;;7482:1;7479;7472:12;7433:53;7505:28;7523:9;7505:28;:::i;:::-;7495:38;;7584:2;7573:9;7569:18;7556:32;7607:18;7648:2;7640:6;7637:14;7634:34;;;7664:1;7661;7654:12;7634:34;7687:49;7728:7;7719:6;7708:9;7704:22;7687:49;:::i;:::-;7677:59;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7845:2;7834:9;7830:18;7817:32;7801:48;;7874:2;7864:8;7861:16;7858:36;;;7890:1;7887;7880:12;7858:36;;7913:51;7956:7;7945:8;7934:9;7930:24;7913:51;:::i;7975:252::-;8042:6;8050;8103:2;8091:9;8082:7;8078:23;8074:32;8071:52;;;8119:1;8116;8109:12;8071:52;8142:28;8160:9;8142:28;:::i;8232:180::-;8291:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:52;;;8360:1;8357;8350:12;8312:52;-1:-1:-1;8383:23:1;;8232:180;-1:-1:-1;8232:180:1:o;8417:245::-;8496:6;8504;8557:2;8545:9;8536:7;8532:23;8528:32;8525:52;;;8573:1;8570;8563:12;8525:52;-1:-1:-1;;8596:16:1;;8652:2;8637:18;;;8631:25;8596:16;;8631:25;;-1:-1:-1;8417:245:1:o;8667:269::-;8724:6;8777:2;8765:9;8756:7;8752:23;8748:32;8745:52;;;8793:1;8790;8783:12;8745:52;8832:9;8819:23;8882:4;8875:5;8871:16;8864:5;8861:27;8851:55;;8902:1;8899;8892:12;9081:257;9122:3;9160:5;9154:12;9187:6;9182:3;9175:19;9203:63;9259:6;9252:4;9247:3;9243:14;9236:4;9229:5;9225:16;9203:63;:::i;:::-;9320:2;9299:15;-1:-1:-1;;9295:29:1;9286:39;;;;9327:4;9282:50;;9081:257;-1:-1:-1;;9081:257:1:o;9343:271::-;9526:6;9518;9513:3;9500:33;9482:3;9552:16;;9577:13;;;9552:16;9343:271;-1:-1:-1;9343:271:1:o;9619:274::-;9748:3;9786:6;9780:13;9802:53;9848:6;9843:3;9836:4;9828:6;9824:17;9802:53;:::i;:::-;9871:16;;;;;9619:274;-1:-1:-1;;9619:274:1:o;9898:811::-;10024:3;10053:1;10086:6;10080:13;10116:36;10142:9;10116:36;:::i;:::-;10171:1;10188:18;;;10215:104;;;;10333:1;10328:356;;;;10181:503;;10215:104;-1:-1:-1;;10248:24:1;;10236:37;;10293:16;;;;-1:-1:-1;10215:104:1;;10328:356;10359:6;10356:1;10349:17;10389:4;10434:2;10431:1;10421:16;10459:1;10473:165;10487:6;10484:1;10481:13;10473:165;;;10565:14;;10552:11;;;10545:35;10608:16;;;;10502:10;;10473:165;;;10477:3;;;10667:6;10662:3;10658:16;10651:23;;10181:503;-1:-1:-1;10700:3:1;;9898:811;-1:-1:-1;;;;;;9898:811:1:o;10714:470::-;10893:3;10931:6;10925:13;10947:53;10993:6;10988:3;10981:4;10973:6;10969:17;10947:53;:::i;:::-;11063:13;;11022:16;;;;11085:57;11063:13;11022:16;11119:4;11107:17;;11085:57;:::i;:::-;11158:20;;10714:470;-1:-1:-1;;;;10714:470:1:o;11911:511::-;12105:4;-1:-1:-1;;;;;12215:2:1;12207:6;12203:15;12192:9;12185:34;12267:2;12259:6;12255:15;12250:2;12239:9;12235:18;12228:43;;12307:6;12302:2;12291:9;12287:18;12280:34;12350:3;12345:2;12334:9;12330:18;12323:31;12371:45;12411:3;12400:9;12396:19;12388:6;12371:45;:::i;:::-;12363:53;11911:511;-1:-1:-1;;;;;;11911:511:1:o;12921:217::-;13068:2;13057:9;13050:21;13031:4;13088:44;13128:2;13117:9;13113:18;13105:6;13088:44;:::i;13367:414::-;13569:2;13551:21;;;13608:2;13588:18;;;13581:30;13647:34;13642:2;13627:18;;13620:62;13718:20;13713:2;13698:18;;13691:48;13771:3;13756:19;;13367:414::o;24140:663::-;24421:6;24413;24409:19;24398:9;24391:38;-1:-1:-1;;;;;24469:6:1;24465:55;24460:2;24449:9;24445:18;24438:83;24557:3;24552:2;24541:9;24537:18;24530:31;24372:4;24584:45;24624:3;24613:9;24609:19;24601:6;24584:45;:::i;:::-;24679:6;24672:14;24665:22;24660:2;24649:9;24645:18;24638:50;24737:9;24729:6;24725:22;24719:3;24708:9;24704:19;24697:51;24765:32;24790:6;24782;24765:32;:::i;:::-;24757:40;24140:663;-1:-1:-1;;;;;;;;24140:663:1:o;24808:717::-;25075:6;25067;25063:19;25052:9;25045:38;25119:3;25114:2;25103:9;25099:18;25092:31;25026:4;25146:45;25186:3;25175:9;25171:19;25163:6;25146:45;:::i;:::-;25239:18;25231:6;25227:31;25222:2;25211:9;25207:18;25200:59;25307:9;25299:6;25295:22;25290:2;25279:9;25275:18;25268:50;25342:6;25334;25327:22;25396:6;25388;25383:2;25375:6;25371:15;25358:45;25449:1;25444:2;25435:6;25427;25423:19;25419:28;25412:39;25516:2;25509;25505:7;25500:2;25492:6;25488:15;25484:29;25476:6;25472:42;25468:51;25460:59;;;24808:717;;;;;;;;:::o;25530:555::-;25787:6;25779;25775:19;25764:9;25757:38;25831:3;25826:2;25815:9;25811:18;25804:31;25738:4;25858:45;25898:3;25887:9;25883:19;25875:6;25858:45;:::i;:::-;25951:18;25943:6;25939:31;25934:2;25923:9;25919:18;25912:59;26019:9;26011:6;26007:22;26002:2;25991:9;25987:18;25980:50;26047:32;26072:6;26064;26047:32;:::i;:::-;26039:40;25530:555;-1:-1:-1;;;;;;;25530:555:1:o;26090:1498::-;26436:6;26428;26424:19;26413:9;26406:38;26387:4;26463:2;26501:3;26496:2;26485:9;26481:18;26474:31;26525:1;26558:6;26552:13;26588:36;26614:9;26588:36;:::i;:::-;26661:6;26655:3;26644:9;26640:19;26633:35;26687:3;26709:1;26741:2;26730:9;26726:18;26758:1;26753:122;;;;26889:1;26884:354;;;;26719:519;;26753:122;-1:-1:-1;;26801:24:1;;26781:18;;;26774:52;26861:3;26846:19;;;-1:-1:-1;26753:122:1;;26884:354;26915:6;26912:1;26905:17;26963:2;26960:1;26950:16;26988:1;27002:180;27016:6;27013:1;27010:13;27002:180;;;27109:14;;27085:17;;;27081:26;;27074:50;27152:16;;;;27031:10;;27002:180;;;27206:17;;27202:26;;;-1:-1:-1;;26719:519:1;;;;;;27283:9;27278:3;27274:19;27269:2;27258:9;27254:18;27247:47;27317:29;27342:3;27334:6;27317:29;:::i;:::-;27303:43;;;27355:54;27405:2;27394:9;27390:18;27382:6;-1:-1:-1;;;;;9015:54:1;9003:67;;8941:135;27355:54;-1:-1:-1;;;;;9015:54:1;;27468:3;27453:19;;9003:67;27522:9;27514:6;27510:22;27504:3;27493:9;27489:19;27482:51;27550:32;27575:6;27567;27550:32;:::i;:::-;27542:40;26090:1498;-1:-1:-1;;;;;;;;;26090:1498:1:o;28028:128::-;28068:3;28099:1;28095:6;28092:1;28089:13;28086:39;;;28105:18;;:::i;:::-;-1:-1:-1;28141:9:1;;28028:128::o;28161:120::-;28201:1;28227;28217:35;;28232:18;;:::i;:::-;-1:-1:-1;28266:9:1;;28161:120::o;28286:125::-;28326:4;28354:1;28351;28348:8;28345:34;;;28359:18;;:::i;:::-;-1:-1:-1;28396:9:1;;28286:125::o;28416:258::-;28488:1;28498:113;28512:6;28509:1;28506:13;28498:113;;;28588:11;;;28582:18;28569:11;;;28562:39;28534:2;28527:10;28498:113;;;28629:6;28626:1;28623:13;28620:48;;;-1:-1:-1;;28664:1:1;28646:16;;28639:27;28416:258::o;28679:380::-;28758:1;28754:12;;;;28801;;;28822:61;;28876:4;28868:6;28864:17;28854:27;;28822:61;28929:2;28921:6;28918:14;28898:18;28895:38;28892:161;;;28975:10;28970:3;28966:20;28963:1;28956:31;29010:4;29007:1;29000:15;29038:4;29035:1;29028:15;28892:161;;28679:380;;;:::o;29064:135::-;29103:3;-1:-1:-1;;29124:17:1;;29121:43;;;29144:18;;:::i;:::-;-1:-1:-1;29191:1:1;29180:13;;29064:135::o;29204:112::-;29236:1;29262;29252:35;;29267:18;;:::i;:::-;-1:-1:-1;29301:9:1;;29204:112::o;29321:127::-;29382:10;29377:3;29373:20;29370:1;29363:31;29413:4;29410:1;29403:15;29437:4;29434:1;29427:15;29453:127;29514:10;29509:3;29505:20;29502:1;29495:31;29545:4;29542:1;29535:15;29569:4;29566:1;29559:15;29585:127;29646:10;29641:3;29637:20;29634:1;29627:31;29677:4;29674:1;29667:15;29701:4;29698:1;29691:15;29717:127;29778:10;29773:3;29769:20;29766:1;29759:31;29809:4;29806:1;29799:15;29833:4;29830:1;29823:15;29849:154;-1:-1:-1;;;;;29928:5:1;29924:54;29917:5;29914:65;29904:93;;29993:1;29990;29983:12;30008:131;-1:-1:-1;;;;;;30082:32:1;;30072:43;;30062:71;;30129:1;30126;30119:12

Swarm Source

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