Token Assetha

Overview ERC-721

Total Supply:
1 AST

Holders:
2 addresses

Profile Summary

 
Contract:
0x6ce99013e4327b95db64b65721faab551caea2ab0x6Ce99013e4327b95dB64b65721FaAB551cAeA2Ab

Balance
0 AST
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Assetha

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

/**
 * @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.
 */
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 Merklee 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)
        }
    }
}

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

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

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

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

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


pragma solidity 0.8.13;

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

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


pragma solidity 0.8.13;


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


pragma solidity 0.8.13;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity 0.8.13;


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


pragma solidity 0.8.13;

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

pragma solidity 0.8.13;

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


pragma solidity 0.8.13;

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


pragma solidity 0.8.13;


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


pragma solidity 0.8.13;


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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity 0.8.13;

/**
 * @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 tokenId);

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


pragma solidity 0.8.13;


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


pragma solidity 0.8.13;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

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

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

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

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

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

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

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

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

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

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}


pragma solidity 0.8.13;

/**
 * @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 ERC721B is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }
 
  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;
  uint256 private TotalToken = 0; 
  uint256 private MaxTokenId = 0;   
  uint256 internal immutable maxBatchSize;
  uint256 private startIndex = 0;
  uint256 private endIndex = 0;
  address private burnaddress = 0x000000000000000000000000000000000000dEaD;

  string private _name;
  string private _symbol;
  mapping(uint256 => TokenOwnership) private _ownerships;
  mapping(address => AddressData) private _addressData;
  mapping(uint256 => address) private _tokenApprovals;
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 startIndex_,
    uint256 endIndex_   
  ) {
    require(maxBatchSize_ > 0, "ERC721B: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    currentIndex = startIndex_;
    startIndex = startIndex_;
    endIndex = endIndex_; 
    MaxTokenId = endIndex_; 
  }

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

  /**	
   * @dev See {IERC721Enumerable-tokenByIndex}.	
   */	
   function tokenByIndex(uint256 index) public view override returns (uint256) {	
    require(index <= MaxTokenId, "ERC721B: global index out of bounds");	

    uint256 tokenIdsIdx = 0;

    for (uint256 i = 0; i <= MaxTokenId; i++) {
      TokenOwnership memory ownership = _ownerships[i];

      if(_inrange(i)){
        if ( (ownership.addr != burnaddress) && (i < currentIndex)) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }
      }
      else
      {
        if ((ownership.addr != address(0)) && (ownership.addr != burnaddress))  {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }     
      }
    }

    revert("ERC721A: unable to get token by index");
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(TotalToken). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i <= MaxTokenId; i++) {
      TokenOwnership memory ownership = _ownerships[i];

      if(_inrange(i) && (i < currentIndex)){
        if ((ownership.addr != address(0))) {
            currOwnershipAddr = ownership.addr;
        }

        if (currOwnershipAddr == owner) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }
      }
      else
      {
        if (ownership.addr == owner) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }     
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    require(
        owner != burnaddress,
        "ERC721A: number minted query for the burnaddress"
      );    
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721B: owner query for nonexistent token");
    TokenOwnership memory ownership = _ownerships[tokenId];
    if ( !_inrange(tokenId) ) {
        if ( (ownership.addr != address(0)) && (ownership.addr != burnaddress) )
            return ownership;
        else
            revert("ERC721B: unable to determine the owner of token");
    }

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    if (lowestTokenToCheck < startIndex) {
        lowestTokenToCheck = startIndex;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      ownership = _ownerships[curr];
      if ((ownership.addr != address(0)) && (ownership.addr != burnaddress)  ) {
        return ownership;
      }
    }

    revert("ERC721B: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

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

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

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

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


  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721B: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721B: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    //@dan token could be out of range from tranferring between blockchains 
    if (_inrange(tokenId))
    {
        return ((tokenId < currentIndex) && (_ownerships[tokenId].addr !=burnaddress));      
    }
    else
    {
        return ((_ownerships[tokenId].addr != address(0)) && (_ownerships[tokenId].addr !=burnaddress));     
    }

  }

  
  /**
   * @dev Returns whether `tokenId` in start and end ranges.
   *
   * Tokens can be out of range by airdrop.
   */
   function _inrange(uint256 tokenId) internal view returns (bool) {
    //@dan token could be out of range from tranferring between blockchains 
    return ((tokenId >= startIndex) && (tokenId <= endIndex));
  }


  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721B: mint to the zero address");
    require(to != burnaddress, "ERC721B: mint to the burn address");    
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721B: token already minted");
    require(quantity <= maxBatchSize, "ERC721B: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );    
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );

      updatedIndex++;
      TotalToken++;
    }

    currentIndex = updatedIndex;

    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

