ETH Price: $3,407.18 (+3.23%)

OmniBots (OMBTZ)
 

Overview

TokenID

49

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
OmniBotzChain1

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: https://github.com/LayerZero-Labs/LayerZero/blob/main/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, uint _configType, bytes calldata _config) external;

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

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

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

// File: https://github.com/LayerZero-Labs/LayerZero/blob/main/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, uint _gasLimit, bytes calldata _payload) external;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/LayerZero-Labs/LayerZero/blob/main/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 Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

// File: contracts/Omnibotz/interfaces/NonBlockingReceiver.sol

pragma solidity 0.8.7;





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

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

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

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

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

    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 == trustedSourceLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedSourceLookup[_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.");
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedSourceLookup[_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 setTrustedSource(uint16 _chainId, bytes calldata _trustedSource) external onlyOwner {
        require(trustedSourceLookup[_chainId].length == 0, "The trusted source address has already been set for the chainId!");
        trustedSourceLookup[_chainId] = _trustedSource;
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Omnibotz/OmnibotsEth.sol

//SPDX-License-Identifier: MIT
pragma solidity 0.8.7;






contract OmniBotzChain1 is ERC721Enumerable, NonblockingReceiver, ILayerZeroUserApplicationConfig {
    using Strings for uint256;

    string public baseTokenURI;
    uint256 nextTokenId;
    uint256 public immutable maxMint;
    uint256 public immutable maxPerTx = 2;
    mapping(address => uint256) public whitelistedMints;
    bytes32 private whitelistRoot;
    bool paused = false;
    bool whiteListingSale = false;

    constructor(
        string memory _baseTokenURI,
        address _layerZeroEndpoint,
        uint256 _startToken,
        uint256 _maxMint
    )
    ERC721("OmniBots", "OMBTZ") {
        setBaseURI(_baseTokenURI);
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
        nextTokenId = _startToken;
        maxMint = _maxMint;
    }


    // Verify that a given leaf is in the tree.
    function _verify(
        bytes32 _leafNode,
        bytes32[] memory proof
    ) internal view returns (bool) {
        
       
            return MerkleProof.verify(proof, whitelistRoot, _leafNode);
        
    }

    // Generate the leaf node (just the hash of tokenID concatenated with the account address)
    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }



    /// @notice Mint your OmnichainNonFungibleToken
    function mint(uint256 quantity) external {
        require(!paused);
        require(!whiteListingSale, "CANT_MINT_ON_WL_SALE");
        require(quantity <= maxPerTx && balanceOf(msg.sender) < maxPerTx, "ONLY_2_PER_WALLET");
        require(nextTokenId + quantity <= maxMint, "MAX_SUPPLY_FOR_CHAIN");
        unchecked {
            for(uint256 i = 0; i < quantity; i++) {
                _safeMint(msg.sender, ++nextTokenId);
            }
        }
    }

    /// @notice Whitelist Mint your OmnichainNonFungibleToken
    function mintWl(uint256 quantity,  bytes32[] calldata proof) external {
        require(!paused);
            require(whiteListingSale, "Whitelisting not enabled");
 
                require(
                    _verify(_leaf(msg.sender), proof),
                    "Invalid proof"
                );
                require(
                    (whitelistedMints[msg.sender] + quantity) <=
                        maxPerTx,
                    "Exceeds Max Mint amount"
                );
       
        require(nextTokenId + quantity <= maxMint, "MAX_SUPPLY_FOR_CHAIN");
        
        unchecked {
             whitelistedMints[msg.sender] = whitelistedMints[msg.sender] + quantity;
            for(uint256 i = 0; i < quantity; i++) {
                _safeMint(msg.sender, ++nextTokenId);
            }
        }
    }

    function reserveBots(uint256 quantity) public onlyOwner {
        unchecked{
            for(uint256 i = 0; i < quantity; i++) {
                _safeMint(msg.sender, ++nextTokenId);
            }
        }  
    }

    function traverseChains(
        uint16 _chainId,
        uint256 tokenId
    ) public payable {
        require(msg.sender == ownerOf(tokenId), "Message sender must own the OmnichainNFT.");
        require(trustedSourceLookup[_chainId].length != 0, "This chain is not a trusted source source.");

        // burn ONFT on source chain
         _burn(tokenId);

        // encode payload w/ sender address and ONFT token id
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams w/ extra gas for destination chain
        // This example uses 500,000 gas. Your implementation may need more.
        uint16 version = 1;
        uint gas = 350000;
        bytes memory adapterParams = abi.encodePacked(version, gas);

        // use LayerZero estimateFees for cross chain delivery
        (uint quotedLayerZeroFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);

        require(msg.value >= quotedLayerZeroFee, "Not enough gas to cover cross chain transfer.");

        endpoint.send{value:msg.value}(
            _chainId,                      // destination chainId
            trustedSourceLookup[_chainId], // destination address of OmnichainNFT
            payload,                       // abi.encode()'ed bytes
            payable(msg.sender),           // refund address
            address(0x0),                  // future parameter
            adapterParams                  // adapterParams
        );
    }

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

    /// @notice Set the baseTokenURI
    /// @param _baseTokenURI to set
    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    /// @notice Get the base URI
    function _baseURI() override internal view returns (string memory) {
        return baseTokenURI;
    }
    
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseURI(), _tokenId.toString(), ".json"));
    }

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

    

    function setWhitelistingRoot(bytes32 _root) public onlyOwner {
        whitelistRoot = _root;
    }


    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external override onlyOwner {
        endpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        endpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        endpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        endpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

     function togglePause() public onlyOwner {
        paused = !paused;
    }

    function toggleWhiteSale() public onlyOwner {
        whiteListingSale = !whiteListingSale;
    }

   
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"},{"internalType":"uint256","name":"_startToken","type":"uint256"},{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEstimatedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWl","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedSource","type":"bytes"}],"name":"setTrustedSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistingRoot","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"trustedSourceLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0604052600260a0526012805461ffff191690553480156200002157600080fd5b5060405162003ce638038062003ce683398101604081905262000044916200028e565b60408051808201825260088152674f6d6e69426f747360c01b60208083019182528351808501909452600584526427a6a12a2d60d91b9084015281519192916200009191600091620001cb565b508051620000a7906001906020840190620001cb565b505050620000c4620000be620000fd60201b60201c565b62000101565b620000cf8462000153565b600b80546001600160a01b0319166001600160a01b039490941693909317909255600f5560805250620003e2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001c790600e906020840190620001cb565b5050565b828054620001d9906200038f565b90600052602060002090601f016020900481019282620001fd576000855562000248565b82601f106200021857805160ff191683800117855562000248565b8280016001018555821562000248579182015b82811115620002485782518255916020019190600101906200022b565b50620002569291506200025a565b5090565b5b808211156200025657600081556001016200025b565b80516001600160a01b03811681146200028957600080fd5b919050565b60008060008060808587031215620002a557600080fd5b84516001600160401b0380821115620002bd57600080fd5b818701915087601f830112620002d257600080fd5b815181811115620002e757620002e7620003cc565b604051601f8201601f19908116603f01168101908382118183101715620003125762000312620003cc565b81604052828152602093508a848487010111156200032f57600080fd5b600091505b8282101562000353578482018401518183018501529083019062000334565b82821115620003655760008484830101525b97506200037791505087820162000271565b60408801516060909801519699909850945050505050565b600181811c90821680620003a457607f821691505b60208210811415620003c657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a0516138bb6200042b60003960008181610824015281816112e00152818161130b01526115460152600081816105440152818161137701526115c101526138bb6000f3fe60806040526004361061025b5760003560e01c80637501f74111610144578063c87b56dd116100b6578063d73f057e1161007a578063d73f057e14610754578063e985e9c514610774578063ed816179146107bd578063ee891212146107d2578063f2fde38b146107f2578063f968adbe1461081257600080fd5b8063c87b56dd146106d9578063cbed8b9c146106f9578063cf89fa0314610719578063d1deba1f1461072c578063d547cfb71461073f57600080fd5b8063a0712d6811610108578063a0712d6814610624578063a22cb46514610644578063b45b35d714610664578063b88d4fde14610684578063c4ae3168146106a4578063c7afa661146106b957600080fd5b80637501f7411461053257806381c986ee146105665780638da5cb5b146105865780638ee74912146105a457806395d89b411461060f57600080fd5b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104705780635e280f11146104905780636352211e146104b05780636852a855146104d057806370a08231146104fd578063715018a61461051d57600080fd5b806323b872dd146103d05780632f745c59146103f057806342842e0e1461041057806342d65a8d146104305780634f6ccce71461045057600080fd5b8063081812fc11610224578063081812fc14610319578063095ea7b31461035157806310ddb1371461037157806318160ddd146103915780631c37a822146103b057600080fd5b80621d35671461026057806301ffc9a71461028257806304cc6c78146102b757806306fdde03146102d757806307e0db17146102f9575b600080fd5b34801561026c57600080fd5b5061028061027b366004613115565b610846565b005b34801561028e57600080fd5b506102a261029d366004612f45565b610a40565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102806102d2366004612f2c565b610a6b565b3480156102e357600080fd5b506102ec610ac2565b6040516102ae9190613417565b34801561030557600080fd5b50610280610314366004612fc7565b610b54565b34801561032557600080fd5b50610339610334366004612f2c565b610be3565b6040516001600160a01b0390911681526020016102ae565b34801561035d57600080fd5b5061028061036c366004612f00565b610c78565b34801561037d57600080fd5b5061028061038c366004612fc7565b610d8e565b34801561039d57600080fd5b506008545b6040519081526020016102ae565b3480156103bc57600080fd5b506102806103cb366004613115565b610dec565b3480156103dc57600080fd5b506102806103eb366004612e21565b610e5b565b3480156103fc57600080fd5b506103a261040b366004612f00565b610e8c565b34801561041c57600080fd5b5061028061042b366004612e21565b610f22565b34801561043c57600080fd5b5061028061044b366004612fe2565b610f3d565b34801561045c57600080fd5b506103a261046b366004612f2c565b610fd2565b34801561047c57600080fd5b5061028061048b366004612f7f565b611065565b34801561049c57600080fd5b50600b54610339906001600160a01b031681565b3480156104bc57600080fd5b506103396104cb366004612f2c565b6110a2565b3480156104dc57600080fd5b506103a26104eb366004612d9d565b60106020526000908152604090205481565b34801561050957600080fd5b506103a2610518366004612d9d565b611119565b34801561052957600080fd5b506102806111a0565b34801561053e57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561057257600080fd5b506102ec610581366004612fc7565b6111d6565b34801561059257600080fd5b50600a546001600160a01b0316610339565b3480156105b057600080fd5b506105fa6105bf366004613034565b600c60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102ae565b34801561061b57600080fd5b506102ec611270565b34801561063057600080fd5b5061028061063f366004612f2c565b61127f565b34801561065057600080fd5b5061028061065f366004612ecd565b611412565b34801561067057600080fd5b5061028061067f366004613206565b61141d565b34801561069057600080fd5b5061028061069f366004612e62565b61166f565b3480156106b057600080fd5b506102806116a1565b3480156106c557600080fd5b506103a26106d43660046131ea565b6116df565b3480156106e557600080fd5b506102ec6106f4366004612f2c565b6117c2565b34801561070557600080fd5b5061028061071436600461318d565b611879565b6102806107273660046131ea565b611914565b61028061073a36600461308a565b611bdd565b34801561074b57600080fd5b506102ec611d6a565b34801561076057600080fd5b5061028061076f366004612fe2565b611d77565b34801561078057600080fd5b506102a261078f366004612de8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c957600080fd5b50610280611e54565b3480156107de57600080fd5b506102806107ed366004612f2c565b611e9b565b3480156107fe57600080fd5b5061028061080d366004612d9d565b611eca565b34801561081e57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000081565b600b546001600160a01b0316331461085d57600080fd5b61ffff84166000908152600d60205260409020805461087b90613782565b905083511480156108ba575061ffff84166000908152600d60205260409081902090516108a89190613329565b60405180910390208380519060200120145b6109285760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906109519087908790879087906004016135bc565b600060405180830381600087803b15801561096b57600080fd5b505af192505050801561097c575060015b610a3a576040518060400160405280825181526020018280519060200120815250600c60008661ffff1661ffff168152602001908152602001600020846040516109c6919061330d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a319086908690869086906135bc565b60405180910390a15b50505050565b60006001600160e01b0319821663780e9d6360e01b1480610a655750610a6582611f65565b92915050565b600a546001600160a01b03163314610a955760405162461bcd60e51b815260040161091f9061347c565b60005b81811015610abe57600f805460010190819055610ab6903390611fb5565b600101610a98565b5050565b606060008054610ad190613782565b80601f0160208091040260200160405190810160405280929190818152602001828054610afd90613782565b8015610b4a5780601f10610b1f57610100808354040283529160200191610b4a565b820191906000526020600020905b815481529060010190602001808311610b2d57829003601f168201915b5050505050905090565b600a546001600160a01b03163314610b7e5760405162461bcd60e51b815260040161091f9061347c565b600b546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b5050505050565b6000818152600260205260408120546001600160a01b0316610c5c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091f565b506000908152600460205260409020546001600160a01b031690565b6000610c83826110a2565b9050806001600160a01b0316836001600160a01b03161415610cf15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161091f565b336001600160a01b0382161480610d0d5750610d0d813361078f565b610d7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161091f565b610d898383611fcf565b505050565b600a546001600160a01b03163314610db85760405162461bcd60e51b815260040161091f9061347c565b600b546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401610bae565b333014610e4f5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161091f565b610a3a8484848461203d565b610e65338261206a565b610e815760405162461bcd60e51b815260040161091f906134b1565b610d89838383612161565b6000610e9783611119565b8210610ef95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161091f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d898383836040518060200160405280600081525061166f565b600a546001600160a01b03163314610f675760405162461bcd60e51b815260040161091f9061347c565b600b546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90610f9b90869086908690600401613556565b600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050505050565b6000610fdd60085490565b82106110405760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161091f565b600882815481106110535761105361382e565b90600052602060002001549050919050565b600a546001600160a01b0316331461108f5760405162461bcd60e51b815260040161091f9061347c565b8051610abe90600e906020840190612b85565b6000818152600260205260408120546001600160a01b031680610a655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161091f565b60006001600160a01b0382166111845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161091f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111ca5760405162461bcd60e51b815260040161091f9061347c565b6111d46000612308565b565b600d60205260009081526040902080546111ef90613782565b80601f016020809104026020016040519081016040528092919081815260200182805461121b90613782565b80156112685780601f1061123d57610100808354040283529160200191611268565b820191906000526020600020905b81548152906001019060200180831161124b57829003601f168201915b505050505081565b606060018054610ad190613782565b60125460ff161561128f57600080fd5b601254610100900460ff16156112de5760405162461bcd60e51b815260206004820152601460248201527343414e545f4d494e545f4f4e5f574c5f53414c4560601b604482015260640161091f565b7f0000000000000000000000000000000000000000000000000000000000000000811115801561133557507f000000000000000000000000000000000000000000000000000000000000000061133333611119565b105b6113755760405162461bcd60e51b815260206004820152601160248201527013d3931657cc97d4115497d5d053131155607a1b604482015260640161091f565b7f000000000000000000000000000000000000000000000000000000000000000081600f546113a49190613713565b11156113e95760405162461bcd60e51b815260206004820152601460248201527326a0ac2fa9aaa828262cafa327a92fa1a420a4a760611b604482015260640161091f565b60005b81811015610abe57600f80546001019081905561140a903390611fb5565b6001016113ec565b610abe33838361235a565b60125460ff161561142d57600080fd5b601254610100900460ff166114845760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374696e67206e6f7420656e61626c65640000000000000000604482015260640161091f565b604080513360601b6bffffffffffffffffffffffff191660208083019190915282516014818403018152603490920190925280519101206114f89083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061242992505050565b6115345760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161091f565b336000908152601060205260409020547f000000000000000000000000000000000000000000000000000000000000000090611571908590613713565b11156115bf5760405162461bcd60e51b815260206004820152601760248201527f45786365656473204d6178204d696e7420616d6f756e74000000000000000000604482015260640161091f565b7f000000000000000000000000000000000000000000000000000000000000000083600f546115ee9190613713565b11156116335760405162461bcd60e51b815260206004820152601460248201527326a0ac2fa9aaa828262cafa327a92fa1a420a4a760611b604482015260640161091f565b3360009081526010602052604081208054850190555b83811015610a3a57600f805460010190819055611667903390611fb5565b600101611649565b611679338361206a565b6116955760405162461bcd60e51b815260040161091f906134b1565b610a3a8484848461243f565b600a546001600160a01b031633146116cb5760405162461bcd60e51b815260040161091f9061347c565b6012805460ff19811660ff90911615179055565b60408051336020820152808201839052815180820383018152606082018352600160f01b60808301526205573060828084018290528451808503909101815260a2840194859052600b5463040a7bb160e41b909552600094929360019386916001600160a01b03909116906340a7bb1090611766908b9030908a908790899060a601613502565b604080518083038186803b15801561177d57600080fd5b505afa158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613284565b5098975050505050505050565b6000818152600260205260409020546060906001600160a01b03166118415760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161091f565b611849612472565b61185283612481565b60405160200161186392919061339b565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146118a35760405162461bcd60e51b815260040161091f9061347c565b600b546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906118db90889088908890889088906004016136e5565b600060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050505050505050565b61191d816110a2565b6001600160a01b0316336001600160a01b03161461198f5760405162461bcd60e51b815260206004820152602960248201527f4d6573736167652073656e646572206d757374206f776e20746865204f6d6e6960448201526831b430b4b727232a1760b91b606482015260840161091f565b61ffff82166000908152600d6020526040902080546119ad90613782565b15159050611a105760405162461bcd60e51b815260206004820152602a60248201527f5468697320636861696e206973206e6f742061207472757374656420736f757260448201526931b29039b7bab931b29760b11b606482015260840161091f565b611a198161257e565b60408051336020820152808201839052815180820383018152606082018352600160f01b60808301526205573060828084018290528451808503909101815260a2840194859052600b5463040a7bb160e41b90955291936001939192916000916001600160a01b0316906340a7bb1090611a9f908a9030908a908790899060a601613502565b604080518083038186803b158015611ab657600080fd5b505afa158015611aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aee9190613284565b50905080341015611b575760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f7567682067617320746f20636f7665722063726f737320636860448201526c30b4b7103a3930b739b332b91760991b606482015260840161091f565b600b5461ffff88166000908152600d6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611ba2928d928c913391908b90600401613605565b6000604051808303818588803b158015611bbb57600080fd5b505af1158015611bcf573d6000803e3d6000fd5b505050505050505050505050565b61ffff85166000908152600c60205260408082209051611bfe90879061330d565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611c855760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161091f565b805482148015611caf575080600101548383604051611ca59291906132fd565b6040518091039020145b611cfb5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161091f565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611d30908990899089908990899060040161357d565b600060405180830381600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b50505050505050505050565b600e80546111ef90613782565b600a546001600160a01b03163314611da15760405162461bcd60e51b815260040161091f9061347c565b61ffff83166000908152600d602052604090208054611dbf90613782565b159050611e36576040805162461bcd60e51b81526020600482015260248101919091527f546865207472757374656420736f75726365206164647265737320686173206160448201527f6c7265616479206265656e2073657420666f722074686520636861696e496421606482015260840161091f565b61ffff83166000908152600d60205260409020610a3a908383612c09565b600a546001600160a01b03163314611e7e5760405162461bcd60e51b815260040161091f9061347c565b6012805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611ec55760405162461bcd60e51b815260040161091f9061347c565b601155565b600a546001600160a01b03163314611ef45760405162461bcd60e51b815260040161091f9061347c565b6001600160a01b038116611f595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091f565b611f6281612308565b50565b60006001600160e01b031982166380ac58cd60e01b1480611f9657506001600160e01b03198216635b5e139f60e01b145b80610a6557506301ffc9a760e01b6001600160e01b0319831614610a65565b610abe828260405180602001604052806000815250612625565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612004826110a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906120549190612dba565b915091506120628282611fb5565b505050505050565b6000818152600260205260408120546001600160a01b03166120e35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091f565b60006120ee836110a2565b9050806001600160a01b0316846001600160a01b0316148061213557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806121595750836001600160a01b031661214e84610be3565b6001600160a01b0316145b949350505050565b826001600160a01b0316612174826110a2565b6001600160a01b0316146121d85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161091f565b6001600160a01b03821661223a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161091f565b612245838383612658565b612250600082611fcf565b6001600160a01b038316600090815260036020526040812080546001929061227990849061373f565b90915550506001600160a01b03821660009081526003602052604081208054600192906122a7908490613713565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156123bc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161091f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006124388260115485612710565b9392505050565b61244a848484612161565b61245684848484612726565b610a3a5760405162461bcd60e51b815260040161091f9061342a565b6060600e8054610ad190613782565b6060816124a55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124cf57806124b9816137bd565b91506124c89050600a8361372b565b91506124a9565b6000816001600160401b038111156124e9576124e9613844565b6040519080825280601f01601f191660200182016040528015612513576020820181803683370190505b5090505b84156121595761252860018361373f565b9150612535600a866137d8565b612540906030613713565b60f81b8183815181106125555761255561382e565b60200101906001600160f81b031916908160001a905350612577600a8661372b565b9450612517565b6000612589826110a2565b905061259781600084612658565b6125a2600083611fcf565b6001600160a01b03811660009081526003602052604081208054600192906125cb90849061373f565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61262f8383612833565b61263c6000848484612726565b610d895760405162461bcd60e51b815260040161091f9061342a565b6001600160a01b0383166126b3576126ae81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126d6565b816001600160a01b0316836001600160a01b0316146126d6576126d68382612981565b6001600160a01b0382166126ed57610d8981612a1e565b826001600160a01b0316826001600160a01b031614610d8957610d898282612acd565b60008261271d8584612b11565b14949350505050565b60006001600160a01b0384163b1561282857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061276a9033908990889088906004016133da565b602060405180830381600087803b15801561278457600080fd5b505af19250505080156127b4575060408051601f3d908101601f191682019092526127b191810190612f62565b60015b61280e573d8080156127e2576040519150601f19603f3d011682016040523d82523d6000602084013e6127e7565b606091505b5080516128065760405162461bcd60e51b815260040161091f9061342a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612159565b506001949350505050565b6001600160a01b0382166128895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161091f565b6000818152600260205260409020546001600160a01b0316156128ee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161091f565b6128fa60008383612658565b6001600160a01b0382166000908152600360205260408120805460019290612923908490613713565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161298e84611119565b612998919061373f565b6000838152600760205260409020549091508082146129eb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a309060019061373f565b60008381526009602052604081205460088054939450909284908110612a5857612a5861382e565b906000526020600020015490508060088381548110612a7957612a7961382e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ab157612ab1613818565b6001900381819060005260206000200160009055905550505050565b6000612ad883611119565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b8451811015612b7d576000858281518110612b3357612b3361382e565b60200260200101519050808311612b595760008381526020829052604090209250612b6a565b600081815260208490526040902092505b5080612b75816137bd565b915050612b16565b509392505050565b828054612b9190613782565b90600052602060002090601f016020900481019282612bb35760008555612bf9565b82601f10612bcc57805160ff1916838001178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578251825591602001919060010190612bde565b50612c05929150612c7d565b5090565b828054612c1590613782565b90600052602060002090601f016020900481019282612c375760008555612bf9565b82601f10612c505782800160ff19823516178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578235825591602001919060010190612c62565b5b80821115612c055760008155600101612c7e565b60006001600160401b0380841115612cac57612cac613844565b604051601f8501601f19908116603f01168101908282118183101715612cd457612cd4613844565b81604052809350858152868686011115612ced57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612d1957600080fd5b5081356001600160401b03811115612d3057600080fd5b602083019150836020828501011115612d4857600080fd5b9250929050565b600082601f830112612d6057600080fd5b61243883833560208501612c92565b803561ffff81168114612d8157600080fd5b919050565b80356001600160401b0381168114612d8157600080fd5b600060208284031215612daf57600080fd5b81356124388161385a565b60008060408385031215612dcd57600080fd5b8251612dd88161385a565b6020939093015192949293505050565b60008060408385031215612dfb57600080fd5b8235612e068161385a565b91506020830135612e168161385a565b809150509250929050565b600080600060608486031215612e3657600080fd5b8335612e418161385a565b92506020840135612e518161385a565b929592945050506040919091013590565b60008060008060808587031215612e7857600080fd5b8435612e838161385a565b93506020850135612e938161385a565b92506040850135915060608501356001600160401b03811115612eb557600080fd5b612ec187828801612d4f565b91505092959194509250565b60008060408385031215612ee057600080fd5b8235612eeb8161385a565b915060208301358015158114612e1657600080fd5b60008060408385031215612f1357600080fd5b8235612f1e8161385a565b946020939093013593505050565b600060208284031215612f3e57600080fd5b5035919050565b600060208284031215612f5757600080fd5b81356124388161386f565b600060208284031215612f7457600080fd5b81516124388161386f565b600060208284031215612f9157600080fd5b81356001600160401b03811115612fa757600080fd5b8201601f81018413612fb857600080fd5b61215984823560208401612c92565b600060208284031215612fd957600080fd5b61243882612d6f565b600080600060408486031215612ff757600080fd5b61300084612d6f565b925060208401356001600160401b0381111561301b57600080fd5b61302786828701612d07565b9497909650939450505050565b60008060006060848603121561304957600080fd5b61305284612d6f565b925060208401356001600160401b0381111561306d57600080fd5b61307986828701612d4f565b925050604084013590509250925092565b6000806000806000608086880312156130a257600080fd5b6130ab86612d6f565b945060208601356001600160401b03808211156130c757600080fd5b6130d389838a01612d4f565b95506130e160408901612d86565b945060608801359150808211156130f757600080fd5b5061310488828901612d07565b969995985093965092949392505050565b6000806000806080858703121561312b57600080fd5b61313485612d6f565b935060208501356001600160401b038082111561315057600080fd5b61315c88838901612d4f565b945061316a60408801612d86565b9350606087013591508082111561318057600080fd5b50612ec187828801612d4f565b6000806000806000608086880312156131a557600080fd5b6131ae86612d6f565b94506131bc60208701612d6f565b93506040860135925060608601356001600160401b038111156131de57600080fd5b61310488828901612d07565b600080604083850312156131fd57600080fd5b612f1e83612d6f565b60008060006040848603121561321b57600080fd5b8335925060208401356001600160401b038082111561323957600080fd5b818601915086601f83011261324d57600080fd5b81358181111561325c57600080fd5b8760208260051b850101111561327157600080fd5b6020830194508093505050509250925092565b6000806040838503121561329757600080fd5b505080516020909101519092909150565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526132e9816020860160208601613756565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161331f818460208701613756565b9190910192915050565b600080835461333781613782565b6001828116801561334f57600181146133605761338f565b60ff1984168752828701945061338f565b8760005260208060002060005b858110156133865781548a82015290840190820161336d565b50505082870194505b50929695505050505050565b600083516133ad818460208801613756565b8351908301906133c1818360208801613756565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340d908301846132d1565b9695505050505050565b60208152600061243860208301846132d1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613530908301866132d1565b8415156060840152828103608084015261354a81856132d1565b98975050505050505050565b61ffff841681526040602082015260006135746040830184866132a8565b95945050505050565b61ffff8616815260806020820152600061359a60808301876132d1565b6001600160401b0386166040840152828103606084015261354a8185876132a8565b61ffff851681526080602082015260006135d960808301866132d1565b6001600160401b038516604084015282810360608401526135fa81856132d1565b979650505050505050565b61ffff871681526000602060c0818401526000885461362381613782565b8060c087015260e0600180841660008114613645576001811461365a57613688565b60ff1985168984015261010089019550613688565b8d6000528660002060005b858110156136805781548b8201860152908301908801613665565b8a0184019650505b5050505050838103604085015261369f81896132d1565b9150506136b760608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526136d881856132d1565b9998505050505050505050565b600061ffff8088168352808716602084015250846040830152608060608301526135fa6080830184866132a8565b60008219821115613726576137266137ec565b500190565b60008261373a5761373a613802565b500490565b600082821015613751576137516137ec565b500390565b60005b83811015613771578181015183820152602001613759565b83811115610a3a5750506000910152565b600181811c9082168061379657607f821691505b602082108114156137b757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137d1576137d16137ec565b5060010190565b6000826137e7576137e7613802565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611f6257600080fd5b6001600160e01b031981168114611f6257600080fdfea2646970667358221220e0716177273d14227007f1d11ba18b190e014bf61c974d8f97f60819ba7d776664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f6f6d6e69626f747a2f746f6b656e2f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025b5760003560e01c80637501f74111610144578063c87b56dd116100b6578063d73f057e1161007a578063d73f057e14610754578063e985e9c514610774578063ed816179146107bd578063ee891212146107d2578063f2fde38b146107f2578063f968adbe1461081257600080fd5b8063c87b56dd146106d9578063cbed8b9c146106f9578063cf89fa0314610719578063d1deba1f1461072c578063d547cfb71461073f57600080fd5b8063a0712d6811610108578063a0712d6814610624578063a22cb46514610644578063b45b35d714610664578063b88d4fde14610684578063c4ae3168146106a4578063c7afa661146106b957600080fd5b80637501f7411461053257806381c986ee146105665780638da5cb5b146105865780638ee74912146105a457806395d89b411461060f57600080fd5b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104705780635e280f11146104905780636352211e146104b05780636852a855146104d057806370a08231146104fd578063715018a61461051d57600080fd5b806323b872dd146103d05780632f745c59146103f057806342842e0e1461041057806342d65a8d146104305780634f6ccce71461045057600080fd5b8063081812fc11610224578063081812fc14610319578063095ea7b31461035157806310ddb1371461037157806318160ddd146103915780631c37a822146103b057600080fd5b80621d35671461026057806301ffc9a71461028257806304cc6c78146102b757806306fdde03146102d757806307e0db17146102f9575b600080fd5b34801561026c57600080fd5b5061028061027b366004613115565b610846565b005b34801561028e57600080fd5b506102a261029d366004612f45565b610a40565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102806102d2366004612f2c565b610a6b565b3480156102e357600080fd5b506102ec610ac2565b6040516102ae9190613417565b34801561030557600080fd5b50610280610314366004612fc7565b610b54565b34801561032557600080fd5b50610339610334366004612f2c565b610be3565b6040516001600160a01b0390911681526020016102ae565b34801561035d57600080fd5b5061028061036c366004612f00565b610c78565b34801561037d57600080fd5b5061028061038c366004612fc7565b610d8e565b34801561039d57600080fd5b506008545b6040519081526020016102ae565b3480156103bc57600080fd5b506102806103cb366004613115565b610dec565b3480156103dc57600080fd5b506102806103eb366004612e21565b610e5b565b3480156103fc57600080fd5b506103a261040b366004612f00565b610e8c565b34801561041c57600080fd5b5061028061042b366004612e21565b610f22565b34801561043c57600080fd5b5061028061044b366004612fe2565b610f3d565b34801561045c57600080fd5b506103a261046b366004612f2c565b610fd2565b34801561047c57600080fd5b5061028061048b366004612f7f565b611065565b34801561049c57600080fd5b50600b54610339906001600160a01b031681565b3480156104bc57600080fd5b506103396104cb366004612f2c565b6110a2565b3480156104dc57600080fd5b506103a26104eb366004612d9d565b60106020526000908152604090205481565b34801561050957600080fd5b506103a2610518366004612d9d565b611119565b34801561052957600080fd5b506102806111a0565b34801561053e57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000070881565b34801561057257600080fd5b506102ec610581366004612fc7565b6111d6565b34801561059257600080fd5b50600a546001600160a01b0316610339565b3480156105b057600080fd5b506105fa6105bf366004613034565b600c60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102ae565b34801561061b57600080fd5b506102ec611270565b34801561063057600080fd5b5061028061063f366004612f2c565b61127f565b34801561065057600080fd5b5061028061065f366004612ecd565b611412565b34801561067057600080fd5b5061028061067f366004613206565b61141d565b34801561069057600080fd5b5061028061069f366004612e62565b61166f565b3480156106b057600080fd5b506102806116a1565b3480156106c557600080fd5b506103a26106d43660046131ea565b6116df565b3480156106e557600080fd5b506102ec6106f4366004612f2c565b6117c2565b34801561070557600080fd5b5061028061071436600461318d565b611879565b6102806107273660046131ea565b611914565b61028061073a36600461308a565b611bdd565b34801561074b57600080fd5b506102ec611d6a565b34801561076057600080fd5b5061028061076f366004612fe2565b611d77565b34801561078057600080fd5b506102a261078f366004612de8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c957600080fd5b50610280611e54565b3480156107de57600080fd5b506102806107ed366004612f2c565b611e9b565b3480156107fe57600080fd5b5061028061080d366004612d9d565b611eca565b34801561081e57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000281565b600b546001600160a01b0316331461085d57600080fd5b61ffff84166000908152600d60205260409020805461087b90613782565b905083511480156108ba575061ffff84166000908152600d60205260409081902090516108a89190613329565b60405180910390208380519060200120145b6109285760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906109519087908790879087906004016135bc565b600060405180830381600087803b15801561096b57600080fd5b505af192505050801561097c575060015b610a3a576040518060400160405280825181526020018280519060200120815250600c60008661ffff1661ffff168152602001908152602001600020846040516109c6919061330d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a319086908690869086906135bc565b60405180910390a15b50505050565b60006001600160e01b0319821663780e9d6360e01b1480610a655750610a6582611f65565b92915050565b600a546001600160a01b03163314610a955760405162461bcd60e51b815260040161091f9061347c565b60005b81811015610abe57600f805460010190819055610ab6903390611fb5565b600101610a98565b5050565b606060008054610ad190613782565b80601f0160208091040260200160405190810160405280929190818152602001828054610afd90613782565b8015610b4a5780601f10610b1f57610100808354040283529160200191610b4a565b820191906000526020600020905b815481529060010190602001808311610b2d57829003601f168201915b5050505050905090565b600a546001600160a01b03163314610b7e5760405162461bcd60e51b815260040161091f9061347c565b600b546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b5050505050565b6000818152600260205260408120546001600160a01b0316610c5c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091f565b506000908152600460205260409020546001600160a01b031690565b6000610c83826110a2565b9050806001600160a01b0316836001600160a01b03161415610cf15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161091f565b336001600160a01b0382161480610d0d5750610d0d813361078f565b610d7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161091f565b610d898383611fcf565b505050565b600a546001600160a01b03163314610db85760405162461bcd60e51b815260040161091f9061347c565b600b546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401610bae565b333014610e4f5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161091f565b610a3a8484848461203d565b610e65338261206a565b610e815760405162461bcd60e51b815260040161091f906134b1565b610d89838383612161565b6000610e9783611119565b8210610ef95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161091f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d898383836040518060200160405280600081525061166f565b600a546001600160a01b03163314610f675760405162461bcd60e51b815260040161091f9061347c565b600b546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90610f9b90869086908690600401613556565b600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050505050565b6000610fdd60085490565b82106110405760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161091f565b600882815481106110535761105361382e565b90600052602060002001549050919050565b600a546001600160a01b0316331461108f5760405162461bcd60e51b815260040161091f9061347c565b8051610abe90600e906020840190612b85565b6000818152600260205260408120546001600160a01b031680610a655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161091f565b60006001600160a01b0382166111845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161091f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111ca5760405162461bcd60e51b815260040161091f9061347c565b6111d46000612308565b565b600d60205260009081526040902080546111ef90613782565b80601f016020809104026020016040519081016040528092919081815260200182805461121b90613782565b80156112685780601f1061123d57610100808354040283529160200191611268565b820191906000526020600020905b81548152906001019060200180831161124b57829003601f168201915b505050505081565b606060018054610ad190613782565b60125460ff161561128f57600080fd5b601254610100900460ff16156112de5760405162461bcd60e51b815260206004820152601460248201527343414e545f4d494e545f4f4e5f574c5f53414c4560601b604482015260640161091f565b7f0000000000000000000000000000000000000000000000000000000000000002811115801561133557507f000000000000000000000000000000000000000000000000000000000000000261133333611119565b105b6113755760405162461bcd60e51b815260206004820152601160248201527013d3931657cc97d4115497d5d053131155607a1b604482015260640161091f565b7f000000000000000000000000000000000000000000000000000000000000070881600f546113a49190613713565b11156113e95760405162461bcd60e51b815260206004820152601460248201527326a0ac2fa9aaa828262cafa327a92fa1a420a4a760611b604482015260640161091f565b60005b81811015610abe57600f80546001019081905561140a903390611fb5565b6001016113ec565b610abe33838361235a565b60125460ff161561142d57600080fd5b601254610100900460ff166114845760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374696e67206e6f7420656e61626c65640000000000000000604482015260640161091f565b604080513360601b6bffffffffffffffffffffffff191660208083019190915282516014818403018152603490920190925280519101206114f89083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061242992505050565b6115345760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161091f565b336000908152601060205260409020547f000000000000000000000000000000000000000000000000000000000000000290611571908590613713565b11156115bf5760405162461bcd60e51b815260206004820152601760248201527f45786365656473204d6178204d696e7420616d6f756e74000000000000000000604482015260640161091f565b7f000000000000000000000000000000000000000000000000000000000000070883600f546115ee9190613713565b11156116335760405162461bcd60e51b815260206004820152601460248201527326a0ac2fa9aaa828262cafa327a92fa1a420a4a760611b604482015260640161091f565b3360009081526010602052604081208054850190555b83811015610a3a57600f805460010190819055611667903390611fb5565b600101611649565b611679338361206a565b6116955760405162461bcd60e51b815260040161091f906134b1565b610a3a8484848461243f565b600a546001600160a01b031633146116cb5760405162461bcd60e51b815260040161091f9061347c565b6012805460ff19811660ff90911615179055565b60408051336020820152808201839052815180820383018152606082018352600160f01b60808301526205573060828084018290528451808503909101815260a2840194859052600b5463040a7bb160e41b909552600094929360019386916001600160a01b03909116906340a7bb1090611766908b9030908a908790899060a601613502565b604080518083038186803b15801561177d57600080fd5b505afa158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613284565b5098975050505050505050565b6000818152600260205260409020546060906001600160a01b03166118415760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161091f565b611849612472565b61185283612481565b60405160200161186392919061339b565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146118a35760405162461bcd60e51b815260040161091f9061347c565b600b546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906118db90889088908890889088906004016136e5565b600060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050505050505050565b61191d816110a2565b6001600160a01b0316336001600160a01b03161461198f5760405162461bcd60e51b815260206004820152602960248201527f4d6573736167652073656e646572206d757374206f776e20746865204f6d6e6960448201526831b430b4b727232a1760b91b606482015260840161091f565b61ffff82166000908152600d6020526040902080546119ad90613782565b15159050611a105760405162461bcd60e51b815260206004820152602a60248201527f5468697320636861696e206973206e6f742061207472757374656420736f757260448201526931b29039b7bab931b29760b11b606482015260840161091f565b611a198161257e565b60408051336020820152808201839052815180820383018152606082018352600160f01b60808301526205573060828084018290528451808503909101815260a2840194859052600b5463040a7bb160e41b90955291936001939192916000916001600160a01b0316906340a7bb1090611a9f908a9030908a908790899060a601613502565b604080518083038186803b158015611ab657600080fd5b505afa158015611aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aee9190613284565b50905080341015611b575760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f7567682067617320746f20636f7665722063726f737320636860448201526c30b4b7103a3930b739b332b91760991b606482015260840161091f565b600b5461ffff88166000908152600d6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611ba2928d928c913391908b90600401613605565b6000604051808303818588803b158015611bbb57600080fd5b505af1158015611bcf573d6000803e3d6000fd5b505050505050505050505050565b61ffff85166000908152600c60205260408082209051611bfe90879061330d565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611c855760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161091f565b805482148015611caf575080600101548383604051611ca59291906132fd565b6040518091039020145b611cfb5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161091f565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611d30908990899089908990899060040161357d565b600060405180830381600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b50505050505050505050565b600e80546111ef90613782565b600a546001600160a01b03163314611da15760405162461bcd60e51b815260040161091f9061347c565b61ffff83166000908152600d602052604090208054611dbf90613782565b159050611e36576040805162461bcd60e51b81526020600482015260248101919091527f546865207472757374656420736f75726365206164647265737320686173206160448201527f6c7265616479206265656e2073657420666f722074686520636861696e496421606482015260840161091f565b61ffff83166000908152600d60205260409020610a3a908383612c09565b600a546001600160a01b03163314611e7e5760405162461bcd60e51b815260040161091f9061347c565b6012805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611ec55760405162461bcd60e51b815260040161091f9061347c565b601155565b600a546001600160a01b03163314611ef45760405162461bcd60e51b815260040161091f9061347c565b6001600160a01b038116611f595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091f565b611f6281612308565b50565b60006001600160e01b031982166380ac58cd60e01b1480611f9657506001600160e01b03198216635b5e139f60e01b145b80610a6557506301ffc9a760e01b6001600160e01b0319831614610a65565b610abe828260405180602001604052806000815250612625565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612004826110a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906120549190612dba565b915091506120628282611fb5565b505050505050565b6000818152600260205260408120546001600160a01b03166120e35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091f565b60006120ee836110a2565b9050806001600160a01b0316846001600160a01b0316148061213557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806121595750836001600160a01b031661214e84610be3565b6001600160a01b0316145b949350505050565b826001600160a01b0316612174826110a2565b6001600160a01b0316146121d85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161091f565b6001600160a01b03821661223a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161091f565b612245838383612658565b612250600082611fcf565b6001600160a01b038316600090815260036020526040812080546001929061227990849061373f565b90915550506001600160a01b03821660009081526003602052604081208054600192906122a7908490613713565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156123bc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161091f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006124388260115485612710565b9392505050565b61244a848484612161565b61245684848484612726565b610a3a5760405162461bcd60e51b815260040161091f9061342a565b6060600e8054610ad190613782565b6060816124a55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124cf57806124b9816137bd565b91506124c89050600a8361372b565b91506124a9565b6000816001600160401b038111156124e9576124e9613844565b6040519080825280601f01601f191660200182016040528015612513576020820181803683370190505b5090505b84156121595761252860018361373f565b9150612535600a866137d8565b612540906030613713565b60f81b8183815181106125555761255561382e565b60200101906001600160f81b031916908160001a905350612577600a8661372b565b9450612517565b6000612589826110a2565b905061259781600084612658565b6125a2600083611fcf565b6001600160a01b03811660009081526003602052604081208054600192906125cb90849061373f565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61262f8383612833565b61263c6000848484612726565b610d895760405162461bcd60e51b815260040161091f9061342a565b6001600160a01b0383166126b3576126ae81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126d6565b816001600160a01b0316836001600160a01b0316146126d6576126d68382612981565b6001600160a01b0382166126ed57610d8981612a1e565b826001600160a01b0316826001600160a01b031614610d8957610d898282612acd565b60008261271d8584612b11565b14949350505050565b60006001600160a01b0384163b1561282857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061276a9033908990889088906004016133da565b602060405180830381600087803b15801561278457600080fd5b505af19250505080156127b4575060408051601f3d908101601f191682019092526127b191810190612f62565b60015b61280e573d8080156127e2576040519150601f19603f3d011682016040523d82523d6000602084013e6127e7565b606091505b5080516128065760405162461bcd60e51b815260040161091f9061342a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612159565b506001949350505050565b6001600160a01b0382166128895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161091f565b6000818152600260205260409020546001600160a01b0316156128ee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161091f565b6128fa60008383612658565b6001600160a01b0382166000908152600360205260408120805460019290612923908490613713565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161298e84611119565b612998919061373f565b6000838152600760205260409020549091508082146129eb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a309060019061373f565b60008381526009602052604081205460088054939450909284908110612a5857612a5861382e565b906000526020600020015490508060088381548110612a7957612a7961382e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ab157612ab1613818565b6001900381819060005260206000200160009055905550505050565b6000612ad883611119565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b8451811015612b7d576000858281518110612b3357612b3361382e565b60200260200101519050808311612b595760008381526020829052604090209250612b6a565b600081815260208490526040902092505b5080612b75816137bd565b915050612b16565b509392505050565b828054612b9190613782565b90600052602060002090601f016020900481019282612bb35760008555612bf9565b82601f10612bcc57805160ff1916838001178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578251825591602001919060010190612bde565b50612c05929150612c7d565b5090565b828054612c1590613782565b90600052602060002090601f016020900481019282612c375760008555612bf9565b82601f10612c505782800160ff19823516178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578235825591602001919060010190612c62565b5b80821115612c055760008155600101612c7e565b60006001600160401b0380841115612cac57612cac613844565b604051601f8501601f19908116603f01168101908282118183101715612cd457612cd4613844565b81604052809350858152868686011115612ced57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612d1957600080fd5b5081356001600160401b03811115612d3057600080fd5b602083019150836020828501011115612d4857600080fd5b9250929050565b600082601f830112612d6057600080fd5b61243883833560208501612c92565b803561ffff81168114612d8157600080fd5b919050565b80356001600160401b0381168114612d8157600080fd5b600060208284031215612daf57600080fd5b81356124388161385a565b60008060408385031215612dcd57600080fd5b8251612dd88161385a565b6020939093015192949293505050565b60008060408385031215612dfb57600080fd5b8235612e068161385a565b91506020830135612e168161385a565b809150509250929050565b600080600060608486031215612e3657600080fd5b8335612e418161385a565b92506020840135612e518161385a565b929592945050506040919091013590565b60008060008060808587031215612e7857600080fd5b8435612e838161385a565b93506020850135612e938161385a565b92506040850135915060608501356001600160401b03811115612eb557600080fd5b612ec187828801612d4f565b91505092959194509250565b60008060408385031215612ee057600080fd5b8235612eeb8161385a565b915060208301358015158114612e1657600080fd5b60008060408385031215612f1357600080fd5b8235612f1e8161385a565b946020939093013593505050565b600060208284031215612f3e57600080fd5b5035919050565b600060208284031215612f5757600080fd5b81356124388161386f565b600060208284031215612f7457600080fd5b81516124388161386f565b600060208284031215612f9157600080fd5b81356001600160401b03811115612fa757600080fd5b8201601f81018413612fb857600080fd5b61215984823560208401612c92565b600060208284031215612fd957600080fd5b61243882612d6f565b600080600060408486031215612ff757600080fd5b61300084612d6f565b925060208401356001600160401b0381111561301b57600080fd5b61302786828701612d07565b9497909650939450505050565b60008060006060848603121561304957600080fd5b61305284612d6f565b925060208401356001600160401b0381111561306d57600080fd5b61307986828701612d4f565b925050604084013590509250925092565b6000806000806000608086880312156130a257600080fd5b6130ab86612d6f565b945060208601356001600160401b03808211156130c757600080fd5b6130d389838a01612d4f565b95506130e160408901612d86565b945060608801359150808211156130f757600080fd5b5061310488828901612d07565b969995985093965092949392505050565b6000806000806080858703121561312b57600080fd5b61313485612d6f565b935060208501356001600160401b038082111561315057600080fd5b61315c88838901612d4f565b945061316a60408801612d86565b9350606087013591508082111561318057600080fd5b50612ec187828801612d4f565b6000806000806000608086880312156131a557600080fd5b6131ae86612d6f565b94506131bc60208701612d6f565b93506040860135925060608601356001600160401b038111156131de57600080fd5b61310488828901612d07565b600080604083850312156131fd57600080fd5b612f1e83612d6f565b60008060006040848603121561321b57600080fd5b8335925060208401356001600160401b038082111561323957600080fd5b818601915086601f83011261324d57600080fd5b81358181111561325c57600080fd5b8760208260051b850101111561327157600080fd5b6020830194508093505050509250925092565b6000806040838503121561329757600080fd5b505080516020909101519092909150565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526132e9816020860160208601613756565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161331f818460208701613756565b9190910192915050565b600080835461333781613782565b6001828116801561334f57600181146133605761338f565b60ff1984168752828701945061338f565b8760005260208060002060005b858110156133865781548a82015290840190820161336d565b50505082870194505b50929695505050505050565b600083516133ad818460208801613756565b8351908301906133c1818360208801613756565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340d908301846132d1565b9695505050505050565b60208152600061243860208301846132d1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613530908301866132d1565b8415156060840152828103608084015261354a81856132d1565b98975050505050505050565b61ffff841681526040602082015260006135746040830184866132a8565b95945050505050565b61ffff8616815260806020820152600061359a60808301876132d1565b6001600160401b0386166040840152828103606084015261354a8185876132a8565b61ffff851681526080602082015260006135d960808301866132d1565b6001600160401b038516604084015282810360608401526135fa81856132d1565b979650505050505050565b61ffff871681526000602060c0818401526000885461362381613782565b8060c087015260e0600180841660008114613645576001811461365a57613688565b60ff1985168984015261010089019550613688565b8d6000528660002060005b858110156136805781548b8201860152908301908801613665565b8a0184019650505b5050505050838103604085015261369f81896132d1565b9150506136b760608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526136d881856132d1565b9998505050505050505050565b600061ffff8088168352808716602084015250846040830152608060608301526135fa6080830184866132a8565b60008219821115613726576137266137ec565b500190565b60008261373a5761373a613802565b500490565b600082821015613751576137516137ec565b500390565b60005b83811015613771578181015183820152602001613759565b83811115610a3a5750506000910152565b600181811c9082168061379657607f821691505b602082108114156137b757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137d1576137d16137ec565b5060010190565b6000826137e7576137e7613802565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611f6257600080fd5b6001600160e01b031981168114611f6257600080fdfea2646970667358221220e0716177273d14227007f1d11ba18b190e014bf61c974d8f97f60819ba7d776664736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f6f6d6e69626f747a2f746f6b656e2f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://us-central1-mofos-69a62.cloudfunctions.net/app/omnibotz/token/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [2] : _startToken (uint256): 1
Arg [3] : _maxMint (uint256): 1800

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [5] : 68747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e
Arg [6] : 636c6f756466756e6374696f6e732e6e65742f6170702f6f6d6e69626f747a2f
Arg [7] : 746f6b656e2f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59644:6885:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16935:935;;;;;;;;;;-1:-1:-1;16935:935:0;;;;;:::i;:::-;;:::i;:::-;;53381:224;;;;;;;;;;-1:-1:-1;53381:224:0;;;;;:::i;:::-;;:::i;:::-;;;14490:14:1;;14483:22;14465:41;;14453:2;14438:18;53381:224:0;;;;;;;;62405:220;;;;;;;;;;-1:-1:-1;62405:220:0;;;;;:::i;:::-;;:::i;40200:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;65888:121::-;;;;;;;;;;-1:-1:-1;65888:121:0;;;;;:::i;:::-;;:::i;41760:221::-;;;;;;;;;;-1:-1:-1;41760:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13509:32:1;;;13491:51;;13479:2;13464:18;41760:221:0;13345:203:1;41283:411:0;;;;;;;;;;-1:-1:-1;41283:411:0;;;;;:::i;:::-;;:::i;66017:127::-;;;;;;;;;;-1:-1:-1;66017:127:0;;;;;:::i;:::-;;:::i;54021:113::-;;;;;;;;;;-1:-1:-1;54109:10:0;:17;54021:113;;;32222:25:1;;;32210:2;32195:18;54021:113:0;32076:177:1;17878:318:0;;;;;;;;;;-1:-1:-1;17878:318:0;;;;;:::i;:::-;;:::i;42510:339::-;;;;;;;;;;-1:-1:-1;42510:339:0;;;;;:::i;:::-;;:::i;53689:256::-;;;;;;;;;;-1:-1:-1;53689:256:0;;;;;:::i;:::-;;:::i;42920:185::-;;;;;;;;;;-1:-1:-1;42920:185:0;;;;;:::i;:::-;;:::i;66152:176::-;;;;;;;;;;-1:-1:-1;66152:176:0;;;;;:::i;:::-;;:::i;54211:233::-;;;;;;;;;;-1:-1:-1;54211:233:0;;;;;:::i;:::-;;:::i;64691:113::-;;;;;;;;;;-1:-1:-1;64691:113:0;;;;;:::i;:::-;;:::i;16385:34::-;;;;;;;;;;-1:-1:-1;16385:34:0;;;;-1:-1:-1;;;;;16385:34:0;;;39894:239;;;;;;;;;;-1:-1:-1;39894:239:0;;;;;:::i;:::-;;:::i;59925:51::-;;;;;;;;;;-1:-1:-1;59925:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;39624:208;;;;;;;;;;-1:-1:-1;39624:208:0;;;;;:::i;:::-;;:::i;15392:103::-;;;;;;;;;;;;;:::i;59842:32::-;;;;;;;;;;;;;;;16622:51;;;;;;;;;;-1:-1:-1;16622:51:0;;;;;:::i;:::-;;:::i;14741:87::-;;;;;;;;;;-1:-1:-1;14814:6:0;;-1:-1:-1;;;;;14814:6:0;14741:87;;16525:90;;;;;;;;;;-1:-1:-1;16525:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32432:25:1;;;32488:2;32473:18;;32466:34;;;;32405:18;16525:90:0;32258:248:1;40369:104:0;;;;;;;;;;;;;:::i;61014:466::-;;;;;;;;;;-1:-1:-1;61014:466:0;;;;;:::i;:::-;;:::i;42053:155::-;;;;;;;;;;-1:-1:-1;42053:155:0;;;;;:::i;:::-;;:::i;61551:846::-;;;;;;;;;;-1:-1:-1;61551:846:0;;;;;:::i;:::-;;:::i;43176:328::-;;;;;;;;;;-1:-1:-1;43176:328:0;;;;;:::i;:::-;;:::i;66337:75::-;;;;;;;;;;;;;:::i;64167:441::-;;;;;;;;;;-1:-1:-1;64167:441:0;;;;;:::i;:::-;;:::i;64963:269::-;;;;;;;;;;-1:-1:-1;64963:269:0;;;;;:::i;:::-;;:::i;65632:248::-;;;;;;;;;;-1:-1:-1;65632:248:0;;;;;:::i;:::-;;:::i;62633:1526::-;;;;;;:::i;:::-;;:::i;18517:758::-;;;;;;:::i;:::-;;:::i;59783:26::-;;;;;;;;;;;;;:::i;19283:287::-;;;;;;;;;;-1:-1:-1;19283:287:0;;;;;:::i;:::-;;:::i;42279:164::-;;;;;;;;;;-1:-1:-1;42279:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42400:25:0;;;42376:4;42400:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42279:164;66420:99;;;;;;;;;;;;;:::i;65521:101::-;;;;;;;;;;-1:-1:-1;65521:101:0;;;;;:::i;:::-;;:::i;15650:201::-;;;;;;;;;;-1:-1:-1;15650:201:0;;;;;:::i;:::-;;:::i;59881:37::-;;;;;;;;;;;;;;;16935:935;17097:8;;-1:-1:-1;;;;;17097:8:0;17075:10;:31;17067:40;;;;;;17218:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;17196:11;:18;:61;:134;;;;-1:-1:-1;17297:32:0;;;;;;;:19;:32;;;;;;;17287:43;;;;17297:32;17287:43;:::i;:::-;;;;;;;;17271:11;17261:22;;;;;;:69;17196:134;17188:199;;;;-1:-1:-1;;;17188:199:0;;23592:2:1;17188:199:0;;;23574:21:1;23631:2;23611:18;;;23604:30;23670:34;23650:18;;;23643:62;-1:-1:-1;;;23721:18:1;;;23714:50;23781:19;;17188:199:0;;;;;;;;;17515:60;;-1:-1:-1;;;17515:60:0;;:4;;:16;;:60;;17532:11;;17545;;17558:6;;17566:8;;17515:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17511:352;;17722:52;;;;;;;;17737:8;:15;17722:52;;;;17764:8;17754:19;;;;;;17722:52;;;17671:14;:27;17686:11;17671:27;;;;;;;;;;;;;;;17699:11;17671:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17671:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;17794:57;;;;17808:11;;17821;;17712:6;;17842:8;;17794:57;:::i;:::-;;;;;;;;17511:352;16935:935;;;;:::o;53381:224::-;53483:4;-1:-1:-1;;;;;;53507:50:0;;-1:-1:-1;;;53507:50:0;;:90;;;53561:36;53585:11;53561:23;:36::i;:::-;53500:97;53381:224;-1:-1:-1;;53381:224:0:o;62405:220::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;62500:9:::1;62496:109;62519:8;62515:1;:12;62496:109;;;62577:11;62575:13:::0;;::::1;;::::0;;;;62553:36:::1;::::0;62563:10:::1;::::0;62553:9:::1;:36::i;:::-;62529:3;;62496:109;;;;62405:220:::0;:::o;40200:100::-;40254:13;40287:5;40280:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40200:100;:::o;65888:121::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;65968:8:::1;::::0;:33:::1;::::0;-1:-1:-1;;;65968:33:0;;27928:6:1;27916:19;;65968:33:0::1;::::0;::::1;27898:38:1::0;-1:-1:-1;;;;;65968:8:0;;::::1;::::0;:23:::1;::::0;27871:18:1;;65968:33:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65888:121:::0;:::o;41760:221::-;41836:7;45103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45103:16:0;41856:73;;;;-1:-1:-1;;;41856:73:0;;22818:2:1;41856:73:0;;;22800:21:1;22857:2;22837:18;;;22830:30;22896:34;22876:18;;;22869:62;-1:-1:-1;;;22947:18:1;;;22940:42;22999:19;;41856:73:0;22616:408:1;41856:73:0;-1:-1:-1;41949:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41949:24:0;;41760:221::o;41283:411::-;41364:13;41380:23;41395:7;41380:14;:23::i;:::-;41364:39;;41428:5;-1:-1:-1;;;;;41422:11:0;:2;-1:-1:-1;;;;;41422:11:0;;;41414:57;;;;-1:-1:-1;;;41414:57:0;;24429:2:1;41414:57:0;;;24411:21:1;24468:2;24448:18;;;24441:30;24507:34;24487:18;;;24480:62;-1:-1:-1;;;24558:18:1;;;24551:31;24599:19;;41414:57:0;24227:397:1;41414:57:0;13545:10;-1:-1:-1;;;;;41506:21:0;;;;:62;;-1:-1:-1;41531:37:0;41548:5;13545:10;42279:164;:::i;41531:37::-;41484:168;;;;-1:-1:-1;;;41484:168:0;;20799:2:1;41484:168:0;;;20781:21:1;20838:2;20818:18;;;20811:30;20877:34;20857:18;;;20850:62;20948:26;20928:18;;;20921:54;20992:19;;41484:168:0;20597:420:1;41484:168:0;41665:21;41674:2;41678:7;41665:8;:21::i;:::-;41353:341;41283:411;;:::o;66017:127::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;66100:8:::1;::::0;:36:::1;::::0;-1:-1:-1;;;66100:36:0;;27928:6:1;27916:19;;66100:36:0::1;::::0;::::1;27898:38:1::0;-1:-1:-1;;;;;66100:8:0;;::::1;::::0;:26:::1;::::0;27871:18:1;;66100:36:0::1;27754:188:1::0;17878:318:0;18047:10;18069:4;18047:27;18039:83;;;;-1:-1:-1;;;18039:83:0;;22045:2:1;18039:83:0;;;22027:21:1;22084:2;22064:18;;;22057:30;22123:34;22103:18;;;22096:62;-1:-1:-1;;;22174:18:1;;;22167:41;22225:19;;18039:83:0;21843:407:1;18039:83:0;18133:55;18145:11;18158;18171:6;18179:8;18133:10;:55::i;42510:339::-;42705:41;13545:10;42738:7;42705:18;:41::i;:::-;42697:103;;;;-1:-1:-1;;;42697:103:0;;;;;;;:::i;:::-;42813:28;42823:4;42829:2;42833:7;42813:9;:28::i;53689:256::-;53786:7;53822:23;53839:5;53822:16;:23::i;:::-;53814:5;:31;53806:87;;;;-1:-1:-1;;;53806:87:0;;15752:2:1;53806:87:0;;;15734:21:1;15791:2;15771:18;;;15764:30;15830:34;15810:18;;;15803:62;-1:-1:-1;;;15881:18:1;;;15874:41;15932:19;;53806:87:0;15550:407:1;53806:87:0;-1:-1:-1;;;;;;53911:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;53689:256::o;42920:185::-;43058:39;43075:4;43081:2;43085:7;43058:39;;;;;;;;;;;;:16;:39::i;66152:176::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;66267:8:::1;::::0;:53:::1;::::0;-1:-1:-1;;;66267:53:0;;-1:-1:-1;;;;;66267:8:0;;::::1;::::0;:27:::1;::::0;:53:::1;::::0;66295:11;;66308;;;;66267:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66152:176:::0;;;:::o;54211:233::-;54286:7;54322:30;54109:10;:17;;54021:113;54322:30;54314:5;:38;54306:95;;;;-1:-1:-1;;;54306:95:0;;25249:2:1;54306:95:0;;;25231:21:1;25288:2;25268:18;;;25261:30;25327:34;25307:18;;;25300:62;-1:-1:-1;;;25378:18:1;;;25371:42;25430:19;;54306:95:0;25047:408:1;54306:95:0;54419:10;54430:5;54419:17;;;;;;;;:::i;:::-;;;;;;;;;54412:24;;54211:233;;;:::o;64691:113::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;64768:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;39894:239::-:0;39966:7;40002:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40002:16:0;40037:19;40029:73;;;;-1:-1:-1;;;40029:73:0;;21635:2:1;40029:73:0;;;21617:21:1;21674:2;21654:18;;;21647:30;21713:34;21693:18;;;21686:62;-1:-1:-1;;;21764:18:1;;;21757:39;21813:19;;40029:73:0;21433:405:1;39624:208:0;39696:7;-1:-1:-1;;;;;39724:19:0;;39716:74;;;;-1:-1:-1;;;39716:74:0;;21224:2:1;39716:74:0;;;21206:21:1;21263:2;21243:18;;;21236:30;21302:34;21282:18;;;21275:62;-1:-1:-1;;;21353:18:1;;;21346:40;21403:19;;39716:74:0;21022:406:1;39716:74:0;-1:-1:-1;;;;;;39808:16:0;;;;;:9;:16;;;;;;;39624:208::o;15392:103::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;15457:30:::1;15484:1;15457:18;:30::i;:::-;15392:103::o:0;16622:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40369:104::-;40425:13;40458:7;40451:14;;;;;:::i;61014:466::-;61075:6;;;;61074:7;61066:16;;;;;;61102;;;;;;;61101:17;61093:50;;;;-1:-1:-1;;;61093:50:0;;27607:2:1;61093:50:0;;;27589:21:1;27646:2;27626:18;;;27619:30;-1:-1:-1;;;27665:18:1;;;27658:50;27725:18;;61093:50:0;27405:344:1;61093:50:0;61174:8;61162;:20;;:56;;;;;61210:8;61186:21;61196:10;61186:9;:21::i;:::-;:32;61162:56;61154:86;;;;-1:-1:-1;;;61154:86:0;;19626:2:1;61154:86:0;;;19608:21:1;19665:2;19645:18;;;19638:30;-1:-1:-1;;;19684:18:1;;;19677:47;19741:18;;61154:86:0;19424:341:1;61154:86:0;61285:7;61273:8;61259:11;;:22;;;;:::i;:::-;:33;;61251:66;;;;-1:-1:-1;;;61251:66:0;;18163:2:1;61251:66:0;;;18145:21:1;18202:2;18182:18;;;18175:30;-1:-1:-1;;;18221:18:1;;;18214:50;18281:18;;61251:66:0;17961:344:1;61251:66:0;61357:9;61353:109;61376:8;61372:1;:12;61353:109;;;61434:11;61432:13;;;;;;;;61410:36;;61420:10;;61410:9;:36::i;:::-;61386:3;;61353:109;;42053:155;42148:52;13545:10;42181:8;42191;42148:18;:52::i;61551:846::-;61641:6;;;;61640:7;61632:16;;;;;;61671;;;;;;;61663:53;;;;-1:-1:-1;;;61663:53:0;;15399:2:1;61663:53:0;;;15381:21:1;15438:2;15418:18;;;15411:30;15477:26;15457:18;;;15450:54;15521:18;;61663:53:0;15197:348:1;61663:53:0;60915:25;;;61782:10;10966:2:1;10962:15;-1:-1:-1;;10958:53:1;60915:25:0;;;;10946:66:1;;;;60915:25:0;;;;;;;;;11028:12:1;;;;60915:25:0;;;60905:36;;;;;61768:33;;61795:5;;61768:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61768:7:0;;-1:-1:-1;;;61768:33:0:i;:::-;61738:120;;;;-1:-1:-1;;;61738:120:0;;26913:2:1;61738:120:0;;;26895:21:1;26952:2;26932:18;;;26925:30;-1:-1:-1;;;26971:18:1;;;26964:43;27024:18;;61738:120:0;26711:337:1;61738:120:0;61925:10;61908:28;;;;:16;:28;;;;;;61977:8;;61908:39;;61939:8;;61908:39;:::i;:::-;61907:78;;61877:175;;;;-1:-1:-1;;;61877:175:0;;27255:2:1;61877:175:0;;;27237:21:1;27294:2;27274:18;;;27267:30;27333:25;27313:18;;;27306:53;27376:18;;61877:175:0;27053:347:1;61877:175:0;62106:7;62094:8;62080:11;;:22;;;;:::i;:::-;:33;;62072:66;;;;-1:-1:-1;;;62072:66:0;;18163:2:1;62072:66:0;;;18145:21:1;18202:2;18182:18;;;18175:30;-1:-1:-1;;;18221:18:1;;;18214:50;18281:18;;62072:66:0;17961:344:1;62072:66:0;62233:10;62216:28;;;;:16;:28;;;;;;;:39;;62185:70;;62270:109;62293:8;62289:1;:12;62270:109;;;62351:11;62349:13;;;;;;;;62327:36;;62337:10;;62327:9;:36::i;:::-;62303:3;;62270:109;;43176:328;43351:41;13545:10;43384:7;43351:18;:41::i;:::-;43343:103;;;;-1:-1:-1;;;43343:103:0;;;;;;;:::i;:::-;43457:39;43471:4;43477:2;43481:7;43490:5;43457:13;:39::i;66337:75::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;66398:6:::1;::::0;;-1:-1:-1;;66388:16:0;::::1;66398:6;::::0;;::::1;66397:7;66388:16;::::0;;66337:75::o;64167:441::-;64288:31;;;64299:10;64288:31;;;14220:51:1;14287:18;;;14280:34;;;64288:31:0;;;;;;;;;14193:18:1;;;64288:31:0;;-1:-1:-1;;;64416:30:0;;;13219:51:1;64370:6:0;13286:11:1;;;;13279:27;;;64416:30:0;;;;;;;;;;13322:12:1;;;64416:30:0;;;;64487:8;;-1:-1:-1;;;64487:77:0;;;-1:-1:-1;;64288:31:0;;64347:1;;-1:-1:-1;;;;;;;64487:8:0;;;;:21;;:77;;64509:8;;64527:4;;64288:31;;-1:-1:-1;;64416:30:0;;64487:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64457:107:0;64167:441;-1:-1:-1;;;;;;;;64167:441:0:o;64963:269::-;45079:4;45103:16;;;:7;:16;;;;;;65037:13;;-1:-1:-1;;;;;45103:16:0;65063:77;;;;-1:-1:-1;;;65063:77:0;;24013:2:1;65063:77:0;;;23995:21:1;24052:2;24032:18;;;24025:30;24091:34;24071:18;;;24064:62;-1:-1:-1;;;24142:18:1;;;24135:45;24197:19;;65063:77:0;23811:411:1;65063:77:0;65182:10;:8;:10::i;:::-;65194:19;:8;:17;:19::i;:::-;65165:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65151:73;;64963:269;;;:::o;65632:248::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;65812:8:::1;::::0;:60:::1;::::0;-1:-1:-1;;;65812:60:0;;-1:-1:-1;;;;;65812:8:0;;::::1;::::0;:18:::1;::::0;:60:::1;::::0;65831:8;;65841;;65851:11;;65864:7;;;;65812:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65632:248:::0;;;;;:::o;62633:1526::-;62764:16;62772:7;62764;:16::i;:::-;-1:-1:-1;;;;;62750:30:0;:10;-1:-1:-1;;;;;62750:30:0;;62742:84;;;;-1:-1:-1;;;62742:84:0;;17396:2:1;62742:84:0;;;17378:21:1;17435:2;17415:18;;;17408:30;17474:34;17454:18;;;17447:62;-1:-1:-1;;;17525:18:1;;;17518:39;17574:19;;62742:84:0;17194:405:1;62742:84:0;62845:29;;;;;;;:19;:29;;;;;:36;;;;;:::i;:::-;:41;;;-1:-1:-1;62837:96:0;;;;-1:-1:-1;;;62837:96:0;;25662:2:1;62837:96:0;;;25644:21:1;25701:2;25681:18;;;25674:30;25740:34;25720:18;;;25713:62;-1:-1:-1;;;25791:18:1;;;25784:40;25841:19;;62837:96:0;25460:406:1;62837:96:0;62985:14;62991:7;62985:5;:14::i;:::-;63098:31;;;63109:10;63098:31;;;14220:51:1;14287:18;;;14280:34;;;63098:31:0;;;;;;;;;14193:18:1;;;63098:31:0;;-1:-1:-1;;;63374:30:0;;;13219:51:1;63328:6:0;13286:11:1;;;;13279:27;;;63374:30:0;;;;;;;;;;13322:12:1;;;63374:30:0;;;;63511:8;;-1:-1:-1;;;63511:77:0;;;63098:31;;63305:1;;63328:6;;63374:30;-1:-1:-1;;;;;;;63511:8:0;;:21;;:77;;63533:8;;63551:4;;63098:31;;-1:-1:-1;;63374:30:0;;63511:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63481:107;;;63622:18;63609:9;:31;;63601:89;;;;-1:-1:-1;;;63601:89:0;;20385:2:1;63601:89:0;;;20367:21:1;20424:2;20404:18;;;20397:30;20463:34;20443:18;;;20436:62;-1:-1:-1;;;20514:18:1;;;20507:43;20567:19;;63601:89:0;20183:409:1;63601:89:0;63703:8;;63815:29;;;63703:8;63815:29;;;:19;:29;;;;;;63703:448;;-1:-1:-1;;;63703:448:0;;-1:-1:-1;;;;;63703:8:0;;;;:13;;63723:9;;63703:448;;63748:8;;63898:7;;63975:10;;63703:8;64093:13;;63703:448;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62731:1428;;;;;62633:1526;;:::o;18517:758::-;18733:27;;;18698:32;18733:27;;;:14;:27;;;;;;:40;;;;18761:11;;18733:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18733:48:0;;;;;;;;;;18800:21;;;;18733:48;;-1:-1:-1;18792:86:0;;;;-1:-1:-1;;;18792:86:0;;26506:2:1;18792:86:0;;;26488:21:1;26545:2;26525:18;;;26518:30;26584:34;26564:18;;;26557:62;-1:-1:-1;;;26635:18:1;;;26628:36;26681:19;;18792:86:0;26304:402:1;18792:86:0;18916:23;;18897:42;;:90;;;;;18966:9;:21;;;18953:8;;18943:19;;;;;;;:::i;:::-;;;;;;;;:44;18897:90;18889:129;;;;-1:-1:-1;;;18889:129:0;;19271:2:1;18889:129:0;;;19253:21:1;19310:2;19290:18;;;19283:30;19349:28;19329:18;;;19322:56;19395:18;;18889:129:0;19069:350:1;18889:129:0;19092:1;19066:27;;;19104:21;;;:34;19207:60;;-1:-1:-1;;;19207:60:0;;:4;;:16;;:60;;19224:11;;19237;;19250:6;;19258:8;;;;19207:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18642:633;18517:758;;;;;:::o;59783:26::-;;;;;;;:::i;19283:287::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;19395:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;::::1;::::0;::::1;:::i;:::-;:41:::0;;-1:-1:-1;19387:118:0::1;;;::::0;;-1:-1:-1;;;19387:118:0;;26073:2:1;19387:118:0::1;::::0;::::1;26055:21:1::0;26092:18;;;26085:30;;;;26151:34;26131:18;;;26124:62;26222:34;26202:18;;;26195:62;26274:19;;19387:118:0::1;25871:428:1::0;19387:118:0::1;19516:29;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;19548:14;;19516:46:::1;:::i;66420:99::-:0;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;66495:16:::1;::::0;;-1:-1:-1;;66475:36:0;::::1;66495:16;::::0;;;::::1;;;66494:17;66475:36:::0;;::::1;;::::0;;66420:99::o;65521:101::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;65593:13:::1;:21:::0;65521:101::o;15650:201::-;14814:6;;-1:-1:-1;;;;;14814:6:0;13545:10;14961:23;14953:68;;;;-1:-1:-1;;;14953:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15739:22:0;::::1;15731:73;;;::::0;-1:-1:-1;;;15731:73:0;;16583:2:1;15731:73:0::1;::::0;::::1;16565:21:1::0;16622:2;16602:18;;;16595:30;16661:34;16641:18;;;16634:62;-1:-1:-1;;;16712:18:1;;;16705:36;16758:19;;15731:73:0::1;16381:402:1::0;15731:73:0::1;15815:28;15834:8;15815:18;:28::i;:::-;15650:201:::0;:::o;39255:305::-;39357:4;-1:-1:-1;;;;;;39394:40:0;;-1:-1:-1;;;39394:40:0;;:105;;-1:-1:-1;;;;;;;39451:48:0;;-1:-1:-1;;;39451:48:0;39394:105;:158;;;-1:-1:-1;;;;;;;;;;31023:40:0;;;39516:36;30914:157;45998:110;46074:26;46084:2;46088:7;46074:26;;;;;;;;;;;;:9;:26::i;49160:174::-;49235:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49235:29:0;-1:-1:-1;;;;;49235:29:0;;;;;;;;:24;;49289:23;49235:24;49289:14;:23::i;:::-;-1:-1:-1;;;;;49280:46:0;;;;;;;;;;;49160:174;;:::o;65240:265::-;65375:19;65396:15;65426:8;65415:40;;;;;;;;;;;;:::i;:::-;65374:81;;;;65466:31;65476:11;65489:7;65466:9;:31::i;:::-;65363:142;;65240:265;;;;:::o;45308:348::-;45401:4;45103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45103:16:0;45418:73;;;;-1:-1:-1;;;45418:73:0;;19972:2:1;45418:73:0;;;19954:21:1;20011:2;19991:18;;;19984:30;20050:34;20030:18;;;20023:62;-1:-1:-1;;;20101:18:1;;;20094:42;20153:19;;45418:73:0;19770:408:1;45418:73:0;45502:13;45518:23;45533:7;45518:14;:23::i;:::-;45502:39;;45571:5;-1:-1:-1;;;;;45560:16:0;:7;-1:-1:-1;;;;;45560:16:0;;:52;;;-1:-1:-1;;;;;;42400:25:0;;;42376:4;42400:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;45580:32;45560:87;;;;45640:7;-1:-1:-1;;;;;45616:31:0;:20;45628:7;45616:11;:20::i;:::-;-1:-1:-1;;;;;45616:31:0;;45560:87;45552:96;45308:348;-1:-1:-1;;;;45308:348:0:o;48417:625::-;48576:4;-1:-1:-1;;;;;48549:31:0;:23;48564:7;48549:14;:23::i;:::-;-1:-1:-1;;;;;48549:31:0;;48541:81;;;;-1:-1:-1;;;48541:81:0;;16990:2:1;48541:81:0;;;16972:21:1;17029:2;17009:18;;;17002:30;17068:34;17048:18;;;17041:62;-1:-1:-1;;;17119:18:1;;;17112:35;17164:19;;48541:81:0;16788:401:1;48541:81:0;-1:-1:-1;;;;;48641:16:0;;48633:65;;;;-1:-1:-1;;;48633:65:0;;18512:2:1;48633:65:0;;;18494:21:1;18551:2;18531:18;;;18524:30;18590:34;18570:18;;;18563:62;-1:-1:-1;;;18641:18:1;;;18634:34;18685:19;;48633:65:0;18310:400:1;48633:65:0;48711:39;48732:4;48738:2;48742:7;48711:20;:39::i;:::-;48815:29;48832:1;48836:7;48815:8;:29::i;:::-;-1:-1:-1;;;;;48857:15:0;;;;;;:9;:15;;;;;:20;;48876:1;;48857:15;:20;;48876:1;;48857:20;:::i;:::-;;;;-1:-1:-1;;;;;;;48888:13:0;;;;;;:9;:13;;;;;:18;;48905:1;;48888:13;:18;;48905:1;;48888:18;:::i;:::-;;;;-1:-1:-1;;48917:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48917:21:0;-1:-1:-1;;;;;48917:21:0;;;;;;;;;48956:27;;48917:16;;48956:27;;;;;;;41353:341;41283:411;;:::o;16011:191::-;16104:6;;;-1:-1:-1;;;;;16121:17:0;;;-1:-1:-1;;;;;;16121:17:0;;;;;;;16154:40;;16104:6;;;16121:17;16104:6;;16154:40;;16085:16;;16154:40;16074:128;16011:191;:::o;49476:315::-;49631:8;-1:-1:-1;;;;;49622:17:0;:5;-1:-1:-1;;;;;49622:17:0;;;49614:55;;;;-1:-1:-1;;;49614:55:0;;18917:2:1;49614:55:0;;;18899:21:1;18956:2;18936:18;;;18929:30;18995:27;18975:18;;;18968:55;19040:18;;49614:55:0;18715:349:1;49614:55:0;-1:-1:-1;;;;;49680:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49680:46:0;;;;;;;;;;49742:41;;14465::1;;;49742::0;;14438:18:1;49742:41:0;;;;;;;49476:315;;;:::o;60495:224::-;60603:4;60650:51;60669:5;60676:13;;60691:9;60650:18;:51::i;:::-;60643:58;60495:224;-1:-1:-1;;;60495:224:0:o;44386:315::-;44543:28;44553:4;44559:2;44563:7;44543:9;:28::i;:::-;44590:48;44613:4;44619:2;44623:7;44632:5;44590:22;:48::i;:::-;44582:111;;;;-1:-1:-1;;;44582:111:0;;;;;;;:::i;64846:105::-;64898:13;64931:12;64924:19;;;;;:::i;11027:723::-;11083:13;11304:10;11300:53;;-1:-1:-1;;11331:10:0;;;;;;;;;;;;-1:-1:-1;;;11331:10:0;;;;;11027:723::o;11300:53::-;11378:5;11363:12;11419:78;11426:9;;11419:78;;11452:8;;;;:::i;:::-;;-1:-1:-1;11475:10:0;;-1:-1:-1;11483:2:0;11475:10;;:::i;:::-;;;11419:78;;;11507:19;11539:6;-1:-1:-1;;;;;11529:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11529:17:0;;11507:39;;11557:154;11564:10;;11557:154;;11591:11;11601:1;11591:11;;:::i;:::-;;-1:-1:-1;11660:10:0;11668:2;11660:5;:10;:::i;:::-;11647:24;;:2;:24;:::i;:::-;11634:39;;11617:6;11624;11617:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11617:56:0;;;;;;;;-1:-1:-1;11688:11:0;11697:2;11688:11;;:::i;:::-;;;11557:154;;47660:420;47720:13;47736:23;47751:7;47736:14;:23::i;:::-;47720:39;;47772:48;47793:5;47808:1;47812:7;47772:20;:48::i;:::-;47861:29;47878:1;47882:7;47861:8;:29::i;:::-;-1:-1:-1;;;;;47903:16:0;;;;;;:9;:16;;;;;:21;;47923:1;;47903:16;:21;;47923:1;;47903:21;:::i;:::-;;;;-1:-1:-1;;47942:16:0;;;;:7;:16;;;;;;47935:23;;-1:-1:-1;;;;;;47935:23:0;;;47976:36;47950:7;;47942:16;-1:-1:-1;;;;;47976:36:0;;;;;47942:16;;47976:36;62496:109:::1;62405:220:::0;:::o;46335:321::-;46465:18;46471:2;46475:7;46465:5;:18::i;:::-;46516:54;46547:1;46551:2;46555:7;46564:5;46516:22;:54::i;:::-;46494:154;;;;-1:-1:-1;;;46494:154:0;;;;;;;:::i;55057:589::-;-1:-1:-1;;;;;55263:18:0;;55259:187;;55298:40;55330:7;56473:10;:17;;56446:24;;;;:15;:24;;;;;:44;;;56501:24;;;;;;;;;;;;56369:164;55298:40;55259:187;;;55368:2;-1:-1:-1;;;;;55360:10:0;:4;-1:-1:-1;;;;;55360:10:0;;55356:90;;55387:47;55420:4;55426:7;55387:32;:47::i;:::-;-1:-1:-1;;;;;55460:16:0;;55456:183;;55493:45;55530:7;55493:36;:45::i;55456:183::-;55566:4;-1:-1:-1;;;;;55560:10:0;:2;-1:-1:-1;;;;;55560:10:0;;55556:83;;55587:40;55615:2;55619:7;55587:27;:40::i;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;;1220:190;-1:-1:-1;;;;1220:190:0:o;50356:799::-;50511:4;-1:-1:-1;;;;;50532:13:0;;21103:19;:23;50528:620;;50568:72;;-1:-1:-1;;;50568:72:0;;-1:-1:-1;;;;;50568:36:0;;;;;:72;;13545:10;;50619:4;;50625:7;;50634:5;;50568:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50568:72:0;;;;;;;;-1:-1:-1;;50568:72:0;;;;;;;;;;;;:::i;:::-;;;50564:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50810:13:0;;50806:272;;50853:60;;-1:-1:-1;;;50853:60:0;;;;;;;:::i;50806:272::-;51028:6;51022:13;51013:6;51009:2;51005:15;50998:38;50564:529;-1:-1:-1;;;;;;50691:51:0;-1:-1:-1;;;50691:51:0;;-1:-1:-1;50684:58:0;;50528:620;-1:-1:-1;51132:4:0;50356:799;;;;;;:::o;46992:439::-;-1:-1:-1;;;;;47072:16:0;;47064:61;;;;-1:-1:-1;;;47064:61:0;;22457:2:1;47064:61:0;;;22439:21:1;;;22476:18;;;22469:30;22535:34;22515:18;;;22508:62;22587:18;;47064:61:0;22255:356:1;47064:61:0;45079:4;45103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45103:16:0;:30;47136:58;;;;-1:-1:-1;;;47136:58:0;;17806:2:1;47136:58:0;;;17788:21:1;17845:2;17825:18;;;17818:30;17884;17864:18;;;17857:58;17932:18;;47136:58:0;17604:352:1;47136:58:0;47207:45;47236:1;47240:2;47244:7;47207:20;:45::i;:::-;-1:-1:-1;;;;;47265:13:0;;;;;;:9;:13;;;;;:18;;47282:1;;47265:13;:18;;47282:1;;47265:18;:::i;:::-;;;;-1:-1:-1;;47294:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47294:21:0;-1:-1:-1;;;;;47294:21:0;;;;;;;;47333:33;;47294:16;;;47333:33;;47294:16;;47333:33;62496:109:::1;62405:220:::0;:::o;57160:988::-;57426:22;57476:1;57451:22;57468:4;57451:16;:22::i;:::-;:26;;;;:::i;:::-;57488:18;57509:26;;;:17;:26;;;;;;57426:51;;-1:-1:-1;57642:28:0;;;57638:328;;-1:-1:-1;;;;;57709:18:0;;57687:19;57709:18;;;:12;:18;;;;;;;;:34;;;;;;;;;57760:30;;;;;;:44;;;57877:30;;:17;:30;;;;;:43;;;57638:328;-1:-1:-1;58062:26:0;;;;:17;:26;;;;;;;;58055:33;;;-1:-1:-1;;;;;58106:18:0;;;;;:12;:18;;;;;:34;;;;;;;58099:41;57160:988::o;58443:1079::-;58721:10;:17;58696:22;;58721:21;;58741:1;;58721:21;:::i;:::-;58753:18;58774:24;;;:15;:24;;;;;;59147:10;:26;;58696:46;;-1:-1:-1;58774:24:0;;58696:46;;59147:26;;;;;;:::i;:::-;;;;;;;;;59125:48;;59211:11;59186:10;59197;59186:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;59291:28;;;:15;:28;;;;;;;:41;;;59463:24;;;;;59456:31;59498:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58514:1008;;;58443:1079;:::o;55947:221::-;56032:14;56049:20;56066:2;56049:16;:20::i;:::-;-1:-1:-1;;;;;56080:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;56125:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;55947:221:0:o;1771:675::-;1854:7;1897:4;1854:7;1912:497;1936:5;:12;1932:1;:16;1912:497;;;1970:20;1993:5;1999:1;1993:8;;;;;;;;:::i;:::-;;;;;;;1970:31;;2036:12;2020;:28;2016:382;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2148:57;;2016:382;;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2325:57;;2016:382;-1:-1:-1;1950:3:0;;;;:::i;:::-;;;;1912:497;;;-1:-1:-1;2426:12:0;1771:675;-1:-1:-1;;;1771:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;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;;-1:-1:-1;;;;;838:30:1;;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;;-1:-1:-1;;;;;1507:30:1;;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;-1:-1:-1;;;;;3542:30:1;;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:180::-;4468:6;4521:2;4509:9;4500:7;4496:23;4492:32;4489:52;;;4537:1;4534;4527:12;4489:52;-1:-1:-1;4560:23:1;;4409:180;-1:-1:-1;4409:180:1:o;4594:245::-;4652:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:52;;;4721:1;4718;4711:12;4673:52;4760:9;4747:23;4779:30;4803:5;4779:30;:::i;4844:249::-;4913:6;4966:2;4954:9;4945:7;4941:23;4937:32;4934:52;;;4982:1;4979;4972:12;4934:52;5014:9;5008:16;5033:30;5057:5;5033:30;:::i;5098:450::-;5167:6;5220:2;5208:9;5199:7;5195:23;5191:32;5188:52;;;5236:1;5233;5226:12;5188:52;5276:9;5263:23;-1:-1:-1;;;;;5301:6:1;5298:30;5295:50;;;5341:1;5338;5331:12;5295:50;5364:22;;5417:4;5409:13;;5405:27;-1:-1:-1;5395:55:1;;5446:1;5443;5436:12;5395:55;5469:73;5534:7;5529:2;5516:16;5511:2;5507;5503:11;5469:73;:::i;5553:184::-;5611:6;5664:2;5652:9;5643:7;5639:23;5635:32;5632:52;;;5680:1;5677;5670:12;5632:52;5703:28;5721:9;5703:28;:::i;5742:481::-;5820:6;5828;5836;5889:2;5877:9;5868:7;5864:23;5860:32;5857:52;;;5905:1;5902;5895:12;5857:52;5928:28;5946:9;5928:28;:::i;:::-;5918:38;;6007:2;5996:9;5992:18;5979:32;-1:-1:-1;;;;;6026:6:1;6023:30;6020:50;;;6066:1;6063;6056:12;6020:50;6105:58;6155:7;6146:6;6135:9;6131:22;6105:58;:::i;:::-;5742:481;;6182:8;;-1:-1:-1;6079:84:1;;-1:-1:-1;;;;5742:481:1:o;6228:460::-;6313:6;6321;6329;6382:2;6370:9;6361:7;6357:23;6353:32;6350:52;;;6398:1;6395;6388:12;6350:52;6421:28;6439:9;6421:28;:::i;:::-;6411:38;;6500:2;6489:9;6485:18;6472:32;-1:-1:-1;;;;;6519:6:1;6516:30;6513:50;;;6559:1;6556;6549:12;6513:50;6582:49;6623:7;6614:6;6603:9;6599:22;6582:49;:::i;:::-;6572:59;;;6678:2;6667:9;6663:18;6650:32;6640:42;;6228:460;;;;;:::o;6693:773::-;6797:6;6805;6813;6821;6829;6882:3;6870:9;6861:7;6857:23;6853:33;6850:53;;;6899:1;6896;6889:12;6850:53;6922:28;6940:9;6922:28;:::i;:::-;6912:38;;7001:2;6990:9;6986:18;6973:32;-1:-1:-1;;;;;7065:2:1;7057:6;7054:14;7051:34;;;7081:1;7078;7071:12;7051:34;7104:49;7145:7;7136:6;7125:9;7121:22;7104:49;:::i;:::-;7094:59;;7172:37;7205:2;7194:9;7190:18;7172:37;:::i;:::-;7162:47;;7262:2;7251:9;7247:18;7234:32;7218:48;;7291:2;7281:8;7278:16;7275:36;;;7307:1;7304;7297:12;7275:36;;7346:60;7398:7;7387:8;7376:9;7372:24;7346:60;:::i;:::-;6693:773;;;;-1:-1:-1;6693:773:1;;-1:-1:-1;7425:8:1;;7320:86;6693:773;-1:-1:-1;;;6693:773:1:o;7471:684::-;7573:6;7581;7589;7597;7650:3;7638:9;7629:7;7625:23;7621:33;7618:53;;;7667:1;7664;7657:12;7618:53;7690:28;7708:9;7690:28;:::i;:::-;7680:38;;7769:2;7758:9;7754:18;7741:32;-1:-1:-1;;;;;7833:2:1;7825:6;7822:14;7819:34;;;7849:1;7846;7839:12;7819:34;7872:49;7913:7;7904:6;7893:9;7889:22;7872:49;:::i;:::-;7862:59;;7940:37;7973:2;7962:9;7958:18;7940:37;:::i;:::-;7930:47;;8030:2;8019:9;8015:18;8002:32;7986:48;;8059:2;8049:8;8046:16;8043:36;;;8075:1;8072;8065:12;8043:36;;8098:51;8141:7;8130:8;8119:9;8115:24;8098:51;:::i;8160:622::-;8255:6;8263;8271;8279;8287;8340:3;8328:9;8319:7;8315:23;8311:33;8308:53;;;8357:1;8354;8347:12;8308:53;8380:28;8398:9;8380:28;:::i;:::-;8370:38;;8427:37;8460:2;8449:9;8445:18;8427:37;:::i;:::-;8417:47;;8511:2;8500:9;8496:18;8483:32;8473:42;;8566:2;8555:9;8551:18;8538:32;-1:-1:-1;;;;;8585:6:1;8582:30;8579:50;;;8625:1;8622;8615:12;8579:50;8664:58;8714:7;8705:6;8694:9;8690:22;8664:58;:::i;8787:252::-;8854:6;8862;8915:2;8903:9;8894:7;8890:23;8886:32;8883:52;;;8931:1;8928;8921:12;8883:52;8954:28;8972:9;8954:28;:::i;9229:683::-;9324:6;9332;9340;9393:2;9381:9;9372:7;9368:23;9364:32;9361:52;;;9409:1;9406;9399:12;9361:52;9445:9;9432:23;9422:33;;9506:2;9495:9;9491:18;9478:32;-1:-1:-1;;;;;9570:2:1;9562:6;9559:14;9556:34;;;9586:1;9583;9576:12;9556:34;9624:6;9613:9;9609:22;9599:32;;9669:7;9662:4;9658:2;9654:13;9650:27;9640:55;;9691:1;9688;9681:12;9640:55;9731:2;9718:16;9757:2;9749:6;9746:14;9743:34;;;9773:1;9770;9763:12;9743:34;9826:7;9821:2;9811:6;9808:1;9804:14;9800:2;9796:23;9792:32;9789:45;9786:65;;;9847:1;9844;9837:12;9786:65;9878:2;9874;9870:11;9860:21;;9900:6;9890:16;;;;;9229:683;;;;;:::o;9917:245::-;9996:6;10004;10057:2;10045:9;10036:7;10032:23;10028:32;10025:52;;;10073:1;10070;10063:12;10025:52;-1:-1:-1;;10096:16:1;;10152:2;10137:18;;;10131:25;10096:16;;10131:25;;-1:-1:-1;9917:245:1:o;10284:266::-;10372:6;10367:3;10360:19;10424:6;10417:5;10410:4;10405:3;10401:14;10388:43;-1:-1:-1;10476:1:1;10451:16;;;10469:4;10447:27;;;10440:38;;;;10532:2;10511:15;;;-1:-1:-1;;10507:29:1;10498:39;;;10494:50;;10284:266::o;10555:257::-;10596:3;10634:5;10628:12;10661:6;10656:3;10649:19;10677:63;10733:6;10726:4;10721:3;10717:14;10710:4;10703:5;10699:16;10677:63;:::i;:::-;10794:2;10773:15;-1:-1:-1;;10769:29:1;10760:39;;;;10801:4;10756:50;;10555:257;-1:-1:-1;;10555:257:1:o;11051:271::-;11234:6;11226;11221:3;11208:33;11190:3;11260:16;;11285:13;;;11260:16;11051:271;-1:-1:-1;11051:271:1:o;11327:274::-;11456:3;11494:6;11488:13;11510:53;11556:6;11551:3;11544:4;11536:6;11532:17;11510:53;:::i;:::-;11579:16;;;;;11327:274;-1:-1:-1;;11327:274:1:o;11606:811::-;11732:3;11761:1;11794:6;11788:13;11824:36;11850:9;11824:36;:::i;:::-;11879:1;11896:18;;;11923:104;;;;12041:1;12036:356;;;;11889:503;;11923:104;-1:-1:-1;;11956:24:1;;11944:37;;12001:16;;;;-1:-1:-1;11923:104:1;;12036:356;12067:6;12064:1;12057:17;12097:4;12142:2;12139:1;12129:16;12167:1;12181:165;12195:6;12192:1;12189:13;12181:165;;;12273:14;;12260:11;;;12253:35;12316:16;;;;12210:10;;12181:165;;;12185:3;;;12375:6;12370:3;12366:16;12359:23;;11889:503;-1:-1:-1;12408:3:1;;11606:811;-1:-1:-1;;;;;;11606:811:1:o;12422:637::-;12702:3;12740:6;12734:13;12756:53;12802:6;12797:3;12790:4;12782:6;12778:17;12756:53;:::i;:::-;12872:13;;12831:16;;;;12894:57;12872:13;12831:16;12928:4;12916:17;;12894:57;:::i;:::-;-1:-1:-1;;;12973:20:1;;13002:22;;;13051:1;13040:13;;12422:637;-1:-1:-1;;;;12422:637:1:o;13553:488::-;-1:-1:-1;;;;;13822:15:1;;;13804:34;;13874:15;;13869:2;13854:18;;13847:43;13921:2;13906:18;;13899:34;;;13969:3;13964:2;13949:18;;13942:31;;;13747:4;;13990:45;;14015:19;;14007:6;13990:45;:::i;:::-;13982:53;13553:488;-1:-1:-1;;;;;;13553:488:1:o;14517:217::-;14664:2;14653:9;14646:21;14627:4;14684:44;14724:2;14713:9;14709:18;14701:6;14684:44;:::i;15962:414::-;16164:2;16146:21;;;16203:2;16183:18;;;16176:30;16242:34;16237:2;16222:18;;16215:62;-1:-1:-1;;;16308:2:1;16293:18;;16286:48;16366:3;16351:19;;15962:414::o;23029:356::-;23231:2;23213:21;;;23250:18;;;23243:30;23309:34;23304:2;23289:18;;23282:62;23376:2;23361:18;;23029:356::o;24629:413::-;24831:2;24813:21;;;24870:2;24850:18;;;24843:30;24909:34;24904:2;24889:18;;24882:62;-1:-1:-1;;;24975:2:1;24960:18;;24953:47;25032:3;25017:19;;24629:413::o;27947:640::-;28228:6;28216:19;;28198:38;;-1:-1:-1;;;;;28272:32:1;;28267:2;28252:18;;28245:60;28292:3;28336:2;28321:18;;28314:31;;;-1:-1:-1;;28368:45:1;;28393:19;;28385:6;28368:45;:::i;:::-;28463:6;28456:14;28449:22;28444:2;28433:9;28429:18;28422:50;28521:9;28513:6;28509:22;28503:3;28492:9;28488:19;28481:51;28549:32;28574:6;28566;28549:32;:::i;:::-;28541:40;27947:640;-1:-1:-1;;;;;;;;27947:640:1:o;28592:326::-;28787:6;28779;28775:19;28764:9;28757:38;28831:2;28826;28815:9;28811:18;28804:30;28738:4;28851:61;28908:2;28897:9;28893:18;28885:6;28877;28851:61;:::i;:::-;28843:69;28592:326;-1:-1:-1;;;;;28592:326:1:o;28923:582::-;29190:6;29182;29178:19;29167:9;29160:38;29234:3;29229:2;29218:9;29214:18;29207:31;29141:4;29261:45;29301:3;29290:9;29286:19;29278:6;29261:45;:::i;:::-;-1:-1:-1;;;;;29346:6:1;29342:31;29337:2;29326:9;29322:18;29315:59;29422:9;29414:6;29410:22;29405:2;29394:9;29390:18;29383:50;29450:49;29492:6;29484;29476;29450:49;:::i;29510:555::-;29767:6;29759;29755:19;29744:9;29737:38;29811:3;29806:2;29795:9;29791:18;29784:31;29718:4;29838:45;29878:3;29867:9;29863:19;29855:6;29838:45;:::i;:::-;-1:-1:-1;;;;;29923:6:1;29919:31;29914:2;29903:9;29899:18;29892:59;29999:9;29991:6;29987:22;29982:2;29971:9;29967:18;29960:50;30027:32;30052:6;30044;30027:32;:::i;:::-;30019:40;29510:555;-1:-1:-1;;;;;;;29510:555:1:o;30070:1498::-;30416:6;30408;30404:19;30393:9;30386:38;30367:4;30443:2;30481:3;30476:2;30465:9;30461:18;30454:31;30505:1;30538:6;30532:13;30568:36;30594:9;30568:36;:::i;:::-;30641:6;30635:3;30624:9;30620:19;30613:35;30667:3;30689:1;30721:2;30710:9;30706:18;30738:1;30733:122;;;;30869:1;30864:354;;;;30699:519;;30733:122;-1:-1:-1;;30781:24:1;;30761:18;;;30754:52;30841:3;30826:19;;;-1:-1:-1;30733:122:1;;30864:354;30895:6;30892:1;30885:17;30943:2;30940:1;30930:16;30968:1;30982:180;30996:6;30993:1;30990:13;30982:180;;;31089:14;;31065:17;;;31061:26;;31054:50;31132:16;;;;31011:10;;30982:180;;;31186:17;;31182:26;;;-1:-1:-1;;30699:519:1;;;;;;31263:9;31258:3;31254:19;31249:2;31238:9;31234:18;31227:47;31297:29;31322:3;31314:6;31297:29;:::i;:::-;31283:43;;;31335:54;31385:2;31374:9;31370:18;31362:6;-1:-1:-1;;;;;10241:31:1;10229:44;;10167:112;31335:54;-1:-1:-1;;;;;10241:31:1;;31448:3;31433:19;;10229:44;31502:9;31494:6;31490:22;31484:3;31473:9;31469:19;31462:51;31530:32;31555:6;31547;31530:32;:::i;:::-;31522:40;30070:1498;-1:-1:-1;;;;;;;;;30070:1498:1:o;31573:498::-;31773:4;31802:6;31847:2;31839:6;31835:15;31824:9;31817:34;31899:2;31891:6;31887:15;31882:2;31871:9;31867:18;31860:43;;31939:6;31934:2;31923:9;31919:18;31912:34;31982:3;31977:2;31966:9;31962:18;31955:31;32003:62;32060:3;32049:9;32045:19;32037:6;32029;32003:62;:::i;32511:128::-;32551:3;32582:1;32578:6;32575:1;32572:13;32569:39;;;32588:18;;:::i;:::-;-1:-1:-1;32624:9:1;;32511:128::o;32644:120::-;32684:1;32710;32700:35;;32715:18;;:::i;:::-;-1:-1:-1;32749:9:1;;32644:120::o;32769:125::-;32809:4;32837:1;32834;32831:8;32828:34;;;32842:18;;:::i;:::-;-1:-1:-1;32879:9:1;;32769:125::o;32899:258::-;32971:1;32981:113;32995:6;32992:1;32989:13;32981:113;;;33071:11;;;33065:18;33052:11;;;33045:39;33017:2;33010:10;32981:113;;;33112:6;33109:1;33106:13;33103:48;;;-1:-1:-1;;33147:1:1;33129:16;;33122:27;32899:258::o;33162:380::-;33241:1;33237:12;;;;33284;;;33305:61;;33359:4;33351:6;33347:17;33337:27;;33305:61;33412:2;33404:6;33401:14;33381:18;33378:38;33375:161;;;33458:10;33453:3;33449:20;33446:1;33439:31;33493:4;33490:1;33483:15;33521:4;33518:1;33511:15;33375:161;;33162:380;;;:::o;33547:135::-;33586:3;-1:-1:-1;;33607:17:1;;33604:43;;;33627:18;;:::i;:::-;-1:-1:-1;33674:1:1;33663:13;;33547:135::o;33687:112::-;33719:1;33745;33735:35;;33750:18;;:::i;:::-;-1:-1:-1;33784:9:1;;33687:112::o;33804:127::-;33865:10;33860:3;33856:20;33853:1;33846:31;33896:4;33893:1;33886:15;33920:4;33917:1;33910:15;33936:127;33997:10;33992:3;33988:20;33985:1;33978:31;34028:4;34025:1;34018:15;34052:4;34049:1;34042:15;34068:127;34129:10;34124:3;34120:20;34117:1;34110:31;34160:4;34157:1;34150:15;34184:4;34181:1;34174:15;34200:127;34261:10;34256:3;34252:20;34249:1;34242:31;34292:4;34289:1;34282:15;34316:4;34313:1;34306:15;34332:127;34393:10;34388:3;34384:20;34381:1;34374:31;34424:4;34421:1;34414:15;34448:4;34445:1;34438:15;34464:131;-1:-1:-1;;;;;34539:31:1;;34529:42;;34519:70;;34585:1;34582;34575:12;34600:131;-1:-1:-1;;;;;;34674:32:1;;34664:43;;34654:71;;34721:1;34718;34711:12

Swarm Source

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