/**
     * @dev Safely airdrop `tokenId` and transfers it to `to`. This is for the receive side of Level Zero Chain transfer
     *
     * 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 _airdrop(address to, uint256 tokenId) internal virtual {
        _airdrop(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 _airdrop(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _airdropbyId(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 _airdropbyId(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(to != burnaddress, "ERC721B: mint to the burn address");   

        _beforeTokenTransfers(address(0), to, tokenId, 1);

        TotalToken++;    
        if(tokenId > MaxTokenId){
            MaxTokenId = tokenId;
        }  

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + 1,
            addressData.numberMinted + 1);

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        emit Transfer(address(0), to, tokenId);
    }
    
/**
     * @dev ERC721A uses address(0), so we use 0x000000000000000000000000000000000000dEaD as burn address
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
        address owner = ERC721B.ownerOf(tokenId);

        _beforeTokenTransfers(owner, burnaddress, tokenId, 1);

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

        AddressData memory addressData = _addressData[owner];
        _addressData[owner] = AddressData(
            addressData.balance - 1,
            addressData.numberMinted - 1);

        TotalToken--;
        _ownerships[tokenId] = TokenOwnership(burnaddress, uint64(block.timestamp));

         //@dan only do this if minted in range.
        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_inrange(nextTokenId) && (_ownerships[nextTokenId].addr == address(0))) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                prevOwnership.addr,
                prevOwnership.startTimestamp
                );
            }
        }
    
        emit Transfer(owner, address(0), tokenId);
    }
    
  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721B: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721B: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721B: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    //@dan only do this if minted in range.
    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_inrange(nextTokenId) && (_ownerships[nextTokenId].addr == address(0))) {
        if (_exists(nextTokenId)) {
            _ownerships[nextTokenId] = TokenOwnership(
            prevOwnership.addr,
            prevOwnership.startTimestamp
            );
        }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721B: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

interface IERC2981Royalties {
	function royaltyInfo(uint256 tokenID, uint256 value) external view returns(address receiver, uint256 royaltyAmount);
}

pragma solidity 0.8.13;
contract Assetha is ERC721B, Ownable, NonblockingReceiver {

    using Strings for uint256;
    mapping (address => uint256) public preMintCountOfAddress;
    mapping (address => bool) public hasFreeMinted;
    mapping (address => bool) public hasEarlyQuit;
    uint256[] public burntTokens;
    uint256 public totalPreMints;
    uint256 public totalFreeMints;
    uint256 public totalBurnt;
    uint256 public maxTokens;
    uint256 public earlyQuitBalance;
    string private baseURI;
    string private notRevealedURI;
    string private baseExtension = ".json";
    bytes32 private whitelistMerkleRoot;
    bytes32 private freeMerkleRoot;
    uint256 public royalties;
    address private recipient;
    uint256 maxBatchSize_ = 20;

    bool public salePaused = false;
    bool public preSalePaused = false;
    bool public earlyQuitPaused = false;
    bool public revealed = true;

    uint256 public mintPrice = 70 ether;
    uint256 public preMintPrice = 50 ether;
    uint256 public earlyQuitPrice = 25 ether;
    uint256 public maxFreeMints = 10;
    uint256 public maxPreMints = 100;
    uint256 public tokensPerWhitelistedAddress = 2;

    uint256 private nextToken = 6001;
    uint256 private startIndex_ = 6001;
    uint256 private endIndex_ = 7000;

    constructor(string memory _initBaseURI, string memory _initNotRevealedURI, address _recipient) ERC721B("Assetha", "AST", maxBatchSize_, startIndex_, endIndex_) {
        endpoint = ILayerZeroEndpoint(0x7dcAD72640F835B0FA36EFD3D6d3ec902C7E5acf);
        baseURI = _initBaseURI;
        notRevealedURI = _initNotRevealedURI;
        recipient = _recipient;
        royalties = 500;

        _safeMint(address(_msgSender()), 4);
    }

    modifier checkQuantity(uint256 mintQuantity) {
        require(mintQuantity > 0 && mintQuantity <= maxBatchSize, "Quantity should be lower than 20.");
        require(nextToken + mintQuantity <= (maxTokens - (maxFreeMints - totalFreeMints)), "Exceeded total supply.");
        _;
    }

    function earlyQuit(uint256 tokenId) public {
        require(!earlyQuitPaused, "Early quitting is not enabled.");
        require(ownerOf(tokenId) == _msgSender() || getApproved(tokenId) == _msgSender(), "You are not the owner of this token.");
        // bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        // require(MerkleProof.verify(_merkleProof, whitelistMerkleRoot, leaf), "Invalid proof!");
        require(hasEarlyQuit[_msgSender()] == false, "You have already early quit.");
        require(address(this).balance >= earlyQuitPrice, "Not enough balance in the contract.");
            
        safeTransferFrom(_msgSender(), owner(), tokenId);
        payable(_msgSender()).transfer(earlyQuitPrice);
        hasEarlyQuit[_msgSender()] = true;
    }

    function freeMint() public payable {
        // bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        // require(MerkleProof.verify(_merkleProof, freeMerkleRoot, leaf), "Invalid proof!");
        require(!salePaused, "Sale has not started.");
        require(totalFreeMints < maxFreeMints, "Exceeded free mint supply.");
        require(hasFreeMinted[_msgSender()] == false, "You have already free minted.");

        _safeMint(_msgSender(), 1);
        hasFreeMinted[_msgSender()] = true;
        totalFreeMints++;
        nextToken++;
    }

    function whitelistMint(uint256 mintQuantity) public payable checkQuantity(mintQuantity) {
        // bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        // require(MerkleProof.verify(_merkleProof, whitelistMerkleRoot, leaf), "Invalid proof!");
        require(!preSalePaused, "Presale has not started.");
        // require(msg.value == preMintPrice * mintQuantity, "Invalid price.");
        require(preMintCountOfAddress[_msgSender()] + mintQuantity <= tokensPerWhitelistedAddress, "You can't mint more tokens.");
        require(totalPreMints + mintQuantity <= maxPreMints, "Exceeded total supply of presale.");

        _safeMint(_msgSender(), mintQuantity);

        totalPreMints = totalPreMints + mintQuantity;
        preMintCountOfAddress[_msgSender()] = preMintCountOfAddress[_msgSender()] + mintQuantity;
        nextToken = nextToken + mintQuantity;
    }

    function publicMint(uint256 mintQuantity) public payable checkQuantity(mintQuantity) {
        require(!salePaused, "Sale has not started.");
        // require(msg.value == mintPrice * mintQuantity, "Invalid price.");

        _safeMint(_msgSender(), mintQuantity);
        nextToken = nextToken + mintQuantity;
    }

    function transferToChain(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You don't own this token.");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for transfer.");

        _burn(tokenId);
        bytes memory payload = abi.encode(msg.sender, tokenId);

        uint16 version = 1;
        uint gas = 350000;
        bytes memory adapterParams = abi.encodePacked(version, gas);

        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);
        require(msg.value >= messageFee, "Please send more gas for the message fees.");
        endpoint.send{value: msg.value}(_chainId, trustedRemoteLookup[_chainId], payload, payable(msg.sender), address(0x0), adapterParams);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "Token does not exist.");
        if (revealed == false) {
            return notRevealedURI;
        } else {
            return string(abi.encodePacked(baseURI, tokenId.toString(), baseExtension ));
        }
    }

    function supportsInterface(bytes4 interfaceID) public view override returns(bool) {
		    return interfaceID == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceID);
	  }

    function royaltyInfo(uint256, uint256 value) external view returns(address receiver, uint256 royaltyAmount) {
        receiver = address(recipient);
        royaltyAmount = (value * royalties) / 10000;
	  }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
            if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
       }
    }

    function getBurntTokens() public view returns (uint256[] memory) {
        return burntTokens;
    }

    // ONLY OWNER
    function burnTokens(uint256[] calldata tokenId) public virtual onlyOwner() {
        for (uint256 i; i < tokenId.length; i++) {
            _burn(tokenId[i]);
            burntTokens.push(tokenId[i]);
            totalBurnt++;
        }
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        mintPrice = _newPrice;
    }

    function setPreMintPrice(uint256 _newPrice) public onlyOwner() {
        preMintPrice = _newPrice;
    }

    function setEarlyQuitPrice(uint256 _newPrice) public onlyOwner() {
        earlyQuitPrice = _newPrice;
    }

    function setFreeMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        freeMerkleRoot = _merkleRoot;
    }

    function setWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        whitelistMerkleRoot = _merkleRoot;
    }

    function toggleSaleState() public onlyOwner() {
        (salePaused == true ? salePaused = false : salePaused = true);
    }

    function togglePreSaleState() public onlyOwner() {
        (preSalePaused == true ? preSalePaused = false : preSalePaused = true);
    }

    function toggleRevealedState() public onlyOwner() {
        (revealed == true ? revealed = false : revealed = true);
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner() {
        baseURI = _newBaseURI;
    }

    function withdrawAmount(uint amount) public payable onlyOwner {
        payable(_msgSender()).transfer(amount);
    }

    function deposit() public payable onlyOwner() {}

    // INTERNAL
    function _LzReceive(uint16, bytes memory, uint64, bytes memory _payload) override internal {
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));
        _airdrop(toAddr, tokenId);
    } 

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

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedURI","type":"string"},{"internalType":"address","name":"_recipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burntTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"earlyQuit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyQuitBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyQuitPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyQuitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurntTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasEarlyQuit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasFreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMintCountOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintQuantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setEarlyQuitPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setFreeMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPreMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","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":"togglePreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRevealedState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleState","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerWhitelistedAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPreMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"transferToChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintQuantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"payable","type":"function"}]

6000808055600181905560028190556003819055600455600580546001600160a01b03191661dead17815560e060405260a081905264173539b7b760d91b60c09081526200005191601b9190620008a6565b5060146020556021805463ffffffff191663010000001790556803cb71f51fc55800006022556802b5e3af16b188000060235568015af1d78b58c40000602455600a602555606460265560026027556117716028819055602955611b58602a55348015620000be57600080fd5b5060405162005bf138038062005bf1833981016040819052620000e19162000a22565b604051806040016040528060078152602001664173736574686160c81b815250604051806040016040528060038152602001621054d560ea1b815250602054602954602a54600083116200018c5760405162461bcd60e51b815260206004820152602760248201527f455243373231423a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084015b60405180910390fd5b8451620001a1906006906020880190620008a6565b508351620001b7906007906020870190620008a6565b506080929092526000819055600355600481905560025550620001dc9050336200026c565b600d80546001600160a01b031916737dcad72640f835b0fa36efd3d6d3ec902c7e5acf179055825162000217906019906020860190620008a6565b5081516200022d90601a906020850190620008a6565b50601f80546001600160a01b0319166001600160a01b0383161790556101f4601e55620002636200025b3390565b6004620002be565b50505062000bd4565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002e0828260405180602001604052806000815250620002e460201b60201c565b5050565b6000546001600160a01b038416620003495760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840162000183565b6005546001600160a01b0390811690851603620003b35760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865206275726e206164647265736044820152607360f81b606482015260840162000183565b620003be8162000683565b156200040d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231423a20746f6b656e20616c7265616479206d696e746564000000604482015260640162000183565b6080518311156200046c5760405162461bcd60e51b815260206004820152602260248201527f455243373231423a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840162000183565b6001600160a01b0384166000908152600960209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190620004ca90879062000ac5565b6001600160801b03168152602001858360200151620004ea919062000ac5565b6001600160801b039081169091526001600160a01b0380881660008181526009602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526008909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015620006785760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4620005d0600088848862000719565b6200063a5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000183565b81620006468162000af3565b6001805491945090915060006200065d8362000af3565b919050555080806200066f9062000af3565b91505062000580565b506000555050505050565b6000620006908262000887565b15620006cb5760005482108015620006c557506005546000838152600860205260409020546001600160a01b03908116911614155b92915050565b6000828152600860205260409020546001600160a01b031615801590620006c5575050600554600091825260086020526040909120546001600160a01b039182169116141590565b50505050565b60006200073a846001600160a01b0316620008a060201b62002ea51760201c565b156200087b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200077490339089908890889060040162000b0f565b6020604051808303816000875af1925050508015620007b2575060408051601f3d908101601f19168201909252620007af9181019062000b65565b60015b62000860573d808015620007e3576040519150601f19603f3d011682016040523d82523d6000602084013e620007e8565b606091505b508051600003620008585760405162461bcd60e51b815260206004820152603360248201527f455243373231423a207472616e7366657220746f206e6f6e204552433732315260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000183565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200087f565b5060015b949350505050565b60006003548210158015620006c5575050600454101590565b3b151590565b828054620008b49062000b98565b90600052602060002090601f016020900481019282620008d8576000855562000923565b82601f10620008f357805160ff191683800117855562000923565b8280016001018555821562000923579182015b828111156200092357825182559160200191906001019062000906565b506200093192915062000935565b5090565b5b8082111562000931576000815560010162000936565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200097f57818101518382015260200162000965565b83811115620007135750506000910152565b600082601f830112620009a357600080fd5b81516001600160401b0380821115620009c057620009c06200094c565b604051601f8301601f19908116603f01168101908282118183101715620009eb57620009eb6200094c565b8160405283815286602085880101111562000a0557600080fd5b62000a1884602083016020890162000962565b9695505050505050565b60008060006060848603121562000a3857600080fd5b83516001600160401b038082111562000a5057600080fd5b62000a5e8783880162000991565b9450602086015191508082111562000a7557600080fd5b5062000a848682870162000991565b604086015190935090506001600160a01b038116811462000aa457600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0382811684821680830382111562000aea5762000aea62000aaf565b01949350505050565b60006001820162000b085762000b0862000aaf565b5060010190565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000b4e8160a085016020870162000962565b601f01601f19169190910160a00195945050505050565b60006020828403121562000b7857600080fd5b81516001600160e01b03198116811462000b9157600080fd5b9392505050565b600181811c9082168062000bad57607f821691505b60208210810362000bce57634e487b7160e01b600052602260045260246000fd5b50919050565b608051614fe562000c0c6000396000818161158101528181612136015281816138610152818161388b0152613e2d0152614fe56000f3fe6080604052600436106103dd5760003560e01c80637533d7881161020d578063bd32fb6611610128578063daaeec86116100bb578063ef6187a41161008a578063f053dc5c1161006f578063f053dc5c14610b7a578063f17f136e14610b90578063f2fde38b14610bb057600080fd5b8063ef6187a414610b34578063efdcb04a14610b6457600080fd5b8063daaeec8614610aa0578063e831574214610ab5578063e985e9c514610acb578063eb8d72b714610b1457600080fd5b8063d0e30db0116100f7578063d0e30db014610a50578063d1deba1f14610a58578063d91f1ad414610a6b578063da6405e114610a8057600080fd5b8063bd32fb66146109db578063c34b289d146109fb578063c3e3146414610a1a578063c87b56dd14610a3057600080fd5b806391b7f5ed116101a0578063a187c89b1161016f578063a187c89b14610958578063a22cb4651461096e578063b88d4fde1461098e578063ba596013146109ae57600080fd5b806391b7f5ed146108dd57806395d89b41146108fd578063966ff650146109125780639fbaea311461092857600080fd5b80638d32c330116101dc5780638d32c3301461081f5780638da5cb5b1461083f5780638ee749121461085d57806390d4d86a146108c857600080fd5b80637533d788146107b65780638462151c146107d6578063868ff4a2146107f6578063899241721461080957600080fd5b80632f745c59116102fd5780636352211e116102905780636ca03d421161025f5780636ca03d421461075557806370a082311461076b578063715018a61461078b578063732496c9146107a057600080fd5b80636352211e146106df578063638df30b146106ff57806367a531731461071f5780636817c76c1461073f57600080fd5b806351830227116102cc578063518302271461067c57806355f804b31461069d5780635b70ea9f146106bd5780635d08c1ae146106c557600080fd5b80632f745c59146105fa57806332b6ad4e1461061a57806342842e0e1461063c5780634f6ccce71461065c57600080fd5b80630c0fcee41161037557806323b872dd1161034457806323b872dd1461056857806324d8a510146105885780632a55205a146105a85780632db11544146105e757600080fd5b80630c0fcee4146104f957806318160ddd1461051d5780631c37a8221461053257806321846df21461055257600080fd5b806306fdde03116103b157806306fdde031461046c578063081812fc1461048e578063095ea7b3146104c657806309f1df72146104e657600080fd5b80621d3567146103e257806301ffc9a714610404578063029d3d4e146104395780630562b9f714610459575b600080fd5b3480156103ee57600080fd5b506104026103fd366004614566565b610bd0565b005b34801561041057600080fd5b5061042461041f366004614601565b610ded565b60405190151581526020015b60405180910390f35b34801561044557600080fd5b5061040261045436600461461e565b610e31565b61040261046736600461461e565b610e90565b34801561047857600080fd5b50610481610f1b565b604051610430919061468f565b34801561049a57600080fd5b506104ae6104a936600461461e565b610fad565b6040516001600160a01b039091168152602001610430565b3480156104d257600080fd5b506104026104e13660046146b7565b611046565b6104026104f43660046146e3565b611178565b34801561050557600080fd5b5061050f60145481565b604051908152602001610430565b34801561052957600080fd5b5060015461050f565b34801561053e57600080fd5b5061040261054d366004614566565b611490565b34801561055e57600080fd5b5061050f60245481565b34801561057457600080fd5b506104026105833660046146ff565b611511565b34801561059457600080fd5b5061050f6105a336600461461e565b61151c565b3480156105b457600080fd5b506105c86105c3366004614740565b61153d565b604080516001600160a01b039093168352602083019190915201610430565b6104026105f536600461461e565b611573565b34801561060657600080fd5b5061050f6106153660046146b7565b6116e6565b34801561062657600080fd5b5061062f6118d4565b6040516104309190614762565b34801561064857600080fd5b506104026106573660046146ff565b61192b565b34801561066857600080fd5b5061050f61067736600461461e565b611946565b34801561068857600080fd5b50602154610424906301000000900460ff1681565b3480156106a957600080fd5b506104026106b83660046147a6565b611b2c565b610402611b99565b3480156106d157600080fd5b506021546104249060ff1681565b3480156106eb57600080fd5b506104ae6106fa36600461461e565b611cee565b34801561070b57600080fd5b5061040261071a36600461461e565b611d00565b34801561072b57600080fd5b5061040261073a3660046147ef565b611d5f565b34801561074b57600080fd5b5061050f60225481565b34801561076157600080fd5b5061050f60185481565b34801561077757600080fd5b5061050f610786366004614864565b611e3f565b34801561079757600080fd5b50610402611f66565b3480156107ac57600080fd5b5061050f60255481565b3480156107c257600080fd5b506104816107d1366004614881565b611fcc565b3480156107e257600080fd5b5061062f6107f1366004614864565b612066565b61040261080436600461461e565b612128565b34801561081557600080fd5b5061050f60275481565b34801561082b57600080fd5b5061040261083a36600461461e565b6123a8565b34801561084b57600080fd5b50600c546001600160a01b03166104ae565b34801561086957600080fd5b506108b361087836600461489c565b600e60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b60408051928352602083019190915201610430565b3480156108d457600080fd5b506104026125db565b3480156108e957600080fd5b506104026108f836600461461e565b612673565b34801561090957600080fd5b506104816126d2565b34801561091e57600080fd5b5061050f60165481565b34801561093457600080fd5b50610424610943366004614864565b60126020526000908152604090205460ff1681565b34801561096457600080fd5b5061050f60235481565b34801561097a57600080fd5b506104026109893660046148f3565b6126e1565b34801561099a57600080fd5b506104026109a9366004614931565b6127a5565b3480156109ba57600080fd5b5061050f6109c9366004614864565b60106020526000908152604090205481565b3480156109e757600080fd5b506104026109f636600461461e565b61282e565b348015610a0757600080fd5b5060215461042490610100900460ff1681565b348015610a2657600080fd5b5061050f60265481565b348015610a3c57600080fd5b50610481610a4b36600461461e565b61288d565b6104026129c6565b610402610a663660046149da565b612a20565b348015610a7757600080fd5b50610402612bde565b348015610a8c57600080fd5b50610402610a9b36600461461e565b612c6b565b348015610aac57600080fd5b50610402612cca565b348015610ac157600080fd5b5061050f60175481565b348015610ad757600080fd5b50610424610ae6366004614a66565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b348015610b2057600080fd5b50610402610b2f366004614a94565b612d4e565b348015610b4057600080fd5b50610424610b4f366004614864565b60116020526000908152604090205460ff1681565b348015610b7057600080fd5b5061050f60155481565b348015610b8657600080fd5b5061050f601e5481565b348015610b9c57600080fd5b506021546104249062010000900460ff1681565b348015610bbc57600080fd5b50610402610bcb366004614864565b612dc6565b600d546001600160a01b03163314610be757600080fd5b61ffff84166000908152600f602052604090208054610c0590614ae7565b90508351148015610c44575061ffff84166000908152600f6020526040908190209051610c329190614b8a565b60405180910390208380519060200120145b610cbb5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b6040517f1c37a8220000000000000000000000000000000000000000000000000000000081523090631c37a82290610cfd908790879087908790600401614b96565b600060405180830381600087803b158015610d1757600080fd5b505af1925050508015610d28575060015b610de7576040518060400160405280825181526020018280519060200120815250600e60008661ffff1661ffff16815260200190815260200160002084604051610d729190614be0565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610dde908690869086908690614b96565b60405180910390a15b50505050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610e2b5750610e2b82612eab565b92915050565b600c546001600160a01b03163314610e8b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b602455565b600c546001600160a01b03163314610eea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b604051339082156108fc029083906000818181858888f19350505050158015610f17573d6000803e3d6000fd5b5050565b606060068054610f2a90614ae7565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5690614ae7565b8015610fa35780601f10610f7857610100808354040283529160200191610fa3565b820191906000526020600020905b815481529060010190602001808311610f8657829003601f168201915b5050505050905090565b6000610fb882612f7a565b61102a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231423a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e000000000000000000000000000000000000006064820152608401610cb2565b506000908152600a60205260409020546001600160a01b031690565b600061105182611cee565b9050806001600160a01b0316836001600160a01b0316036110da5760405162461bcd60e51b815260206004820152602260248201527f455243373231423a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b336001600160a01b03821614806110f657506110f68133610ae6565b6111685760405162461bcd60e51b815260206004820152603960248201527f455243373231423a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610cb2565b611173838383613003565b505050565b61118181611cee565b6001600160a01b0316336001600160a01b0316146111e15760405162461bcd60e51b815260206004820152601960248201527f596f7520646f6e2774206f776e207468697320746f6b656e2e000000000000006044820152606401610cb2565b61ffff82166000908152600f6020526040812080546111ff90614ae7565b9050116112745760405162461bcd60e51b815260206004820152603160248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201527f626c6520666f72207472616e736665722e0000000000000000000000000000006064820152608401610cb2565b61127d81613077565b604080513360208201528082018390528151808203830181526060820183527e0100000000000000000000000000000000000000000000000000000000000060808301526205573060828084018290528451808503909101815260a2840194859052600d547f40a7bb100000000000000000000000000000000000000000000000000000000090955291936001939192916000916001600160a01b0316906340a7bb1090611337908a9030908a908790899060a601614bfc565b6040805180830381865afa158015611353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113779190614c4e565b509050803410156113f05760405162461bcd60e51b815260206004820152602a60248201527f506c656173652073656e64206d6f72652067617320666f7220746865206d657360448201527f7361676520666565732e000000000000000000000000000000000000000000006064820152608401610cb2565b600d5461ffff88166000908152600f602052604080822090517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b039093169263c5803100923492611455928d928c913391908b90600401614c72565b6000604051808303818588803b15801561146e57600080fd5b505af1158015611482573d6000803e3d6000fd5b505050505050505050505050565b3330146115055760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201527f206265204272696467652e0000000000000000000000000000000000000000006064820152608401610cb2565b610de7848484846132b6565b6111738383836132e3565b6013818154811061152c57600080fd5b600091825260209091200154905081565b601f54601e546001600160a01b0390911690600090612710906115609085614d68565b61156a9190614d9d565b90509250929050565b806000811180156115a457507f00000000000000000000000000000000000000000000000000000000000000008111155b6115fa5760405162461bcd60e51b815260206004820152602160248201527f5175616e746974792073686f756c64206265206c6f776572207468616e2032306044820152601760f91b6064820152608401610cb2565b60155460255461160a9190614db1565b6017546116179190614db1565b816028546116259190614dc8565b11156116735760405162461bcd60e51b815260206004820152601660248201527f457863656564656420746f74616c20737570706c792e000000000000000000006044820152606401610cb2565b60215460ff16156116c65760405162461bcd60e51b815260206004820152601560248201527f53616c6520686173206e6f7420737461727465642e00000000000000000000006044820152606401610cb2565b6116d1335b836136b1565b816028546116df9190614dc8565b6028555050565b60006116f183611e3f565b82106117655760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b60008060005b6002548111611865576000818152600860209081526040918290208251808401909352546001600160a01b0381168352600160a01b900467ffffffffffffffff16908201526117b9826136cb565b80156117c6575060005482105b1561181e5780516001600160a01b0316156117e057805192505b866001600160a01b0316836001600160a01b0316036118195785840361180b57509250610e2b915050565b8361181581614de0565b9450505b611852565b80516001600160a01b038089169116036118525785840361184457509250610e2b915050565b8361184e81614de0565b9450505b508061185d81614de0565b91505061176b565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610cb2565b60606013805480602002602001604051908101604052809291908181526020018280548015610fa357602002820191906000526020600020905b81548152602001906001019080831161190e575050505050905090565b611173838383604051806020016040528060008152506127a5565b60006002548211156119c05760405162461bcd60e51b815260206004820152602360248201527f455243373231423a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b6000805b6002548111611abd576000818152600860209081526040918290208251808401909352546001600160a01b0381168352600160a01b900467ffffffffffffffff1690820152611a12826136cb565b15611a5f5760055481516001600160a01b03908116911614801590611a38575060005482105b15611a5a57848303611a4c57509392505050565b82611a5681614de0565b9350505b611aaa565b80516001600160a01b031615801590611a88575060055481516001600160a01b03908116911614155b15611aaa57848303611a9c57509392505050565b82611aa681614de0565b9350505b5080611ab581614de0565b9150506119c4565b5060405162461bcd60e51b815260206004820152602560248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e2062792060448201527f696e6465780000000000000000000000000000000000000000000000000000006064820152608401610cb2565b600c546001600160a01b03163314611b865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b8051610f1790601990602084019061437c565b60215460ff1615611bec5760405162461bcd60e51b815260206004820152601560248201527f53616c6520686173206e6f7420737461727465642e00000000000000000000006044820152606401610cb2565b60255460155410611c3f5760405162461bcd60e51b815260206004820152601a60248201527f45786365656465642066726565206d696e7420737570706c792e0000000000006044820152606401610cb2565b3360009081526011602052604090205460ff1615611c9f5760405162461bcd60e51b815260206004820152601d60248201527f596f75206861766520616c72656164792066726565206d696e7465642e0000006044820152606401610cb2565b611caa3360016136b1565b336000908152601160205260408120805460ff191660011790556015805491611cd283614de0565b909155505060288054906000611ce783614de0565b9190505550565b6000611cf9826136e3565b5192915050565b600c546001600160a01b03163314611d5a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b601d55565b600c546001600160a01b03163314611db95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b60005b8181101561117357611de5838383818110611dd957611dd9614dfa565b90506020020135613077565b6013838383818110611df957611df9614dfa565b83546001810185556000948552602080862092029390930135920191909155506016805491611e2783614de0565b91905055508080611e3790614de0565b915050611dbc565b60006001600160a01b038216611ebd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231423a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610cb2565b6005546001600160a01b0390811690831603611f415760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a2062616c616e636520717565727920666f7220746865206260448201527f75726e61646472657373000000000000000000000000000000000000000000006064820152608401610cb2565b506001600160a01b03166000908152600960205260409020546001600160801b031690565b600c546001600160a01b03163314611fc05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b611fca60006139c7565b565b600f6020526000908152604090208054611fe590614ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461201190614ae7565b801561205e5780601f106120335761010080835404028352916020019161205e565b820191906000526020600020905b81548152906001019060200180831161204157829003601f168201915b505050505081565b6060600061207383611e3f565b9050806000036120975760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156120b2576120b261449b565b6040519080825280602002602001820160405280156120db578160200160208202803683370190505b50905060005b8281101561208f576120f385826116e6565b82828151811061210557612105614dfa565b60209081029190910101528061211a81614de0565b9150506120e1565b50919050565b8060008111801561215957507f00000000000000000000000000000000000000000000000000000000000000008111155b6121af5760405162461bcd60e51b815260206004820152602160248201527f5175616e746974792073686f756c64206265206c6f776572207468616e2032306044820152601760f91b6064820152608401610cb2565b6015546025546121bf9190614db1565b6017546121cc9190614db1565b816028546121da9190614dc8565b11156122285760405162461bcd60e51b815260206004820152601660248201527f457863656564656420746f74616c20737570706c792e000000000000000000006044820152606401610cb2565b602154610100900460ff16156122805760405162461bcd60e51b815260206004820152601860248201527f50726573616c6520686173206e6f7420737461727465642e00000000000000006044820152606401610cb2565b6027543360009081526010602052604090205461229e908490614dc8565b11156122ec5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e2774206d696e74206d6f726520746f6b656e732e00000000006044820152606401610cb2565b602654826014546122fd9190614dc8565b11156123555760405162461bcd60e51b815260206004820152602160248201527f457863656564656420746f74616c20737570706c79206f662070726573616c656044820152601760f91b6064820152608401610cb2565b61235e336116cb565b8160145461236c9190614dc8565b6014553360009081526010602052604090205461238a908390614dc8565b336000908152601060205260409020556028546116df908390614dc8565b60215462010000900460ff16156124015760405162461bcd60e51b815260206004820152601e60248201527f4561726c79207175697474696e67206973206e6f7420656e61626c65642e00006044820152606401610cb2565b3361240b82611cee565b6001600160a01b0316148061243057503361242582610fad565b6001600160a01b0316145b6124a15760405162461bcd60e51b8152602060048201526024808201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e2e000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b3360009081526012602052604090205460ff16156125015760405162461bcd60e51b815260206004820152601c60248201527f596f75206861766520616c7265616479206561726c7920717569742e000000006044820152606401610cb2565b6024544710156125795760405162461bcd60e51b815260206004820152602360248201527f4e6f7420656e6f7567682062616c616e636520696e2074686520636f6e74726160448201527f63742e00000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b61258f33600c546001600160a01b03168361192b565b602454604051339180156108fc02916000818181858888f193505050501580156125bd573d6000803e3d6000fd5b5050336000908152601260205260409020805460ff19166001179055565b600c546001600160a01b031633146126355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b6021546301000000900460ff161515600114612660576021805463ff00000019166301000000179055565b6021805463ff0000001916905560005b50565b600c546001600160a01b031633146126cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b602255565b606060078054610f2a90614ae7565b336001600160a01b038316036127395760405162461bcd60e51b815260206004820152601a60248201527f455243373231423a20617070726f766520746f2063616c6c65720000000000006044820152606401610cb2565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6127b08484846132e3565b6127bc84848484613a31565b610de75760405162461bcd60e51b815260206004820152603360248201527f455243373231423a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610cb2565b600c546001600160a01b031633146128885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b601c55565b606061289882612f7a565b6128e45760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006044820152606401610cb2565b6021546301000000900460ff16151560000361298c57601a805461290790614ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461293390614ae7565b80156129805780601f1061295557610100808354040283529160200191612980565b820191906000526020600020905b81548152906001019060200180831161296357829003601f168201915b50505050509050919050565b601961299783613bbb565b601b6040516020016129ab93929190614e10565b6040516020818303038152906040529050919050565b919050565b600c546001600160a01b03163314611fca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b61ffff85166000908152600e60205260408082209051612a41908790614be0565b908152604080516020928190038301902067ffffffffffffffff87166000908152925290206001810154909150612ae05760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201527f65737361676500000000000000000000000000000000000000000000000000006064820152608401610cb2565b805482148015612b0a575080600101548383604051612b00929190614e38565b6040518091039020145b612b565760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610cb2565b600080825560018201556040517f1c37a8220000000000000000000000000000000000000000000000000000000081523090631c37a82290612ba49089908990899089908990600401614e48565b600060405180830381600087803b158015612bbe57600080fd5b505af1158015612bd2573d6000803e3d6000fd5b50505050505050505050565b600c546001600160a01b03163314612c385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b60215460ff610100909104161515600114612c5e576021805461ff001916610100179055565b6021805461ff0019169055565b600c546001600160a01b03163314612cc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b602355565b600c546001600160a01b03163314612d245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b60215460ff161515600114612d42576021805460ff19166001179055565b6021805460ff19169055565b600c546001600160a01b03163314612da85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b61ffff83166000908152600f60205260409020610de7908383614400565b600c546001600160a01b03163314612e205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb2565b6001600160a01b038116612e9c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610cb2565b612670816139c7565b3b151590565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612f0e57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80612f4257506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610e2b57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610e2b565b6000612f85826136cb565b15612fbc5760005482108015610e2b575050600554600091825260086020526040909120546001600160a01b039182169116141590565b6000828152600860205260409020546001600160a01b031615801590610e2b575050600554600091825260086020526040909120546001600160a01b039182169116141590565b6000828152600a602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000613082826136e3565b9050600061308f83611cee565b905061309d60008483613003565b6001600160a01b0381166000908152600960209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906130fa90600190614eaa565b6001600160801b03168152602001600183602001516131199190614eaa565b6001600160801b039081169091526001600160a01b03841660009081526009602090815260408220845194909101518316600160801b0293909216929092179055600180549161316883614ed2565b90915550506040805180820182526005546001600160a01b03908116825267ffffffffffffffff428116602080850191825260008a81526008909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556131d5856001614dc8565b90506131e0816136cb565b801561320157506000818152600860205260409020546001600160a01b0316155b156132775761320f81612f7a565b156132775760408051808201825285516001600160a01b03908116825260208088015167ffffffffffffffff9081168285019081526000878152600890935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b60405185906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050505050565b600080828060200190518101906132cd9190614ee9565b915091506132db8282613cf0565b505050505050565b60006132ee826136e3565b80519091506000906001600160a01b0316336001600160a01b0316148061332557503361331a84610fad565b6001600160a01b0316145b80613337575081516133379033610ae6565b9050806133ac5760405162461bcd60e51b815260206004820152603260248201527f455243373231423a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610cb2565b846001600160a01b031682600001516001600160a01b0316146134375760405162461bcd60e51b815260206004820152602660248201527f455243373231423a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610cb2565b6001600160a01b0384166134b35760405162461bcd60e51b815260206004820152602560248201527f455243373231423a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610cb2565b6134c36000848460000151613003565b6001600160a01b03851660009081526009602052604081208054600192906134f59084906001600160801b0316614eaa565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600960205260408120805460019450909261354191859116614f17565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526008909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556135c9846001614dc8565b90506135d4816136cb565b80156135f557506000818152600860205260409020546001600160a01b0316155b1561366b5761360381612f7a565b1561366b5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600890935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132db565b610f17828260405180602001604052806000815250613d0a565b60006003548210158015610e2b575050600454101590565b604080518082019091526000808252602082015261370082612f7a565b6137725760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610cb2565b6000828152600860209081526040918290208251808401909352546001600160a01b0381168352600160a01b900467ffffffffffffffff16908201526137b7836136cb565b61385d5780516001600160a01b0316158015906137e4575060055481516001600160a01b03908116911614155b156137ef5792915050565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231423a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610cb2565b60007f000000000000000000000000000000000000000000000000000000000000000084106138be576138b07f000000000000000000000000000000000000000000000000000000000000000085614db1565b6138bb906001614dc8565b90505b6003548110156138cd57506003545b835b818110613958576000818152600860209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915290935015801590613938575060055483516001600160a01b03908116911614155b156139465750909392505050565b8061395081614ed2565b9150506138cf565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231423a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610cb2565b600c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15613baf576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290613a8e903390899088908890600401614f42565b6020604051808303816000875af1925050508015613ac9575060408051601f3d908101601f19168201909252613ac691810190614f7e565b60015b613b7c573d808015613af7576040519150601f19603f3d011682016040523d82523d6000602084013e613afc565b606091505b508051600003613b745760405162461bcd60e51b815260206004820152603360248201527f455243373231423a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610cb2565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050613bb3565b5060015b949350505050565b606081600003613bfe57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613c285780613c1281614de0565b9150613c219050600a83614d9d565b9150613c02565b60008167ffffffffffffffff811115613c4357613c4361449b565b6040519080825280601f01601f191660200182016040528015613c6d576020820181803683370190505b5090505b8415613bb357613c82600183614db1565b9150613c8f600a86614f9b565b613c9a906030614dc8565b60f81b818381518110613caf57613caf614dfa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613ce9600a86614d9d565b9450613c71565b610f178282604051806020016040528060008152506140d3565b6000546001600160a01b038416613d6d5760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610cb2565b6005546001600160a01b0390811690851603613dd55760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865206275726e206164647265736044820152607360f81b6064820152608401610cb2565b613dde81612f7a565b15613e2b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231423a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610cb2565b7f0000000000000000000000000000000000000000000000000000000000000000831115613ec15760405162461bcd60e51b815260206004820152602260248201527f455243373231423a207175616e7469747920746f206d696e7420746f6f20686960448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610cb2565b6001600160a01b0384166000908152600960209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190613f1d908790614f17565b6001600160801b03168152602001858360200151613f3b9190614f17565b6001600160801b039081169091526001600160a01b0380881660008181526009602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526008909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156140c85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461401f6000888488613a31565b6140915760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610cb2565b8161409b81614de0565b6001805491945090915060006140b083614de0565b919050555080806140c090614de0565b915050613fd2565b5060008190556132db565b6140dd838361415c565b6140ea6000848484613a31565b6111735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610cb2565b6001600160a01b0382166141b25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cb2565b6005546001600160a01b039081169083160361421a5760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865206275726e206164647265736044820152607360f81b6064820152608401610cb2565b6001805490600061422a83614de0565b919050555060025481111561423f5760028190555b6001600160a01b0382166000908152600960209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061429b906001614f17565b6001600160801b03168152602001826020015160016142ba9190614f17565b6001600160801b039081169091526001600160a01b0380861660008181526009602090815260408083208751978301518716600160801b0297909616969096179094558451808601865282815267ffffffffffffffff4281168287019081528984526008909652868320915182549651909116600160a01b026001600160e01b0319909616941693909317939093179091559151849291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b82805461438890614ae7565b90600052602060002090601f0160209004810192826143aa57600085556143f0565b82601f106143c357805160ff19168380011785556143f0565b828001600101855582156143f0579182015b828111156143f05782518255916020019190600101906143d5565b506143fc929150614474565b5090565b82805461440c90614ae7565b90600052602060002090601f01602090048101928261442e57600085556143f0565b82601f106144475782800160ff198235161785556143f0565b828001600101855582156143f0579182015b828111156143f0578235825591602001919060010190614459565b5b808211156143fc5760008155600101614475565b803561ffff811681146129c157600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156144cc576144cc61449b565b604051601f8501601f19908116603f011681019082821181831017156144f4576144f461449b565b8160405280935085815286868601111561450d57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261453857600080fd5b614547838335602085016144b1565b9392505050565b803567ffffffffffffffff811681146129c157600080fd5b6000806000806080858703121561457c57600080fd5b61458585614489565b9350602085013567ffffffffffffffff808211156145a257600080fd5b6145ae88838901614527565b94506145bc6040880161454e565b935060608701359150808211156145d257600080fd5b506145df87828801614527565b91505092959194509250565b6001600160e01b03198116811461267057600080fd5b60006020828403121561461357600080fd5b8135614547816145eb565b60006020828403121561463057600080fd5b5035919050565b60005b8381101561465257818101518382015260200161463a565b83811115610de75750506000910152565b6000815180845261467b816020860160208601614637565b601f01601f19169290920160200192915050565b6020815260006145476020830184614663565b6001600160a01b038116811461267057600080fd5b600080604083850312156146ca57600080fd5b82356146d5816146a2565b946020939093013593505050565b600080604083850312156146f657600080fd5b6146d583614489565b60008060006060848603121561471457600080fd5b833561471f816146a2565b9250602084013561472f816146a2565b929592945050506040919091013590565b6000806040838503121561475357600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561479a5783518352928401929184019160010161477e565b50909695505050505050565b6000602082840312156147b857600080fd5b813567ffffffffffffffff8111156147cf57600080fd5b8201601f810184136147e057600080fd5b613bb3848235602084016144b1565b6000806020838503121561480257600080fd5b823567ffffffffffffffff8082111561481a57600080fd5b818501915085601f83011261482e57600080fd5b81358181111561483d57600080fd5b8660208260051b850101111561485257600080fd5b60209290920196919550909350505050565b60006020828403121561487657600080fd5b8135614547816146a2565b60006020828403121561489357600080fd5b61454782614489565b6000806000606084860312156148b157600080fd5b6148ba84614489565b9250602084013567ffffffffffffffff8111156148d657600080fd5b6148e286828701614527565b925050604084013590509250925092565b6000806040838503121561490657600080fd5b8235614911816146a2565b91506020830135801515811461492657600080fd5b809150509250929050565b6000806000806080858703121561494757600080fd5b8435614952816146a2565b93506020850135614962816146a2565b925060408501359150606085013567ffffffffffffffff81111561498557600080fd5b6145df87828801614527565b60008083601f8401126149a357600080fd5b50813567ffffffffffffffff8111156149bb57600080fd5b6020830191508360208285010111156149d357600080fd5b9250929050565b6000806000806000608086880312156149f257600080fd5b6149fb86614489565b9450602086013567ffffffffffffffff80821115614a1857600080fd5b614a2489838a01614527565b9550614a326040890161454e565b94506060880135915080821115614a4857600080fd5b50614a5588828901614991565b969995985093965092949392505050565b60008060408385031215614a7957600080fd5b8235614a84816146a2565b91506020830135614926816146a2565b600080600060408486031215614aa957600080fd5b614ab284614489565b9250602084013567ffffffffffffffff811115614ace57600080fd5b614ada86828701614991565b9497909650939450505050565b600181811c90821680614afb57607f821691505b60208210810361212257634e487b7160e01b600052602260045260246000fd5b60008154614b2881614ae7565b60018281168015614b405760018114614b5157614b80565b60ff19841687528287019450614b80565b8560005260208060002060005b85811015614b775781548a820152908401908201614b5e565b50505082870194505b5050505092915050565b60006145478284614b1b565b61ffff85168152608060208201526000614bb36080830186614663565b67ffffffffffffffff851660408401528281036060840152614bd58185614663565b979650505050505050565b60008251614bf2818460208701614637565b9190910192915050565b61ffff861681526001600160a01b038516602082015260a060408201526000614c2860a0830186614663565b84151560608401528281036080840152614c428185614663565b98975050505050505050565b60008060408385031215614c6157600080fd5b505080516020909101519092909150565b61ffff871681526000602060c08184015260008854614c9081614ae7565b8060c087015260e0600180841660008114614cb25760018114614cc757614cf5565b60ff198516838a015261010089019550614cf5565b8d6000528660002060005b85811015614ced5781548b8201860152908301908801614cd2565b8a0184019650505b50505050508381036040850152614d0c8189614663565b915050614d2460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152614d458185614663565b9998505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614d8257614d82614d52565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614dac57614dac614d87565b500490565b600082821015614dc357614dc3614d52565b500390565b60008219821115614ddb57614ddb614d52565b500190565b60006000198203614df357614df3614d52565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000614e1c8286614b1b565b8451614e2c818360208901614637565b614bd581830186614b1b565b8183823760009101908152919050565b61ffff86168152608060208201526000614e656080830187614663565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60006001600160801b0383811690831681811015614eca57614eca614d52565b039392505050565b600081614ee157614ee1614d52565b506000190190565b60008060408385031215614efc57600080fd5b8251614f07816146a2565b6020939093015192949293505050565b60006001600160801b03808316818516808303821115614f3957614f39614d52565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614f746080830184614663565b9695505050505050565b600060208284031215614f9057600080fd5b8151614547816145eb565b600082614faa57614faa614d87565b50069056fea26469706673582212204f337896c178c3128578787473f82440fe723a079e78bc4a48141383f928300464736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001193d86353f139562919c291b8ad7c71d68fd70a0000000000000000000000000000000000000000000000000000000000000005746573742f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009746573742e6a736f6e0000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001193d86353f139562919c291b8ad7c71d68fd70a0000000000000000000000000000000000000000000000000000000000000005746573742f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009746573742e6a736f6e0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): test/
Arg [1] : _initNotRevealedURI (string): test.json
Arg [2] : _recipient (address): 0x1193d86353f139562919c291b8ad7c71d68fd70a

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000001193d86353f139562919c291b8ad7c71d68fd70a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 746573742f000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 746573742e6a736f6e0000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

55694:8802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32449:949;;;;;;;;;;-1:-1:-1;32449:949:0;;;;;:::i;:::-;;:::i;:::-;;61538:195;;;;;;;;;;-1:-1:-1;61538:195:0;;;;;:::i;:::-;;:::i;:::-;;;2749:14:1;;2742:22;2724:41;;2712:2;2697:18;61538:195:0;;;;;;;;63074:110;;;;;;;;;;-1:-1:-1;63074:110:0;;;;;:::i;:::-;;:::i;63968:119::-;;;;;;:::i;:::-;;:::i;41556:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42853:204::-;;;;;;;;;;-1:-1:-1;42853:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4067:55:1;;;4049:74;;4037:2;4022:18;42853:204:0;3903:226:1;42416:379:0;;;;;;;;;;-1:-1:-1;42416:379:0;;;;;:::i;:::-;;:::i;60340:835::-;;;;;;:::i;:::-;;:::i;55997:28::-;;;;;;;;;;;;;;;;;;;5016:25:1;;;5004:2;4989:18;55997:28:0;4870:177:1;36883:93:0;;;;;;;;;;-1:-1:-1;36960:10:0;;36883:93;;33406:356;;;;;;;;;;-1:-1:-1;33406:356:0;;;;;:::i;:::-;;:::i;56698:40::-;;;;;;;;;;;;;;;;43703:150;;;;;;;;;;-1:-1:-1;43703:150:0;;;;;:::i;:::-;;:::i;55962:28::-;;;;;;;;;;-1:-1:-1;55962:28:0;;;;;:::i;:::-;;:::i;61741:209::-;;;;;;;;;;-1:-1:-1;61741:209:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5958:55:1;;;5940:74;;6045:2;6030:18;;6023:34;;;;5913:18;61741:209:0;5766:297:1;60008:324:0;;;;;;:::i;:::-;;:::i;38165:984::-;;;;;;;;;;-1:-1:-1;38165:984:0;;;;;:::i;:::-;;:::i;62471:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43916:157::-;;;;;;;;;;-1:-1:-1;43916:157:0;;;;;:::i;:::-;;:::i;37049:829::-;;;;;;;;;;-1:-1:-1;37049:829:0;;;;;:::i;:::-;;:::i;56575:27::-;;;;;;;;;;-1:-1:-1;56575:27:0;;;;;;;;;;;63854:106;;;;;;;;;;-1:-1:-1;63854:106:0;;;;;:::i;:::-;;:::i;58533:565::-;;;:::i;56456:30::-;;;;;;;;;;-1:-1:-1;56456:30:0;;;;;;;;41379:118;;;;;;;;;;-1:-1:-1;41379:118:0;;;;;:::i;:::-;;:::i;63192:112::-;;;;;;;;;;-1:-1:-1;63192:112:0;;;;;:::i;:::-;;:::i;62600:248::-;;;;;;;;;;-1:-1:-1;62600:248:0;;;;;:::i;:::-;;:::i;56611:35::-;;;;;;;;;;;;;;;;56131:31;;;;;;;;;;;;;;;;39639:297;;;;;;;;;;-1:-1:-1;39639:297:0;;;;;:::i;:::-;;:::i;6632:103::-;;;;;;;;;;;;;:::i;56745:32::-;;;;;;;;;;;;;;;;32291:51;;;;;;;;;;-1:-1:-1;32291:51:0;;;;;:::i;:::-;;:::i;61958:505::-;;;;;;;;;;-1:-1:-1;61958:505:0;;;;;:::i;:::-;;:::i;59106:894::-;;;;;;:::i;:::-;;:::i;56823:46::-;;;;;;;;;;;;;;;;57743:782;;;;;;;;;;-1:-1:-1;57743:782:0;;;;;:::i;:::-;;:::i;5981:87::-;;;;;;;;;;-1:-1:-1;6054:6:0;;-1:-1:-1;;;;;6054:6:0;5981:87;;32194:90;;;;;;;;;;-1:-1:-1;32194:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9268:25:1;;;9324:2;9309:18;;9302:34;;;;9241:18;32194:90:0;9094:248:1;63722:124:0;;;;;;;;;;;;;:::i;62856:96::-;;;;;;;;;;-1:-1:-1;62856:96:0;;;;;:::i;:::-;;:::i;41711:98::-;;;;;;;;;;;;;:::i;56068:25::-;;;;;;;;;;;;;;;;55910:45;;;;;;;;;;-1:-1:-1;55910:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56653:38;;;;;;;;;;;;;;;;43121:274;;;;;;;;;;-1:-1:-1;43121:274:0;;;;;:::i;:::-;;:::i;44136:319::-;;;;;;;;;;-1:-1:-1;44136:319:0;;;;;:::i;:::-;;:::i;55793:57::-;;;;;;;;;;-1:-1:-1;55793:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;63312:122;;;;;;;;;;-1:-1:-1;63312:122:0;;;;;:::i;:::-;;:::i;56493:33::-;;;;;;;;;;-1:-1:-1;56493:33:0;;;;;;;;;;;56784:32;;;;;;;;;;;;;;;;61183:347;;;;;;;;;;-1:-1:-1;61183:347:0;;;;;:::i;:::-;;:::i;64095:48::-;;;:::i;34238:758::-;;;;;;:::i;:::-;;:::i;63576:138::-;;;;;;;;;;;;;:::i;62960:106::-;;;;;;;;;;-1:-1:-1;62960:106:0;;;;;:::i;:::-;;:::i;63442:126::-;;;;;;;;;;;;;:::i;56100:24::-;;;;;;;;;;;;;;;;43458:186;;;;;;;;;;-1:-1:-1;43458:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;43603:25:0;;;43580:4;43603:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43458:186;35004:158;;;;;;;;;;-1:-1:-1;35004:158:0;;;;;:::i;:::-;;:::i;55857:46::-;;;;;;;;;;-1:-1:-1;55857:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56032:29;;;;;;;;;;;;;;;;56358:24;;;;;;;;;;;;;;;;56533:35;;;;;;;;;;-1:-1:-1;56533:35:0;;;;;;;;;;;6890:201;;;;;;;;;;-1:-1:-1;6890:201:0;;;;;:::i;:::-;;:::i;32449:949::-;32611:8;;-1:-1:-1;;;;;32611:8:0;32589:10;:31;32581:40;;;;;;32732:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;32710:11;:18;:61;:134;;;;-1:-1:-1;32811:32:0;;;;;;;:19;:32;;;;;;;32801:43;;;;32811:32;32801:43;:::i;:::-;;;;;;;;32785:11;32775:22;;;;;;:69;32710:134;32702:213;;;;-1:-1:-1;;;32702:213:0;;14045:2:1;32702:213:0;;;14027:21:1;14084:2;14064:18;;;14057:30;14123:34;14103:18;;;14096:62;14194:22;14174:18;;;14167:50;14234:19;;32702:213:0;;;;;;;;;33043:60;;;;;:4;;:16;;:60;;33060:11;;33073;;33086:6;;33094:8;;33043:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33039:352;;33250:52;;;;;;;;33265:8;:15;33250:52;;;;33292:8;33282:19;;;;;;33250:52;;;33199:14;:27;33214:11;33199:27;;;;;;;;;;;;;;;33227:11;33199:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;33322:57;;;;33336:11;;33349;;33240:6;;33370:8;;33322:57;:::i;:::-;;;;;;;;33039:352;32449:949;;;;:::o;61538:195::-;61614:4;-1:-1:-1;;;;;;61636:50:0;;61651:35;61636:50;;:90;;;61690:36;61714:11;61690:23;:36::i;:::-;61629:97;61538:195;-1:-1:-1;;61538:195:0:o;63074:110::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63150:14:::1;:26:::0;63074:110::o;63968:119::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;64041:38:::1;::::0;4897:10;;64041:38;::::1;;;::::0;64072:6;;64041:38:::1;::::0;;;64072:6;4897:10;64041:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;63968:119:::0;:::o;41556:94::-;41610:13;41639:5;41632:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41556:94;:::o;42853:204::-;42921:7;42945:16;42953:7;42945;:16::i;:::-;42937:74;;;;-1:-1:-1;;;42937:74:0;;15668:2:1;42937:74:0;;;15650:21:1;15707:2;15687:18;;;15680:30;15746:34;15726:18;;;15719:62;15817:15;15797:18;;;15790:43;15850:19;;42937:74:0;15466:409:1;42937:74:0;-1:-1:-1;43027:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43027:24:0;;42853:204::o;42416:379::-;42485:13;42501:24;42517:7;42501:15;:24::i;:::-;42485:40;;42546:5;-1:-1:-1;;;;;42540:11:0;:2;-1:-1:-1;;;;;42540:11:0;;42532:58;;;;-1:-1:-1;;;42532:58:0;;16082:2:1;42532:58:0;;;16064:21:1;16121:2;16101:18;;;16094:30;16160:34;16140:18;;;16133:62;16231:4;16211:18;;;16204:32;16253:19;;42532:58:0;15880:398:1;42532:58:0;4897:10;-1:-1:-1;;;;;42615:21:0;;;;:62;;-1:-1:-1;42640:37:0;42657:5;4897:10;43458:186;:::i;42640:37::-;42599:153;;;;-1:-1:-1;;;42599:153:0;;16485:2:1;42599:153:0;;;16467:21:1;16524:2;16504:18;;;16497:30;16563:34;16543:18;;;16536:62;16634:27;16614:18;;;16607:55;16679:19;;42599:153:0;16283:421:1;42599:153:0;42761:28;42770:2;42774:7;42783:5;42761:8;:28::i;:::-;42478:317;42416:379;;:::o;60340:835::-;60444:16;60452:7;60444;:16::i;:::-;-1:-1:-1;;;;;60430:30:0;:10;-1:-1:-1;;;;;60430:30:0;;60422:68;;;;-1:-1:-1;;;60422:68:0;;16911:2:1;60422:68:0;;;16893:21:1;16950:2;16930:18;;;16923:30;16989:27;16969:18;;;16962:55;17034:18;;60422:68:0;16709:349:1;60422:68:0;60509:29;;;60548:1;60509:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;60501:102;;;;-1:-1:-1;;;60501:102:0;;17265:2:1;60501:102:0;;;17247:21:1;17304:2;17284:18;;;17277:30;17343:34;17323:18;;;17316:62;17414:19;17394:18;;;17387:47;17451:19;;60501:102:0;17063:413:1;60501:102:0;60616:14;60622:7;60616:5;:14::i;:::-;60664:31;;;60675:10;60664:31;;;5940:74:1;6030:18;;;6023:34;;;60664:31:0;;;;;;;;;5913:18:1;;;60664:31:0;;17652:16:1;60794:30:0;;;17636:102:1;60748:6:0;17754:11:1;;;;17747:27;;;60794:30:0;;;;;;;;;;17790:12:1;;;60794:30:0;;;;60859:8;;:77;;;;60664:31;;60725:1;;60748:6;;60794:30;-1:-1:-1;;;;;;;60859:8:0;;:21;;:77;;60881:8;;60899:4;;60664:31;;-1:-1:-1;;60794:30:0;;60859:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60837:99;;;60968:10;60955:9;:23;;60947:78;;;;-1:-1:-1;;;60947:78:0;;18935:2:1;60947:78:0;;;18917:21:1;18974:2;18954:18;;;18947:30;19013:34;18993:18;;;18986:62;19084:12;19064:18;;;19057:40;19114:19;;60947:78:0;18733:406:1;60947:78:0;61036:8;;61078:29;;;61036:8;61078:29;;;:19;:29;;;;;;61036:131;;;;;-1:-1:-1;;;;;61036:8:0;;;;:13;;61057:9;;61036:131;;61068:8;;61109:7;;61126:10;;61036:8;61153:13;;61036:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60411:764;;;;;60340:835;;:::o;33406:356::-;33575:10;33597:4;33575:27;33567:83;;;;-1:-1:-1;;;33567:83:0;;20893:2:1;33567:83:0;;;20875:21:1;20932:2;20912:18;;;20905:30;20971:34;20951:18;;;20944:62;21042:13;21022:18;;;21015:41;21073:19;;33567:83:0;20691:407:1;33567:83:0;33699:55;33711:11;33724;33737:6;33745:8;33699:10;:55::i;43703:150::-;43819:28;43829:4;43835:2;43839:7;43819:9;:28::i;55962:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55962:28:0;:::o;61741:209::-;61879:9;;61925;;-1:-1:-1;;;;;61879:9:0;;;;61808:16;;61938:5;;61917:17;;:5;:17;:::i;:::-;61916:27;;;;:::i;:::-;61900:43;;61741:209;;;;;:::o;60008:324::-;60079:12;57525:1;57510:12;:16;:48;;;;;57546:12;57530;:28;;57510:48;57502:94;;;;-1:-1:-1;;;57502:94:0;;22041:2:1;57502:94:0;;;22023:21:1;22080:2;22060:18;;;22053:30;22119:34;22099:18;;;22092:62;-1:-1:-1;;;22170:18:1;;;22163:31;22211:19;;57502:94:0;21839:397:1;57502:94:0;57672:14;;57657:12;;:29;;;;:::i;:::-;57644:9;;:43;;;;:::i;:::-;57627:12;57615:9;;:24;;;;:::i;:::-;:73;;57607:108;;;;-1:-1:-1;;;57607:108:0;;22706:2:1;57607:108:0;;;22688:21:1;22745:2;22725:18;;;22718:30;22784:24;22764:18;;;22757:52;22826:18;;57607:108:0;22504:346:1;57607:108:0;60113:10:::1;::::0;::::1;;60112:11;60104:45;;;::::0;-1:-1:-1;;;60104:45:0;;23057:2:1;60104:45:0::1;::::0;::::1;23039:21:1::0;23096:2;23076:18;;;23069:30;23135:23;23115:18;;;23108:51;23176:18;;60104:45:0::1;22855:345:1::0;60104:45:0::1;60240:37;4897:10:::0;60250:12:::1;60264;60240:9;:37::i;:::-;60312:12;60300:9;;:24;;;;:::i;:::-;60288:9;:36:::0;-1:-1:-1;;60008:324:0:o;38165:984::-;38274:7;38309:16;38319:5;38309:9;:16::i;:::-;38301:5;:24;38293:71;;;;-1:-1:-1;;;38293:71:0;;23407:2:1;38293:71:0;;;23389:21:1;23446:2;23426:18;;;23419:30;23485:34;23465:18;;;23458:62;23556:4;23536:18;;;23529:32;23578:19;;38293:71:0;23205:398:1;38293:71:0;38371:19;38401:25;38451:9;38446:635;38471:10;;38466:1;:15;38446:635;;38497:31;38531:14;;;:11;:14;;;;;;;;;38497:48;;;;;;;;;-1:-1:-1;;;;;38497:48:0;;;;-1:-1:-1;;;38497:48:0;;;;;;;;38559:11;38531:14;38559:8;:11::i;:::-;:33;;;;;38579:12;;38575:1;:16;38559:33;38556:518;;;38609:14;;-1:-1:-1;;;;;38609:28:0;;38604:97;;38675:14;;;-1:-1:-1;38604:97:0;38738:5;-1:-1:-1;;;;;38717:26:0;:17;-1:-1:-1;;;;;38717:26:0;;38713:155;;38779:5;38764:11;:20;38760:69;;-1:-1:-1;38812:1:0;-1:-1:-1;38805:8:0;;-1:-1:-1;;38805:8:0;38760:69;38843:13;;;;:::i;:::-;;;;38713:155;38556:518;;;38912:14;;-1:-1:-1;;;;;38912:23:0;;;;;;38908:152;;38971:5;38956:11;:20;38952:69;;-1:-1:-1;39004:1:0;-1:-1:-1;38997:8:0;;-1:-1:-1;;38997:8:0;38952:69;39035:13;;;;:::i;:::-;;;;38908:152;-1:-1:-1;38483:3:0;;;;:::i;:::-;;;;38446:635;;;-1:-1:-1;39087:56:0;;-1:-1:-1;;;39087:56:0;;24010:2:1;39087:56:0;;;23992:21:1;24049:2;24029:18;;;24022:30;24088:34;24068:18;;;24061:62;24159:16;24139:18;;;24132:44;24193:19;;39087:56:0;23808:410:1;62471:102:0;62518:16;62554:11;62547:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62471:102;:::o;43916:157::-;44028:39;44045:4;44051:2;44055:7;44028:39;;;;;;;;;;;;:16;:39::i;37049:829::-;37116:7;37150:10;;37141:5;:19;;37133:67;;;;-1:-1:-1;;;37133:67:0;;24425:2:1;37133:67:0;;;24407:21:1;24464:2;24444:18;;;24437:30;24503:34;24483:18;;;24476:62;24574:5;24554:18;;;24547:33;24597:19;;37133:67:0;24223:399:1;37133:67:0;37210:19;37247:9;37242:575;37267:10;;37262:1;:15;37242:575;;37293:31;37327:14;;;:11;:14;;;;;;;;;37293:48;;;;;;;;;-1:-1:-1;;;;;37293:48:0;;;;-1:-1:-1;;;37293:48:0;;;;;;;;37355:11;37327:14;37355:8;:11::i;:::-;37352:458;;;37402:11;;37384:14;;-1:-1:-1;;;;;37384:29:0;;;37402:11;;37384:29;;;;37383:53;;;37423:12;;37419:1;:16;37383:53;37378:183;;;37472:5;37457:11;:20;37453:69;;-1:-1:-1;37505:1:0;37049:829;-1:-1:-1;;;37049:829:0:o;37453:69::-;37536:13;;;;:::i;:::-;;;;37378:183;37352:458;;;37606:14;;-1:-1:-1;;;;;37606:28:0;;;;;37605:65;;-1:-1:-1;37658:11:0;;37640:14;;-1:-1:-1;;;;;37640:29:0;;;37658:11;;37640:29;;37605:65;37601:195;;;37707:5;37692:11;:20;37688:69;;-1:-1:-1;37740:1:0;37049:829;-1:-1:-1;;;37049:829:0:o;37688:69::-;37771:13;;;;:::i;:::-;;;;37601:195;-1:-1:-1;37279:3:0;;;;:::i;:::-;;;;37242:575;;;-1:-1:-1;37825:47:0;;-1:-1:-1;;;37825:47:0;;24829:2:1;37825:47:0;;;24811:21:1;24868:2;24848:18;;;24841:30;24907:34;24887:18;;;24880:62;24978:7;24958:18;;;24951:35;25003:19;;37825:47:0;24627:401:1;63854:106:0;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63931:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;58533:565::-:0;58753:10;;;;58752:11;58744:45;;;;-1:-1:-1;;;58744:45:0;;23057:2:1;58744:45:0;;;23039:21:1;23096:2;23076:18;;;23069:30;23135:23;23115:18;;;23108:51;23176:18;;58744:45:0;22855:345:1;58744:45:0;58825:12;;58808:14;;:29;58800:68;;;;-1:-1:-1;;;58800:68:0;;25235:2:1;58800:68:0;;;25217:21:1;25274:2;25254:18;;;25247:30;25313:28;25293:18;;;25286:56;25359:18;;58800:68:0;25033:350:1;58800:68:0;4897:10;58887:27;;;;:13;:27;;;;;;;;:36;58879:78;;;;-1:-1:-1;;;58879:78:0;;25590:2:1;58879:78:0;;;25572:21:1;25629:2;25609:18;;;25602:30;25668:31;25648:18;;;25641:59;25717:18;;58879:78:0;25388:353:1;58879:78:0;58970:26;4897:10;58994:1;58970:9;:26::i;:::-;4897:10;59007:27;;;;:13;:27;;;;;:34;;-1:-1:-1;;59007:34:0;59037:4;59007:34;;;59052:14;:16;;;;;;:::i;:::-;;;;-1:-1:-1;;59079:9:0;:11;;;:9;:11;;;:::i;:::-;;;;;;58533:565::o;41379:118::-;41443:7;41466:20;41478:7;41466:11;:20::i;:::-;:25;;41379:118;-1:-1:-1;;41379:118:0:o;63192:112::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63268:14:::1;:28:::0;63192:112::o;62600:248::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;62691:9:::1;62686:155;62702:18:::0;;::::1;62686:155;;;62742:17;62748:7;;62756:1;62748:10;;;;;;;:::i;:::-;;;;;;;62742:5;:17::i;:::-;62774:11;62791:7;;62799:1;62791:10;;;;;;;:::i;:::-;62774:28:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;62774:28:0;;;62791:10:::1;62774:28:::0;;;62791:10;::::1;::::0;;;::::1;;62774:28:::0;::::1;::::0;;;;-1:-1:-1;62817:10:0::1;:12:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;62722:3;;;;;:::i;:::-;;;;62686:155;;39639:297:::0;39703:7;-1:-1:-1;;;;;39727:19:0;;39719:75;;;;-1:-1:-1;;;39719:75:0;;26137:2:1;39719:75:0;;;26119:21:1;26176:2;26156:18;;;26149:30;26215:34;26195:18;;;26188:62;26286:13;26266:18;;;26259:41;26317:19;;39719:75:0;25935:407:1;39719:75:0;39818:11;;-1:-1:-1;;;;;39818:11:0;;;39809:20;;;;39801:75;;;;-1:-1:-1;;;39801:75:0;;26549:2:1;39801:75:0;;;26531:21:1;26588:2;26568:18;;;26561:30;26627:34;26607:18;;;26600:62;26698:12;26678:18;;;26671:40;26728:19;;39801:75:0;26347:406:1;39801:75:0;-1:-1:-1;;;;;;39902:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39902:27:0;;39639:297::o;6632:103::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;6697:30:::1;6724:1;6697:18;:30::i;:::-;6632:103::o:0;32291:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61958:505::-;62019:16;62049:18;62070:17;62080:6;62070:9;:17::i;:::-;62049:38;;62106:10;62120:1;62106:15;62102:354;;62145:16;;;62159:1;62145:16;;;;;;;;;;;-1:-1:-1;62138:23:0;61958:505;-1:-1:-1;;;61958:505:0:o;62102:354::-;62194:23;62234:10;62220:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62220:25:0;;62194:51;;62260:13;62288:130;62312:10;62304:5;:18;62288:130;;;62368:34;62388:6;62396:5;62368:19;:34::i;:::-;62352:6;62359:5;62352:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;62324:7;;;;:::i;:::-;;;;62288:130;;62102:354;62038:425;61958:505;;;:::o;59106:894::-;59180:12;57525:1;57510:12;:16;:48;;;;;57546:12;57530;:28;;57510:48;57502:94;;;;-1:-1:-1;;;57502:94:0;;22041:2:1;57502:94:0;;;22023:21:1;22080:2;22060:18;;;22053:30;22119:34;22099:18;;;22092:62;-1:-1:-1;;;22170:18:1;;;22163:31;22211:19;;57502:94:0;21839:397:1;57502:94:0;57672:14;;57657:12;;:29;;;;:::i;:::-;57644:9;;:43;;;;:::i;:::-;57627:12;57615:9;;:24;;;;:::i;:::-;:73;;57607:108;;;;-1:-1:-1;;;57607:108:0;;22706:2:1;57607:108:0;;;22688:21:1;22745:2;22725:18;;;22718:30;22784:24;22764:18;;;22757:52;22826:18;;57607:108:0;22504:346:1;57607:108:0;59384:13:::1;::::0;::::1;::::0;::::1;;;59383:14;59375:51;;;::::0;-1:-1:-1;;;59375:51:0;;26960:2:1;59375:51:0::1;::::0;::::1;26942:21:1::0;26999:2;26979:18;;;26972:30;27038:26;27018:18;;;27011:54;27082:18;;59375:51:0::1;26758:348:1::0;59375:51:0::1;59580:27;::::0;4897:10;59526:35:::1;::::0;;;:21:::1;:35;::::0;;;;;:50:::1;::::0;59564:12;;59526:50:::1;:::i;:::-;:81;;59518:121;;;::::0;-1:-1:-1;;;59518:121:0;;27313:2:1;59518:121:0::1;::::0;::::1;27295:21:1::0;27352:2;27332:18;;;27325:30;27391:29;27371:18;;;27364:57;27438:18;;59518:121:0::1;27111:351:1::0;59518:121:0::1;59690:11;;59674:12;59658:13;;:28;;;;:::i;:::-;:43;;59650:89;;;::::0;-1:-1:-1;;;59650:89:0;;27669:2:1;59650:89:0::1;::::0;::::1;27651:21:1::0;27708:2;27688:18;;;27681:30;27747:34;27727:18;;;27720:62;-1:-1:-1;;;27798:18:1;;;27791:31;27839:19;;59650:89:0::1;27467:397:1::0;59650:89:0::1;59752:37;4897:10:::0;59762:12:::1;4817:98:::0;59752:37:::1;59834:12;59818:13;;:28;;;;:::i;:::-;59802:13;:44:::0;4897:10;59895:35:::1;::::0;;;:21:::1;:35;::::0;;;;;:50:::1;::::0;59933:12;;59895:50:::1;:::i;:::-;4897:10:::0;59857:35:::1;::::0;;;:21:::1;:35;::::0;;;;:88;59968:9:::1;::::0;:24:::1;::::0;59980:12;;59968:24:::1;:::i;57743:782::-:0;57806:15;;;;;;;57805:16;57797:59;;;;-1:-1:-1;;;57797:59:0;;28071:2:1;57797:59:0;;;28053:21:1;28110:2;28090:18;;;28083:30;28149:32;28129:18;;;28122:60;28199:18;;57797:59:0;27869:354:1;57797:59:0;4897:10;57875:16;57883:7;57875;:16::i;:::-;-1:-1:-1;;;;;57875:32:0;;:72;;;-1:-1:-1;4897:10:0;57911:20;57923:7;57911:11;:20::i;:::-;-1:-1:-1;;;;;57911:36:0;;57875:72;57867:121;;;;-1:-1:-1;;;57867:121:0;;28430:2:1;57867:121:0;;;28412:21:1;28469:2;28449:18;;;28442:30;28508:34;28488:18;;;28481:62;28579:6;28559:18;;;28552:34;28603:19;;57867:121:0;28228:400:1;57867:121:0;4897:10;58177:26;;;;:12;:26;;;;;;;;:35;58169:76;;;;-1:-1:-1;;;58169:76:0;;28835:2:1;58169:76:0;;;28817:21:1;28874:2;28854:18;;;28847:30;28913;28893:18;;;28886:58;28961:18;;58169:76:0;28633:352:1;58169:76:0;58289:14;;58264:21;:39;;58256:87;;;;-1:-1:-1;;;58256:87:0;;29192:2:1;58256:87:0;;;29174:21:1;29231:2;29211:18;;;29204:30;29270:34;29250:18;;;29243:62;29341:5;29321:18;;;29314:33;29364:19;;58256:87:0;28990:399:1;58256:87:0;58368:48;4897:10;6054:6;;-1:-1:-1;;;;;6054:6:0;58408:7;58368:16;:48::i;:::-;58458:14;;58427:46;;4897:10;;58427:46;;;;;;;;;58458:14;4897:10;58427:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4897:10:0;58484:26;;;;:12;:26;;;;;:33;;-1:-1:-1;;58484:33:0;58513:4;58484:33;;;57743:782::o;63722:124::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63784:8:::1;::::0;;;::::1;;;:16;;63796:4;63784:16;:53;;63822:8;:15:::0;;-1:-1:-1;;63822:15:0::1;::::0;::::1;::::0;;63722:124::o;63784:53::-:1;63803:8;:16:::0;;-1:-1:-1;;63803:16:0::1;::::0;;63814:5:::1;63784:53;63783:55;63722:124::o:0;62856:96::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;62923:9:::1;:21:::0;62856:96::o;41711:98::-;41767:13;41796:7;41789:14;;;;;:::i;43121:274::-;4897:10;-1:-1:-1;;;;;43212:24:0;;;43204:63;;;;-1:-1:-1;;;43204:63:0;;29596:2:1;43204:63:0;;;29578:21:1;29635:2;29615:18;;;29608:30;29674:28;29654:18;;;29647:56;29720:18;;43204:63:0;29394:350:1;43204:63:0;4897:10;43276:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;43276:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;43276:53:0;;;;;;;;;;43341:48;;2724:41:1;;;43276:42:0;;4897:10;43341:48;;2697:18:1;43341:48:0;;;;;;;43121:274;;:::o;44136:319::-;44281:28;44291:4;44297:2;44301:7;44281:9;:28::i;:::-;44332:48;44355:4;44361:2;44365:7;44374:5;44332:22;:48::i;:::-;44316:133;;;;-1:-1:-1;;;44316:133:0;;29951:2:1;44316:133:0;;;29933:21:1;29990:2;29970:18;;;29963:30;30029:34;30009:18;;;30002:62;30100:21;30080:18;;;30073:49;30139:19;;44316:133:0;29749:415:1;63312:122:0;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63393:19:::1;:33:::0;63312:122::o;61183:347::-;61256:13;61290:16;61298:7;61290;:16::i;:::-;61282:50;;;;-1:-1:-1;;;61282:50:0;;30371:2:1;61282:50:0;;;30353:21:1;30410:2;30390:18;;;30383:30;30449:23;30429:18;;;30422:51;30490:18;;61282:50:0;30169:345:1;61282:50:0;61347:8;;;;;;;:17;;61359:5;61347:17;61343:180;;61388:14;61381:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61183:347;;;:::o;61343:180::-;61466:7;61475:18;:7;:16;:18::i;:::-;61495:13;61449:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61435:76;;61183:347;;;:::o;61343:180::-;61183:347;;;:::o;64095:48::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;34238:758:0;34454:27;;;34419:32;34454:27;;;:14;:27;;;;;;:40;;;;34482:11;;34454:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;34521:21;;;;34454:48;;-1:-1:-1;34513:86:0;;;;-1:-1:-1;;;34513:86:0;;31180:2:1;34513:86:0;;;31162:21:1;31219:2;31199:18;;;31192:30;31258:34;31238:18;;;31231:62;31329:8;31309:18;;;31302:36;31355:19;;34513:86:0;30978:402:1;34513:86:0;34637:23;;34618:42;;:90;;;;;34687:9;:21;;;34674:8;;34664:19;;;;;;;:::i;:::-;;;;;;;;:44;34618:90;34610:129;;;;-1:-1:-1;;;34610:129:0;;31863:2:1;34610:129:0;;;31845:21:1;31902:2;31882:18;;;31875:30;31941:28;31921:18;;;31914:56;31987:18;;34610:129:0;31661:350:1;34610:129:0;34813:1;34787:27;;;34825:21;;;:34;34928:60;;;;;:4;;:16;;:60;;34945:11;;34958;;34971:6;;34979:8;;;;34928:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34363:633;34238:758;;;;;:::o;63576:138::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63637:13:::1;::::0;::::1;;::::0;;::::1;;:21;;:13;:21;:68;;63685:13;:20:::0;;-1:-1:-1;;63685:20:0::1;;;::::0;;63722:124::o;63637:68::-:1;63661:13;:21:::0;;-1:-1:-1;;63661:21:0::1;::::0;;63576:138::o;62960:106::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63034:12:::1;:24:::0;62960:106::o;63442:126::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;63500:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;:59;;63542:10;:17:::0;;-1:-1:-1;;63542:17:0::1;63555:4;63542:17;::::0;;63722:124::o;63500:59::-:1;63521:10;:18:::0;;-1:-1:-1;;63521:18:0::1;::::0;;63442:126::o;35004:158::-;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;35108:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;35140:14;;35108:46:::1;:::i;6890:201::-:0;6054:6;;-1:-1:-1;;;;;6054:6:0;4897:10;6201:23;6193:68;;;;-1:-1:-1;;;6193:68:0;;15307:2:1;6193:68:0;;;15289:21:1;;;15326:18;;;15319:30;15385:34;15365:18;;;15358:62;15437:18;;6193:68:0;15105:356:1;6193:68:0;-1:-1:-1;;;;;6979:22:0;::::1;6971:73;;;::::0;-1:-1:-1;;;6971:73:0;;33000:2:1;6971:73:0::1;::::0;::::1;32982:21:1::0;33039:2;33019:18;;;33012:30;33078:34;33058:18;;;33051:62;33149:8;33129:18;;;33122:36;33175:19;;6971:73:0::1;32798:402:1::0;6971:73:0::1;7055:28;7074:8;7055:18;:28::i;8159:387::-:0;8482:20;8530:8;;;8159:387::o;39213:370::-;39340:4;-1:-1:-1;;;;;;39370:40:0;;39385:25;39370:40;;:99;;-1:-1:-1;;;;;;;39421:48:0;;39436:33;39421:48;39370:99;:160;;;-1:-1:-1;;;;;;;39480:50:0;;39495:35;39480:50;39370:160;:207;;;-1:-1:-1;25605:25:0;-1:-1:-1;;;;;;25590:40:0;;;39541:36;25481:157;44694:421;44751:4;44846:17;44855:7;44846:8;:17::i;:::-;44842:266;;;44900:12;;44890:7;:22;44889:69;;;;-1:-1:-1;;44946:11:0;;;44918:20;;;:11;:20;;;;;;:25;-1:-1:-1;;;;;44946:11:0;;;44918:25;;:39;;;44694:421::o;44842:266::-;45046:1;45009:20;;;:11;:20;;;;;:25;-1:-1:-1;;;;;45009:25:0;:39;;;;45008:86;;-1:-1:-1;;45082:11:0;;;45054:20;;;:11;:20;;;;;;:25;-1:-1:-1;;;;;45082:11:0;;;45054:25;;:39;;;44694:421::o;52973:172::-;53070:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;53070:29:0;;;;;;;;;53111:28;;53070:24;;53111:28;;;;;;;52973:172;;;:::o;49694:1320::-;49754:35;49792:20;49804:7;49792:11;:20::i;:::-;49754:58;;49823:13;49839:24;49855:7;49839:15;:24::i;:::-;49823:40;-1:-1:-1;49970:36:0;49987:1;49991:7;50000:5;49970:8;:36::i;:::-;-1:-1:-1;;;;;50052:19:0;;50019:30;50052:19;;;:12;:19;;;;;;;;;50019:52;;;;;;;;;-1:-1:-1;;;;;50019:52:0;;;;;-1:-1:-1;;;50019:52:0;;;;;;;;;;;50104:93;;;;;;;;50130:19;;50019:52;;50104:93;;;50130:23;;50019:52;;50130:23;:::i;:::-;-1:-1:-1;;;;;50104:93:0;;;;;50195:1;50168:11;:24;;;:28;;;;:::i;:::-;-1:-1:-1;;;;;50104:93:0;;;;;;-1:-1:-1;;;;;50082:19:0;;;;;;:12;:19;;;;;;;:115;;;;;;;;;-1:-1:-1;;;50082:115:0;;;;;;;;;;;;50210:12;;;;;;:::i;:::-;;;;-1:-1:-1;;50256:52:0;;;;;;;;50271:11;;-1:-1:-1;;;;;50271:11:0;;;50256:52;;;50291:15;50256:52;;;;;;;;;-1:-1:-1;50233:20:0;;;:11;:20;;;;;;:75;;;;;;;;;-1:-1:-1;;;50233:75:0;-1:-1:-1;;;;;;50233:75:0;;;;;;;;;;;50620:11;50245:7;50271:11;50620;:::i;:::-;50598:33;;50646:21;50655:11;50646:8;:21::i;:::-;:70;;;;-1:-1:-1;50713:1:0;50672:24;;;:11;:24;;;;;:29;-1:-1:-1;;;;;50672:29:0;:43;50646:70;50642:307;;;50737:20;50745:11;50737:7;:20::i;:::-;50733:205;;;50805:117;;;;;;;;50838:18;;-1:-1:-1;;;;;50805:117:0;;;;;;50875:28;;;;50805:117;;;;;;;;;;-1:-1:-1;50778:24:0;;;:11;:24;;;;;;;:144;;;;;;;;;-1:-1:-1;;;50778:144:0;-1:-1:-1;;;;;;50778:144:0;;;;;;;;;;;;50733:205;50970:36;;50998:7;;50994:1;;-1:-1:-1;;;;;50970:36:0;;;;;50994:1;;50970:36;49743:1271;;;;49694:1320;:::o;64168:216::-;64271:14;64287:12;64314:8;64303:37;;;;;;;;;;;;:::i;:::-;64270:70;;;;64351:25;64360:6;64368:7;64351:8;:25::i;:::-;64259:125;;64168:216;;;;:::o;51250:1617::-;51347:35;51385:20;51397:7;51385:11;:20::i;:::-;51456:18;;51347:58;;-1:-1:-1;51414:22:0;;-1:-1:-1;;;;;51440:34:0;4897:10;-1:-1:-1;;;;;51440:34:0;;:81;;;-1:-1:-1;4897:10:0;51485:20;51497:7;51485:11;:20::i;:::-;-1:-1:-1;;;;;51485:36:0;;51440:81;:142;;;-1:-1:-1;51549:18:0;;51532:50;;4897:10;43458:186;:::i;51532:50::-;51414:169;;51608:17;51592:101;;;;-1:-1:-1;;;51592:101:0;;34184:2:1;51592:101:0;;;34166:21:1;34223:2;34203:18;;;34196:30;34262:34;34242:18;;;34235:62;34333:20;34313:18;;;34306:48;34371:19;;51592:101:0;33982:414:1;51592:101:0;51740:4;-1:-1:-1;;;;;51718:26:0;:13;:18;;;-1:-1:-1;;;;;51718:26:0;;51702:98;;;;-1:-1:-1;;;51702:98:0;;34603:2:1;51702:98:0;;;34585:21:1;34642:2;34622:18;;;34615:30;34681:34;34661:18;;;34654:62;34752:8;34732:18;;;34725:36;34778:19;;51702:98:0;34401:402:1;51702:98:0;-1:-1:-1;;;;;51815:16:0;;51807:66;;;;-1:-1:-1;;;51807:66:0;;35010:2:1;51807:66:0;;;34992:21:1;35049:2;35029:18;;;35022:30;35088:34;35068:18;;;35061:62;35159:7;35139:18;;;35132:35;35184:19;;51807:66:0;34808:401:1;51807:66:0;51982:49;51999:1;52003:7;52012:13;:18;;;51982:8;:49::i;:::-;-1:-1:-1;;;;;52040:18:0;;;;;;:12;:18;;;;;:31;;52070:1;;52040:18;:31;;52070:1;;-1:-1:-1;;;;;52040:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;52040:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52078:16:0;;-1:-1:-1;52078:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;52078:16:0;;:29;;-1:-1:-1;;52078:29:0;;:::i;:::-;;;-1:-1:-1;;;;;52078:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52137:43:0;;;;;;;;-1:-1:-1;;;;;52137:43:0;;;;;;52163:15;52137:43;;;;;;;;;-1:-1:-1;52114:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;52114:66:0;-1:-1:-1;;;;;;52114:66:0;;;;;;;;;;;52475:11;52126:7;-1:-1:-1;52475:11:0;:::i;:::-;52453:33;;52497:21;52506:11;52497:8;:21::i;:::-;:70;;;;-1:-1:-1;52564:1:0;52523:24;;;:11;:24;;;;;:29;-1:-1:-1;;;;;52523:29:0;:43;52497:70;52493:279;;;52584:20;52592:11;52584:7;:20::i;:::-;52580:185;;;52648:105;;;;;;;;52677:18;;-1:-1:-1;;;;;52648:105:0;;;;;;52710:28;;;;52648:105;;;;;;;;;;-1:-1:-1;52621:24:0;;;:11;:24;;;;;;;:132;;;;;;;;;-1:-1:-1;;;52621:132:0;-1:-1:-1;;;;;;52621:132:0;;;;;;;;;;;;52580:185;52804:7;52800:2;-1:-1:-1;;;;;52785:27:0;52794:4;-1:-1:-1;;;;;52785:27:0;;;;;;;;;;;52819:42;32449:949;45473:98;45538:27;45548:2;45552:8;45538:27;;;;;;;;;;;;:9;:27::i;45253:212::-;45311:4;45422:10;;45411:7;:21;;45410:48;;;;-1:-1:-1;;45449:8:0;;-1:-1:-1;45438:19:0;;45253:212::o;40307:1018::-;-1:-1:-1;;;;;;;;;;;;;;;;;40424:16:0;40432:7;40424;:16::i;:::-;40416:71;;;;-1:-1:-1;;;40416:71:0;;35674:2:1;40416:71:0;;;35656:21:1;35713:2;35693:18;;;35686:30;35752:34;35732:18;;;35725:62;35823:12;35803:18;;;35796:40;35853:19;;40416:71:0;35472:406:1;40416:71:0;40494:31;40528:20;;;:11;:20;;;;;;;;;40494:54;;;;;;;;;-1:-1:-1;;;;;40494:54:0;;;;-1:-1:-1;;;40494:54:0;;;;;;;;40561:17;40528:20;40561:8;:17::i;:::-;40555:233;;40598:14;;-1:-1:-1;;;;;40598:28:0;;;;;40597:65;;-1:-1:-1;40650:11:0;;40632:14;;-1:-1:-1;;;;;40632:29:0;;;40650:11;;40632:29;;40597:65;40592:188;;;40685:9;40307:1018;-1:-1:-1;;40307:1018:0:o;40592:188::-;40723:57;;-1:-1:-1;;;40723:57:0;;36085:2:1;40723:57:0;;;36067:21:1;36124:2;36104:18;;;36097:30;36163:34;36143:18;;;36136:62;36234:17;36214:18;;;36207:45;36269:19;;40723:57:0;35883:411:1;40592:188:0;40796:26;40844:12;40833:7;:23;40829:93;;40888:22;40898:12;40888:7;:22;:::i;:::-;:26;;40913:1;40888:26;:::i;:::-;40867:47;;40829:93;40955:10;;40934:18;:31;40930:87;;;-1:-1:-1;40999:10:0;;40930:87;41045:7;41025:229;41062:18;41054:4;:26;41025:229;;41111:17;;;;:11;:17;;;;;;;;;41099:29;;;;;;;;;-1:-1:-1;;;;;41099:29:0;;;;;-1:-1:-1;;;41099:29:0;;;;;;;;;;;;;;-1:-1:-1;41142:28:0;;;;41141:65;;-1:-1:-1;41194:11:0;;41176:14;;-1:-1:-1;;;;;41176:29:0;;;41194:11;;41176:29;;41141:65;41137:110;;;-1:-1:-1;41228:9:0;;40307:1018;-1:-1:-1;;;40307:1018:0:o;41137:110::-;41082:6;;;;:::i;:::-;;;;41025:229;;;-1:-1:-1;41262:57:0;;-1:-1:-1;;;41262:57:0;;36085:2:1;41262:57:0;;;36067:21:1;36124:2;36104:18;;;36097:30;36163:34;36143:18;;;36136:62;36234:17;36214:18;;;36207:45;36269:19;;41262:57:0;35883:411:1;7251:191:0;7344:6;;;-1:-1:-1;;;;;7361:17:0;;;;;;;;;;;7394:40;;7344:6;;;7361:17;7344:6;;7394:40;;7325:16;;7394:40;7314:128;7251:191;:::o;53688:690::-;53825:4;-1:-1:-1;;;;;53842:13:0;;8482:20;8530:8;53838:535;;53881:72;;;;;-1:-1:-1;;;;;53881:36:0;;;;;:72;;4897:10;;53932:4;;53938:7;;53947:5;;53881:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53881:72:0;;;;;;;;-1:-1:-1;;53881:72:0;;;;;;;;;;;;:::i;:::-;;;53868:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54112:6;:13;54129:1;54112:18;54108:215;;54145:61;;-1:-1:-1;;;54145:61:0;;29951:2:1;54145:61:0;;;29933:21:1;29990:2;29970:18;;;29963:30;30029:34;30009:18;;;30002:62;30100:21;30080:18;;;30073:49;30139:19;;54145:61:0;29749:415:1;54108:215:0;54291:6;54285:13;54276:6;54272:2;54268:15;54261:38;53868:464;-1:-1:-1;;;;;;54003:55:0;54013:45;54003:55;;-1:-1:-1;53996:62:0;;53838:535;-1:-1:-1;54361:4:0;53838:535;53688:690;;;;;;:::o;2489:723::-;2545:13;2766:5;2775:1;2766:10;2762:53;;-1:-1:-1;;2793:10:0;;;;;;;;;;;;;;;;;;2489:723::o;2762:53::-;2840:5;2825:12;2881:78;2888:9;;2881:78;;2914:8;;;;:::i;:::-;;-1:-1:-1;2937:10:0;;-1:-1:-1;2945:2:0;2937:10;;:::i;:::-;;;2881:78;;;2969:19;3001:6;2991:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2991:17:0;;2969:39;;3019:154;3026:10;;3019:154;;3053:11;3063:1;3053:11;;:::i;:::-;;-1:-1:-1;3122:10:0;3130:2;3122:5;:10;:::i;:::-;3109:24;;:2;:24;:::i;:::-;3096:39;;3079:6;3086;3079:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3150:11:0;3159:2;3150:11;;:::i;:::-;;;3019:154;;47683:108;47758:25;47767:2;47771:7;47758:25;;;;;;;;;;;;:8;:25::i;45910:1375::-;46015:20;46038:12;-1:-1:-1;;;;;46065:16:0;;46057:62;;;;-1:-1:-1;;;46057:62:0;;37389:2:1;46057:62:0;;;37371:21:1;37428:2;37408:18;;;37401:30;37467:34;37447:18;;;37440:62;-1:-1:-1;;;37518:18:1;;;37511:31;37559:19;;46057:62:0;37187:397:1;46057:62:0;46140:11;;-1:-1:-1;;;;;46140:11:0;;;46134:17;;;;46126:63;;;;-1:-1:-1;;;46126:63:0;;37791:2:1;46126:63:0;;;37773:21:1;37830:2;37810:18;;;37803:30;37869:34;37849:18;;;37842:62;-1:-1:-1;;;37920:18:1;;;37913:31;37961:19;;46126:63:0;37589:397:1;46126:63:0;46330:21;46338:12;46330:7;:21::i;:::-;46329:22;46321:64;;;;-1:-1:-1;;;46321:64:0;;38193:2:1;46321:64:0;;;38175:21:1;38232:2;38212:18;;;38205:30;38271:31;38251:18;;;38244:59;38320:18;;46321:64:0;37991:353:1;46321:64:0;46412:12;46400:8;:24;;46392:71;;;;-1:-1:-1;;;46392:71:0;;38551:2:1;46392:71:0;;;38533:21:1;38590:2;38570:18;;;38563:30;38629:34;38609:18;;;38602:62;38700:4;38680:18;;;38673:32;38722:19;;46392:71:0;38349:398:1;46392:71:0;-1:-1:-1;;;;;46575:16:0;;46542:30;46575:16;;;:12;:16;;;;;;;;;46542:49;;;;;;;;;-1:-1:-1;;;;;46542:49:0;;;;;-1:-1:-1;;;46542:49:0;;;;;;;;;;;46617:119;;;;;;;;46637:19;;46542:49;;46617:119;;;46637:39;;46667:8;;46637:39;:::i;:::-;-1:-1:-1;;;;;46617:119:0;;;;;46720:8;46685:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;46617:119:0;;;;;;-1:-1:-1;;;;;46598:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;46598:138:0;;;;;;;;;;;;46775:43;;;;;;;;;;;46801:15;46775:43;;;;;;;;46747:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;46747:71:0;-1:-1:-1;;;;;;46747:71:0;;;;;;;;;;;;;;;;;;46759:12;;46871:304;46895:8;46891:1;:12;46871:304;;;46924:38;;46949:12;;-1:-1:-1;;;;;46924:38:0;;;46941:1;;46924:38;;46941:1;;46924:38;46989:59;47020:1;47024:2;47028:12;47042:5;46989:22;:59::i;:::-;46971:150;;;;-1:-1:-1;;;46971:150:0;;38954:2:1;46971:150:0;;;38936:21:1;38993:2;38973:18;;;38966:30;39032:34;39012:18;;;39005:62;39103:21;39083:18;;;39076:49;39142:19;;46971:150:0;38752:415:1;46971:150:0;47132:14;;;;:::i;:::-;47155:10;:12;;47132:14;;-1:-1:-1;47155:12:0;;-1:-1:-1;47155:10:0;:12;;;:::i;:::-;;;;;;46905:3;;;;;:::i;:::-;;;;46871:304;;;-1:-1:-1;47183:12:0;:27;;;47219:60;32449:949;48018:327;48147:25;48160:2;48164:7;48147:12;:25::i;:::-;48205:54;48236:1;48240:2;48244:7;48253:5;48205:22;:54::i;:::-;48183:154;;;;-1:-1:-1;;;48183:154:0;;39374:2:1;48183:154:0;;;39356:21:1;39413:2;39393:18;;;39386:30;39452:34;39432:18;;;39425:62;39523:20;39503:18;;;39496:48;39561:19;;48183:154:0;39172:414:1;48677:714:0;-1:-1:-1;;;;;48764:16:0;;48756:61;;;;-1:-1:-1;;;48756:61:0;;39793:2:1;48756:61:0;;;39775:21:1;;;39812:18;;;39805:30;39871:34;39851:18;;;39844:62;39923:18;;48756:61:0;39591:356:1;48756:61:0;48842:11;;-1:-1:-1;;;;;48842:11:0;;;48836:17;;;;48828:63;;;;-1:-1:-1;;;48828:63:0;;37791:2:1;48828:63:0;;;37773:21:1;37830:2;37810:18;;;37803:30;37869:34;37849:18;;;37842:62;-1:-1:-1;;;37920:18:1;;;37913:31;37961:19;;48828:63:0;37589:397:1;48828:63:0;48969:10;:12;;;:10;:12;;;:::i;:::-;;;;;;49009:10;;48999:7;:20;48996:71;;;49035:10;:20;;;48996:71;-1:-1:-1;;;;;49114:16:0;;49081:30;49114:16;;;:12;:16;;;;;;;;;49081:49;;;;;;;;;-1:-1:-1;;;;;49081:49:0;;;;;-1:-1:-1;;;49081:49:0;;;;;;;;;;;49160:93;;;;;;;;49186:19;;49081:49;;49160:93;;;49186:23;;49081:49;49186:23;:::i;:::-;-1:-1:-1;;;;;49160:93:0;;;;;49224:11;:24;;;49251:1;49224:28;;;;:::i;:::-;-1:-1:-1;;;;;49160:93:0;;;;;;-1:-1:-1;;;;;49141:16:0;;;;;;;:12;:16;;;;;;;;:112;;;;;;;;-1:-1:-1;;;49141:112:0;;;;;;;;;;;;49289:43;;;;;;;;;;;49315:15;49289:43;;;;;;;;49266:20;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;49266:66:0;-1:-1:-1;;;;;;49266:66:0;;;;;;;;;;;;;;;;49350:33;;49278:7;;49141:16;;49350:33;;49141:16;;49350:33;48745:646;48677:714;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;178:184;-1:-1:-1;;;227:1:1;220:88;327:4;324:1;317:15;351:4;348:1;341:15;367:690;431:5;461:18;502:2;494:6;491:14;488:40;;;508:18;;:::i;:::-;642:2;636:9;708:2;696:15;;-1:-1:-1;;692:24:1;;;718:2;688:33;684:42;672:55;;;742:18;;;762:22;;;739:46;736:72;;;788:18;;:::i;:::-;828:10;824:2;817:22;857:6;848:15;;887:6;879;872:22;927:3;918:6;913:3;909:16;906:25;903:45;;;944:1;941;934:12;903:45;994:6;989:3;982:4;974:6;970:17;957:44;1049:1;1042:4;1033:6;1025;1021:19;1017:30;1010:41;;;;367:690;;;;;:::o;1062:220::-;1104:5;1157:3;1150:4;1142:6;1138:17;1134:27;1124:55;;1175:1;1172;1165:12;1124:55;1197:79;1272:3;1263:6;1250:20;1243:4;1235:6;1231:17;1197:79;:::i;:::-;1188:88;1062:220;-1:-1:-1;;;1062:220:1:o;1287:171::-;1354:20;;1414:18;1403:30;;1393:41;;1383:69;;1448:1;1445;1438:12;1463:684;1565:6;1573;1581;1589;1642:3;1630:9;1621:7;1617:23;1613:33;1610:53;;;1659:1;1656;1649:12;1610:53;1682:28;1700:9;1682:28;:::i;:::-;1672:38;;1761:2;1750:9;1746:18;1733:32;1784:18;1825:2;1817:6;1814:14;1811:34;;;1841:1;1838;1831:12;1811:34;1864:49;1905:7;1896:6;1885:9;1881:22;1864:49;:::i;:::-;1854:59;;1932:37;1965:2;1954:9;1950:18;1932:37;:::i;:::-;1922:47;;2022:2;2011:9;2007:18;1994:32;1978:48;;2051:2;2041:8;2038:16;2035:36;;;2067:1;2064;2057:12;2035:36;;2090:51;2133:7;2122:8;2111:9;2107:24;2090:51;:::i;:::-;2080:61;;;1463:684;;;;;;;:::o;2152:177::-;-1:-1:-1;;;;;;2230:5:1;2226:78;2219:5;2216:89;2206:117;;2319:1;2316;2309:12;2334:245;2392:6;2445:2;2433:9;2424:7;2420:23;2416:32;2413:52;;;2461:1;2458;2451:12;2413:52;2500:9;2487:23;2519:30;2543:5;2519:30;:::i;2776:180::-;2835:6;2888:2;2876:9;2867:7;2863:23;2859:32;2856:52;;;2904:1;2901;2894:12;2856:52;-1:-1:-1;2927:23:1;;2776:180;-1:-1:-1;2776:180:1:o;2961:258::-;3033:1;3043:113;3057:6;3054:1;3051:13;3043:113;;;3133:11;;;3127:18;3114:11;;;3107:39;3079:2;3072:10;3043:113;;;3174:6;3171:1;3168:13;3165:48;;;-1:-1:-1;;3209:1:1;3191:16;;3184:27;2961:258::o;3224:317::-;3266:3;3304:5;3298:12;3331:6;3326:3;3319:19;3347:63;3403:6;3396:4;3391:3;3387:14;3380:4;3373:5;3369:16;3347:63;:::i;:::-;3455:2;3443:15;-1:-1:-1;;3439:88:1;3430:98;;;;3530:4;3426:109;;3224:317;-1:-1:-1;;3224:317:1:o;3546:220::-;3695:2;3684:9;3677:21;3658:4;3715:45;3756:2;3745:9;3741:18;3733:6;3715:45;:::i;4134:154::-;-1:-1:-1;;;;;4213:5:1;4209:54;4202:5;4199:65;4189:93;;4278:1;4275;4268:12;4293:315;4361:6;4369;4422:2;4410:9;4401:7;4397:23;4393:32;4390:52;;;4438:1;4435;4428:12;4390:52;4477:9;4464:23;4496:31;4521:5;4496:31;:::i;:::-;4546:5;4598:2;4583:18;;;;4570:32;;-1:-1:-1;;;4293:315:1:o;4613:252::-;4680:6;4688;4741:2;4729:9;4720:7;4716:23;4712:32;4709:52;;;4757:1;4754;4747:12;4709:52;4780:28;4798:9;4780:28;:::i;5052:456::-;5129:6;5137;5145;5198:2;5186:9;5177:7;5173:23;5169:32;5166:52;;;5214:1;5211;5204:12;5166:52;5253:9;5240:23;5272:31;5297:5;5272:31;:::i;:::-;5322:5;-1:-1:-1;5379:2:1;5364:18;;5351:32;5392:33;5351:32;5392:33;:::i;:::-;5052:456;;5444:7;;-1:-1:-1;;;5498:2:1;5483:18;;;;5470:32;;5052:456::o;5513:248::-;5581:6;5589;5642:2;5630:9;5621:7;5617:23;5613:32;5610:52;;;5658:1;5655;5648:12;5610:52;-1:-1:-1;;5681:23:1;;;5751:2;5736:18;;;5723:32;;-1:-1:-1;5513:248:1:o;6068:632::-;6239:2;6291:21;;;6361:13;;6264:18;;;6383:22;;;6210:4;;6239:2;6462:15;;;;6436:2;6421:18;;;6210:4;6505:169;6519:6;6516:1;6513:13;6505:169;;;6580:13;;6568:26;;6649:15;;;;6614:12;;;;6541:1;6534:9;6505:169;;;-1:-1:-1;6691:3:1;;6068:632;-1:-1:-1;;;;;;6068:632:1:o;6705:450::-;6774:6;6827:2;6815:9;6806:7;6802:23;6798:32;6795:52;;;6843:1;6840;6833:12;6795:52;6883:9;6870:23;6916:18;6908:6;6905:30;6902:50;;;6948:1;6945;6938:12;6902:50;6971:22;;7024:4;7016:13;;7012:27;-1:-1:-1;7002:55:1;;7053:1;7050;7043:12;7002:55;7076:73;7141:7;7136:2;7123:16;7118:2;7114;7110:11;7076:73;:::i;7345:615::-;7431:6;7439;7492:2;7480:9;7471:7;7467:23;7463:32;7460:52;;;7508:1;7505;7498:12;7460:52;7548:9;7535:23;7577:18;7618:2;7610:6;7607:14;7604:34;;;7634:1;7631;7624:12;7604:34;7672:6;7661:9;7657:22;7647:32;;7717:7;7710:4;7706:2;7702:13;7698:27;7688:55;;7739:1;7736;7729:12;7688:55;7779:2;7766:16;7805:2;7797:6;7794:14;7791:34;;;7821:1;7818;7811:12;7791:34;7874:7;7869:2;7859:6;7856:1;7852:14;7848:2;7844:23;7840:32;7837:45;7834:65;;;7895:1;7892;7885:12;7834:65;7926:2;7918:11;;;;;7948:6;;-1:-1:-1;7345:615:1;;-1:-1:-1;;;;7345:615:1:o;7965:247::-;8024:6;8077:2;8065:9;8056:7;8052:23;8048:32;8045:52;;;8093:1;8090;8083:12;8045:52;8132:9;8119:23;8151:31;8176:5;8151:31;:::i;8217:184::-;8275:6;8328:2;8316:9;8307:7;8303:23;8299:32;8296:52;;;8344:1;8341;8334:12;8296:52;8367:28;8385:9;8367:28;:::i;8629:460::-;8714:6;8722;8730;8783:2;8771:9;8762:7;8758:23;8754:32;8751:52;;;8799:1;8796;8789:12;8751:52;8822:28;8840:9;8822:28;:::i;:::-;8812:38;;8901:2;8890:9;8886:18;8873:32;8928:18;8920:6;8917:30;8914:50;;;8960:1;8957;8950:12;8914:50;8983:49;9024:7;9015:6;9004:9;9000:22;8983:49;:::i;:::-;8973:59;;;9079:2;9068:9;9064:18;9051:32;9041:42;;8629:460;;;;;:::o;9347:416::-;9412:6;9420;9473:2;9461:9;9452:7;9448:23;9444:32;9441:52;;;9489:1;9486;9479:12;9441:52;9528:9;9515:23;9547:31;9572:5;9547:31;:::i;:::-;9597:5;-1:-1:-1;9654:2:1;9639:18;;9626:32;9696:15;;9689:23;9677:36;;9667:64;;9727:1;9724;9717:12;9667:64;9750:7;9740:17;;;9347:416;;;;;:::o;9768:665::-;9863:6;9871;9879;9887;9940:3;9928:9;9919:7;9915:23;9911:33;9908:53;;;9957:1;9954;9947:12;9908:53;9996:9;9983:23;10015:31;10040:5;10015:31;:::i;:::-;10065:5;-1:-1:-1;10122:2:1;10107:18;;10094:32;10135:33;10094:32;10135:33;:::i;:::-;10187:7;-1:-1:-1;10241:2:1;10226:18;;10213:32;;-1:-1:-1;10296:2:1;10281:18;;10268:32;10323:18;10312:30;;10309:50;;;10355:1;10352;10345:12;10309:50;10378:49;10419:7;10410:6;10399:9;10395:22;10378:49;:::i;10438:347::-;10489:8;10499:6;10553:3;10546:4;10538:6;10534:17;10530:27;10520:55;;10571:1;10568;10561:12;10520:55;-1:-1:-1;10594:20:1;;10637:18;10626:30;;10623:50;;;10669:1;10666;10659:12;10623:50;10706:4;10698:6;10694:17;10682:29;;10758:3;10751:4;10742:6;10734;10730:19;10726:30;10723:39;10720:59;;;10775:1;10772;10765:12;10720:59;10438:347;;;;;:::o;10790:773::-;10894:6;10902;10910;10918;10926;10979:3;10967:9;10958:7;10954:23;10950:33;10947:53;;;10996:1;10993;10986:12;10947:53;11019:28;11037:9;11019:28;:::i;:::-;11009:38;;11098:2;11087:9;11083:18;11070:32;11121:18;11162:2;11154:6;11151:14;11148:34;;;11178:1;11175;11168:12;11148:34;11201:49;11242:7;11233:6;11222:9;11218:22;11201:49;:::i;:::-;11191:59;;11269:37;11302:2;11291:9;11287:18;11269:37;:::i;:::-;11259:47;;11359:2;11348:9;11344:18;11331:32;11315:48;;11388:2;11378:8;11375:16;11372:36;;;11404:1;11401;11394:12;11372:36;;11443:60;11495:7;11484:8;11473:9;11469:24;11443:60;:::i;:::-;10790:773;;;;-1:-1:-1;10790:773:1;;-1:-1:-1;11522:8:1;;11417:86;10790:773;-1:-1:-1;;;10790:773:1:o;11568:388::-;11636:6;11644;11697:2;11685:9;11676:7;11672:23;11668:32;11665:52;;;11713:1;11710;11703:12;11665:52;11752:9;11739:23;11771:31;11796:5;11771:31;:::i;:::-;11821:5;-1:-1:-1;11878:2:1;11863:18;;11850:32;11891:33;11850:32;11891:33;:::i;11961:481::-;12039:6;12047;12055;12108:2;12096:9;12087:7;12083:23;12079:32;12076:52;;;12124:1;12121;12114:12;12076:52;12147:28;12165:9;12147:28;:::i;:::-;12137:38;;12226:2;12215:9;12211:18;12198:32;12253:18;12245:6;12242:30;12239:50;;;12285:1;12282;12275:12;12239:50;12324:58;12374:7;12365:6;12354:9;12350:22;12324:58;:::i;:::-;11961:481;;12401:8;;-1:-1:-1;12298:84:1;;-1:-1:-1;;;;11961:481:1:o;12447:437::-;12526:1;12522:12;;;;12569;;;12590:61;;12644:4;12636:6;12632:17;12622:27;;12590:61;12697:2;12689:6;12686:14;12666:18;12663:38;12660:218;;-1:-1:-1;;;12731:1:1;12724:88;12835:4;12832:1;12825:15;12863:4;12860:1;12853:15;12889:750;12938:3;12979:5;12973:12;13008:36;13034:9;13008:36;:::i;:::-;13063:1;13080:18;;;13107:162;;;;13283:1;13278:355;;;;13073:560;;13107:162;-1:-1:-1;;13144:9:1;13140:82;13135:3;13128:95;13252:6;13247:3;13243:16;13236:23;;13107:162;;13278:355;13309:5;13306:1;13299:16;13338:4;13383:2;13380:1;13370:16;13408:1;13422:165;13436:6;13433:1;13430:13;13422:165;;;13514:14;;13501:11;;;13494:35;13557:16;;;;13451:10;;13422:165;;;13426:3;;;13616:6;13611:3;13607:16;13600:23;;13073:560;;;;;12889:750;;;;:::o;13644:194::-;13770:3;13795:37;13828:3;13820:6;13795:37;:::i;14264:557::-;14521:6;14513;14509:19;14498:9;14491:38;14565:3;14560:2;14549:9;14545:18;14538:31;14472:4;14592:46;14633:3;14622:9;14618:19;14610:6;14592:46;:::i;:::-;14686:18;14678:6;14674:31;14669:2;14658:9;14654:18;14647:59;14754:9;14746:6;14742:22;14737:2;14726:9;14722:18;14715:50;14782:33;14808:6;14800;14782:33;:::i;:::-;14774:41;14264:557;-1:-1:-1;;;;;;;14264:557:1:o;14826:274::-;14955:3;14993:6;14987:13;15009:53;15055:6;15050:3;15043:4;15035:6;15031:17;15009:53;:::i;:::-;15078:16;;;;;14826:274;-1:-1:-1;;14826:274:1:o;17813:665::-;18094:6;18086;18082:19;18071:9;18064:38;-1:-1:-1;;;;;18142:6:1;18138:55;18133:2;18122:9;18118:18;18111:83;18230:3;18225:2;18214:9;18210:18;18203:31;18045:4;18257:46;18298:3;18287:9;18283:19;18275:6;18257:46;:::i;:::-;18353:6;18346:14;18339:22;18334:2;18323:9;18319:18;18312:50;18411:9;18403:6;18399:22;18393:3;18382:9;18378:19;18371:51;18439:33;18465:6;18457;18439:33;:::i;:::-;18431:41;17813:665;-1:-1:-1;;;;;;;;17813:665:1:o;18483:245::-;18562:6;18570;18623:2;18611:9;18602:7;18598:23;18594:32;18591:52;;;18639:1;18636;18629:12;18591:52;-1:-1:-1;;18662:16:1;;18718:2;18703:18;;;18697:25;18662:16;;18697:25;;-1:-1:-1;18483:245:1:o;19144:1542::-;19490:6;19482;19478:19;19467:9;19460:38;19441:4;19517:2;19555:3;19550:2;19539:9;19535:18;19528:31;19579:1;19612:6;19606:13;19642:36;19668:9;19642:36;:::i;:::-;19715:6;19709:3;19698:9;19694:19;19687:35;19741:3;19763:1;19795:2;19784:9;19780:18;19812:1;19807:180;;;;20001:1;19996:354;;;;19773:577;;19807:180;-1:-1:-1;;19859:9:1;19855:82;19850:2;19839:9;19835:18;19828:110;19973:3;19962:9;19958:19;19951:26;;19807:180;;19996:354;20027:6;20024:1;20017:17;20075:2;20072:1;20062:16;20100:1;20114:180;20128:6;20125:1;20122:13;20114:180;;;20221:14;;20197:17;;;20193:26;;20186:50;20264:16;;;;20143:10;;20114:180;;;20318:17;;20314:26;;;-1:-1:-1;;19773:577:1;;;;;;20395:9;20390:3;20386:19;20381:2;20370:9;20366:18;20359:47;20429:30;20455:3;20447:6;20429:30;:::i;:::-;20415:44;;;20468:46;20510:2;20499:9;20495:18;20487:6;-1:-1:-1;;;;;3837:54:1;3825:67;;3771:127;20468:46;-1:-1:-1;;;;;3837:54:1;;20565:3;20550:19;;3825:67;20619:9;20611:6;20607:22;20601:3;20590:9;20586:19;20579:51;20647:33;20673:6;20665;20647:33;:::i;:::-;20639:41;19144:1542;-1:-1:-1;;;;;;;;;19144:1542:1:o;21103:184::-;-1:-1:-1;;;21152:1:1;21145:88;21252:4;21249:1;21242:15;21276:4;21273:1;21266:15;21292:228;21332:7;21458:1;-1:-1:-1;;21386:74:1;21383:1;21380:81;21375:1;21368:9;21361:17;21357:105;21354:131;;;21465:18;;:::i;:::-;-1:-1:-1;21505:9:1;;21292:228::o;21525:184::-;-1:-1:-1;;;21574:1:1;21567:88;21674:4;21671:1;21664:15;21698:4;21695:1;21688:15;21714:120;21754:1;21780;21770:35;;21785:18;;:::i;:::-;-1:-1:-1;21819:9:1;;21714:120::o;22241:125::-;22281:4;22309:1;22306;22303:8;22300:34;;;22314:18;;:::i;:::-;-1:-1:-1;22351:9:1;;22241:125::o;22371:128::-;22411:3;22442:1;22438:6;22435:1;22432:13;22429:39;;;22448:18;;:::i;:::-;-1:-1:-1;22484:9:1;;22371:128::o;23608:195::-;23647:3;-1:-1:-1;;23671:5:1;23668:77;23665:103;;23748:18;;:::i;:::-;-1:-1:-1;23795:1:1;23784:13;;23608:195::o;25746:184::-;-1:-1:-1;;;25795:1:1;25788:88;25895:4;25892:1;25885:15;25919:4;25916:1;25909:15;30519:454;30740:3;30768:37;30801:3;30793:6;30768:37;:::i;:::-;30834:6;30828:13;30850:52;30895:6;30891:2;30884:4;30876:6;30872:17;30850:52;:::i;:::-;30918:49;30959:6;30955:2;30951:15;30943:6;30918:49;:::i;31385:271::-;31568:6;31560;31555:3;31542:33;31524:3;31594:16;;31619:13;;;31594:16;31385:271;-1:-1:-1;31385:271:1:o;32016:777::-;32283:6;32275;32271:19;32260:9;32253:38;32327:3;32322:2;32311:9;32307:18;32300:31;32234:4;32354:46;32395:3;32384:9;32380:19;32372:6;32354:46;:::i;:::-;32448:18;32440:6;32436:31;32431:2;32420:9;32416:18;32409:59;32516:9;32508:6;32504:22;32499:2;32488:9;32484:18;32477:50;32551:6;32543;32536:22;32605:6;32597;32592:2;32584:6;32580:15;32567:45;32658:1;32653:2;32644:6;32636;32632:19;32628:28;32621:39;32784:2;-1:-1:-1;;32709:2:1;32701:6;32697:15;32693:88;32685:6;32681:101;32677:110;32669:118;;;32016:777;;;;;;;;:::o;33205:246::-;33245:4;-1:-1:-1;;;;;33358:10:1;;;;33328;;33380:12;;;33377:38;;;33395:18;;:::i;:::-;33432:13;;33205:246;-1:-1:-1;;;33205:246:1:o;33456:196::-;33495:3;33523:5;33513:39;;33532:18;;:::i;:::-;-1:-1:-1;;;33568:78:1;;33456:196::o;33657:320::-;33744:6;33752;33805:2;33793:9;33784:7;33780:23;33776:32;33773:52;;;33821:1;33818;33811:12;33773:52;33853:9;33847:16;33872:31;33897:5;33872:31;:::i;:::-;33967:2;33952:18;;;;33946:25;33922:5;;33946:25;;-1:-1:-1;;;33657:320:1:o;35214:253::-;35254:3;-1:-1:-1;;;;;35343:2:1;35340:1;35336:10;35373:2;35370:1;35366:10;35404:3;35400:2;35396:12;35391:3;35388:21;35385:47;;;35412:18;;:::i;:::-;35448:13;;35214:253;-1:-1:-1;;;;35214:253:1:o;36299:512::-;36493:4;-1:-1:-1;;;;;36603:2:1;36595:6;36591:15;36580:9;36573:34;36655:2;36647:6;36643:15;36638:2;36627:9;36623:18;36616:43;;36695:6;36690:2;36679:9;36675:18;36668:34;36738:3;36733:2;36722:9;36718:18;36711:31;36759:46;36800:3;36789:9;36785:19;36777:6;36759:46;:::i;:::-;36751:54;36299:512;-1:-1:-1;;;;;;36299:512:1:o;36816:249::-;36885:6;36938:2;36926:9;36917:7;36913:23;36909:32;36906:52;;;36954:1;36951;36944:12;36906:52;36986:9;36980:16;37005:30;37029:5;37005:30;:::i;37070:112::-;37102:1;37128;37118:35;;37133:18;;:::i;:::-;-1:-1:-1;37167:9:1;;37070:112::o

Swarm Source

ipfs://4f337896c178c3128578787473f82440fe723a079e78bc4a48141383f9283004
Loading