ETH Price: $2,659.32 (+1.50%)

Token

WeArePiplWorld Land (WeAreLand)
 

Overview

Max Total Supply

1,219 WeAreLand

Holders

276

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x5bfc2418c1d4e70b30a1b065f69512d732709f10
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
WeAreLand

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-01
*/

// File: contracts/CalScore.sol


pragma solidity ^0.8.9;

contract CalScore{

    function calculate(uint256 _totalScore, uint256 _randomNumber) internal view virtual returns (uint256) {
        
        if (_totalScore >= 1000000){
                return 5;
        }  
        if (_totalScore < 66306){
            if (_randomNumber <= 3){
                return 5;
            }
            if (_randomNumber >= 4 && _randomNumber <= 10 ){
                return 4;
            }
            if (_randomNumber >= 11 && _randomNumber <= 20 ){
                return 3;
            }
            if (_randomNumber >= 21 && _randomNumber <= 40 ){
                return 2;
            }
            if (_randomNumber >= 41 && _randomNumber <= 100){
                return 1;
            }
        }
        if (_totalScore >= 66306 && _totalScore <=81632){
            if (_randomNumber <= 5){
                return 5;
            }
            if (_randomNumber >= 6 && _randomNumber <= 15 ){
                return 4;
            }
            if (_randomNumber >= 16 && _randomNumber <= 25 ){
                return 3;
            }
            if (_randomNumber >= 26 && _randomNumber <= 35 ){
                return 2;
            }
            if (_randomNumber >= 36 && _randomNumber <= 100){
                return 1;
            }
        }
        if (_totalScore >= 81633 && _totalScore <=103148){
            if (_randomNumber <= 10){
                return 5;
            }
            if (_randomNumber >= 11 && _randomNumber <= 40 ){
                return 4;
            }
            if (_randomNumber >= 41 && _randomNumber <= 100 ){
                return 3;
            }
        }
        if (_totalScore >= 103148 ){
            if (_randomNumber <= 15){
                return 5;
            }
            if (_randomNumber >= 16 && _randomNumber <= 100 ){
                return 4;
            }
        }
           
    }
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: contracts/VerifySign.sol


pragma solidity ^0.8.9;

contract VerifySign{

    struct EIP712Domain {
        string  name;
        string  version;
        uint256 chainId;
        address verifyingContract;
    }

    struct Tokens {
        uint256 tokenId1;
        uint256 tokenId2;
        uint256 tokenId3;
        uint256 tokenId4;
        uint256 totalScore;
    }

    bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
    );

    bytes32 constant ID_TYPEHASH = keccak256(
        "Tokens(uint256 tokenId1,uint256 tokenId2,uint256 tokenId3,uint256 tokenId4,uint256 totalScore)"
    );

    bytes32 DOMAIN_SEPARATOR;

    constructor () {
        DOMAIN_SEPARATOR = hash(EIP712Domain({
            name: "Land",
            version: '1',
            chainId: 1,
            verifyingContract: address(this)
        }));
    }

    function hash(EIP712Domain memory eip712Domain) internal pure returns (bytes32) {
        return keccak256(abi.encode(
            EIP712DOMAIN_TYPEHASH,
            keccak256(bytes(eip712Domain.name)),
            keccak256(bytes(eip712Domain.version)),
            eip712Domain.chainId,
            eip712Domain.verifyingContract
        ));
    }

    function hash(Tokens memory tokens) internal pure returns (bytes32) {
        return keccak256(abi.encode(
            ID_TYPEHASH,
            tokens.tokenId1,
            tokens.tokenId2,
            tokens.tokenId3,
            tokens.tokenId4,
            tokens.totalScore
        ));
    }

    function verifySig(uint256[] memory tokenId, uint256 _toalScore, uint8 v, bytes32 r, bytes32 s) internal view virtual returns (address) {

        Tokens memory t;
        t.tokenId1 = tokenId[0];
        t.tokenId2 = tokenId[1];
        t.tokenId3 = tokenId[2];
        t.tokenId4 = tokenId[3];
        t.totalScore = _toalScore;
        
        bytes32 digest = keccak256(abi.encodePacked(
            "\x19\x01",
            DOMAIN_SEPARATOR,
            hash(t)
        ));
        return ecrecover(digest, v, r, s) ;
    }


}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/AbstractERC1155Factory.sol



pragma solidity ^0.8.9;





abstract contract AbstractERC1155Factory is Pausable, ERC1155Supply, ERC1155Burnable, Ownable {

    string name_ = "WeArePiplWorld Land";
    string symbol_ = "WeAreLand";

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

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

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

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 virtual 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);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // 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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/WeAre.sol



pragma solidity >=0.8.9 <0.9.0;





contract WeAre is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;

  bytes32 public merkleRoot;
  mapping(address => bool) public whitelistAddressClaimed;
  mapping(address => bool) public addressClaimed;

  string public contractURi = "https://gateway.pinata.cloud/ipfs/QmQLTacNdjPWeCKZknda58J7PFfF45ejKnhbv1wCFTB2nG";
  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri = "ipfs://QmVJB8B1aSgHoC3Fuerg5eiTrSAN8VJRfwpwLj2tqaBCJJ";
  
  uint256 public cost = 0 ether;
  uint256 public maxSupply = 5000;
  uint256 public maxMintAmountPerTx = 1;

  bool public paused = true;
  bool public whitelistMintEnabled = false;
  bool public revealed = false;

  event minted(address indexed _from, uint256 indexed _amount);
  event whitelist(bool _state);
  event pause(bool _state);

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol
  ) ERC721A(_tokenName, _tokenSymbol) {
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
    _;
  }

  function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount){
    require(whitelistMintEnabled, 'The whitelist sale is not enabled!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    require(!whitelistAddressClaimed[_msgSender()], 'Address already claimed!');
    
    // Verify whitelist requirements
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'You are not in Whitelist!');

    whitelistAddressClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
    emit minted(msg.sender, _mintAmount);
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount){
    require(!paused, 'The contract is paused!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    require(!addressClaimed[_msgSender()], 'Address already claimed!');

    addressClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
    emit minted(msg.sender, _mintAmount);
  }
  
  // For marketing etc.
  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(_mintAmount > 0 , 'Invalid mint amount!');
    _safeMint(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned) {
        if (ownership.addr != address(0)) {
          latestOwnerAddress = ownership.addr;
        }

        if (latestOwnerAddress == _owner) {
          ownedTokenIds[ownedTokenIndex] = currentTokenId;

          ownedTokenIndex++;
        }
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function burn(uint256 tokenId) public {
    _burn(tokenId, true);
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function contractURI() public view returns (string memory) {
        return contractURi;
    }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setContractURI(string memory _newContractURI) public onlyOwner {
    contractURi = _newContractURI;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
    emit pause(_state);
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setWhitelistMintEnabled(bool _state) public onlyOwner {
    whitelistMintEnabled = _state;
    emit whitelist(_state);
  }

  function withdraw() public onlyOwner nonReentrant {
    
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
    
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }
}
// File: contracts/PIPL.sol



pragma solidity >=0.8.9 <0.9.0;





contract PIPL is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;

  bytes32 public merkleRoot;
  mapping(address => bool) public addressClaimed;

  string public contractURi = "https://gateway.pinata.cloud/ipfs/QmdfvkTCpxNqBuLeps3L7W3TZXT4FXfopoAT8kqMbuWb5W";
  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri = "ipfs://QmdpiCYNpgdeTLZVMq8uwmPmzB6eLvhTmhp5KDA61LbxYb";
  
  uint256 public cost = 0 ether;
  uint256 public maxSupply = 10000;
  uint256 public maxMintAmountPerTx = 2;

  bool public paused = true;
  bool public whitelistMintEnabled = false;
  bool public revealed = false;

  event minted(address indexed _from, uint256 indexed _amount);
  event whitelist(bool _state);
  event pause(bool _state);

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol
  ) ERC721A(_tokenName, _tokenSymbol) {
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
    _;
  }

  function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    // Verify whitelist requirements
    require(whitelistMintEnabled, 'The whitelist sale is not enabled!');
    require(!addressClaimed[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'You are not in Whitelist!');

    addressClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
    emit minted(msg.sender, _mintAmount);
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    require(!paused, 'The contract is paused!');
    require(!addressClaimed[_msgSender()], 'Address already claimed!');

    addressClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
    emit minted(msg.sender, _mintAmount);
  }
  
  // For marketing etc.
  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(_mintAmount > 0 , 'Invalid mint amount!');
    _safeMint(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned) {
        if (ownership.addr != address(0)) {
          latestOwnerAddress = ownership.addr;
        }

        if (latestOwnerAddress == _owner) {
          ownedTokenIds[ownedTokenIndex] = currentTokenId;

          ownedTokenIndex++;
        }
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function contractURI() public view returns (string memory) {
        return contractURi;
    }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setContractURI(string memory _newContractURI) public onlyOwner {
    contractURi = _newContractURI;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
    emit pause(_state);
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setWhitelistMintEnabled(bool _state) public onlyOwner {
    whitelistMintEnabled = _state;
    emit whitelist(_state);
  }

  function withdraw() public onlyOwner nonReentrant {
    
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
    
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }
}
// File: contracts/WeAreLand.sol

//                         $$\        $$$$$$\      $$$$$$\                                $$\ $$\           
//                         $$ |      $$ ___$$\    $$$ __$$\                               $$ |\__|          
// $$\  $$\  $$\  $$$$$$\  $$$$$$$\  \_/   $$ |   $$$$\ $$ |$$$$$$\$$$$\   $$$$$$\   $$$$$$$ |$$\  $$$$$$\  
// $$ | $$ | $$ |$$  __$$\ $$  __$$\   $$$$$ /    $$\$$\$$ |$$  _$$  _$$\ $$  __$$\ $$  __$$ |$$ | \____$$\ 
// $$ | $$ | $$ |$$$$$$$$ |$$ |  $$ |  \___$$\    $$ \$$$$ |$$ / $$ / $$ |$$$$$$$$ |$$ /  $$ |$$ | $$$$$$$ |
// $$ | $$ | $$ |$$   ____|$$ |  $$ |$$\   $$ |   $$ |\$$$ |$$ | $$ | $$ |$$   ____|$$ |  $$ |$$ |$$  __$$ |
// \$$$$$\$$$$  |\$$$$$$$\ $$$$$$$  |\$$$$$$  |$$\\$$$$$$  /$$ | $$ | $$ |\$$$$$$$\ \$$$$$$$ |$$ |\$$$$$$$ |
//  \_____\____/  \_______|\_______/  \______/ \__|\______/ \__| \__| \__| \_______| \_______|\__| \_______|

pragma solidity ^0.8.9;








contract WeAreLand is AbstractERC1155Factory, ReentrancyGuard, VerifySign, CalScore{
    
    mapping (uint256 => bool) public claimedWeareId;
    
    uint256 public constant WeAreCalm = 1;
    uint256 public constant WeAreRelax = 2;
    uint256 public constant WeAreHappy = 3;
    uint256 public constant WeAreRich = 4;
    uint256 public constant WeAreFree = 5;

    string public contractURi = "https://gateway.pinata.cloud/ipfs/QmbDDXaqGYS29ahymuLofioBzDDfoazwmmqzupT8TpEQDy";
    string public uriPrefix = "ipfs://QmUdX9a4t2mLqSkoz73p332RiHGvmnfWtEuQxdTSiqaSkA/";
    string public uriSuffix = ".json";

    address public piplAddress = 0x6Cbf5aB650a7CCb12cf7a4c97E60600A989AcfE1;
    address public weareAddress = 0x7b41874eFe38Ea0E4866307B7208D9C856745d31;
    uint256 public requirePiplAmount = 4;
    uint256 public requireWeAreAmount = 2;
    uint256 public claimTokenAmount = 100000;
    address public signerAddress = 0xA6e8318353B20660dD9EC9fDaD7361Ad350e917e;


    constructor() ERC1155(uriPrefix) {
        _pause();
    }

    event claimed(address indexed _to, uint256 indexed _tokenId);

    function claim(uint256[] calldata pipl_tokenId, uint256[] calldata weare_tokenId, uint256 _totalScore, uint8 v, bytes32 r, bytes32 s) public payable whenNotPaused{

        PIPL piplContact = PIPL(piplAddress);
        WeAre weareContact = WeAre(weareAddress);
        
        //verify signature
        require(verifySig(pipl_tokenId, _totalScore, v, r, s) == signerAddress, "Not sign by signer");

        require(pipl_tokenId.length == requirePiplAmount, "Please input a vaild amount of pipl tokenId"); 
        require(weare_tokenId.length == requireWeAreAmount, "Please input a vaild amount of WeAre tokenId"); 

        for (uint i = 0; i < requireWeAreAmount; i++){
            require(weareContact.ownerOf(weare_tokenId[i]) == msg.sender, "You must be owner of the WeAre");  
            require(claimedWeareId[weare_tokenId[i]] == false, "Please use unclaimed WeAre for claim");                     
            //mark down claimed WeAre
            claimedWeareId[weare_tokenId[i]] = true;
        }
        
        for (uint i = 0; i < requirePiplAmount; i++){
            //burn the token
            require(piplContact.getApproved(pipl_tokenId[i]) == address(this) || piplContact.isApprovedForAll(msg.sender, address(this)) == true, "Please approve the token for claim");                     
            piplContact.safeTransferFrom(msg.sender, 0x000000000000000000000000000000000000dEaD , pipl_tokenId[i]);
        }


        //random
        uint256 randomNumber =  uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender,block.difficulty)));
        randomNumber = (randomNumber % 100) + 1;

        uint256 landId = calculate(_totalScore, randomNumber);      
        
        _mint(msg.sender, landId, 1, "");

        emit claimed(msg.sender, landId);   
        
    }

    // For marketing etc.
    function mintForAddress(uint256 _tokenId, uint256 _mintAmount, address _receiver) public onlyOwner {
        _mint(_receiver, _tokenId, _mintAmount, "");
    }

    function mintForAddressBatch(uint256[] memory _tokenId, uint256[] memory _mintAmount, address _receiver) public onlyOwner {
        _mintBatch(_receiver, _tokenId, _mintAmount, "");
    }

    function uri(uint256 _tokenId) public view virtual override returns (string memory) {
        require(exists(_tokenId), 'Metadata: URI query for nonexistent token');

        string memory currentBaseURI = super.uri(_tokenId);
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId), uriSuffix))
            : '';
    }

    function contractURI() public view returns (string memory) {
        return contractURi;
    }

    function setSignerAddress(address _signerAddress) public onlyOwner {
        signerAddress = _signerAddress;
    }

    function setContractURI(string memory _newContractURI) public onlyOwner {
        contractURi = _newContractURI;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setRequirePiplAmount(uint256 _requirePiplAmount) public onlyOwner {
        requirePiplAmount = _requirePiplAmount;
    }

    function setRequireWeAreAmount(uint256 _requireWeAreAmount) public onlyOwner {
        requireWeAreAmount = _requireWeAreAmount;
    }

    function setClaimTokenAmount(uint256 _claimTokenAmount) public onlyOwner {
        claimTokenAmount = _claimTokenAmount;
    }

    function withdraw() public onlyOwner nonReentrant {    
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);    
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimed","type":"event"},{"inputs":[],"name":"WeAreCalm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeAreFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeAreHappy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeAreRelax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeAreRich","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pipl_tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"weare_tokenId","type":"uint256[]"},{"internalType":"uint256","name":"_totalScore","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedWeareId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURi","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintAmount","type":"uint256[]"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddressBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piplAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requirePiplAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requireWeAreAmount","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimTokenAmount","type":"uint256"}],"name":"setClaimTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requirePiplAmount","type":"uint256"}],"name":"setRequirePiplAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requireWeAreAmount","type":"uint256"}],"name":"setRequireWeAreAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weareAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601360808190527f57654172655069706c576f726c64204c616e640000000000000000000000000060a090815262000040916006919062000462565b506040805180820190915260098082526815d9505c9953185b9960ba1b6020909201918252620000739160079162000462565b5060405180608001604052806050815260200162003f75605091398051620000a491600b9160209091019062000462565b5060405180606001604052806036815260200162003fc5603691398051620000d591600c9160209091019062000462565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200010491600d9162000462565b50600e80546001600160a01b0319908116736cbf5ab650a7ccb12cf7a4c97e60600a989acfe117909155600f80548216737b41874efe38ea0e4866307b7208d9c856745d3117905560046010556002601155620186a06012556013805490911673a6e8318353b20660dd9ec9fdad7361ad350e917e1790553480156200018957600080fd5b50600c8054620001999062000508565b80601f0160208091040260200160405190810160405280929190818152602001828054620001c79062000508565b8015620002185780601f10620001ec5761010080835404028352916020019162000218565b820191906000526020600020905b815481529060010190602001808311620001fa57829003601f168201915b50506000805460ff1916905550620002349150829050620002af565b506200024033620002c8565b600160088190556040805160c0810182526004608082019081526313185b9960e21b60a0830152815281518083018352838152603160f81b602082810191909152820152908101919091523060608201526200029c906200031a565b600955620002a9620003b8565b62000544565b8051620002c490600390602084019062000462565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f826000015180519060200120836020015180519060200120846040015185606001516040516020016200039b9594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b604051602081830303815290604052805190602001209050919050565b620003c262000415565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003f83390565b6040516001600160a01b03909116815260200160405180910390a1565b60005460ff1615620004605760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b565b828054620004709062000508565b90600052602060002090601f016020900481019282620004945760008555620004df565b82601f10620004af57805160ff1916838001178555620004df565b82800160010185558215620004df579182015b82811115620004df578251825591602001919060010190620004c2565b50620004ed929150620004f1565b5090565b5b80821115620004ed5760008155600101620004f2565b600181811c908216806200051d57607f821691505b6020821081036200053e57634e487b7160e01b600052602260045260246000fd5b50919050565b613a2180620005546000396000f3fe6080604052600436106102875760003560e01c80637062755c1161015a578063a37292ca116100c1578063e985e9c51161007a578063e985e9c514610760578063f242432a146107a9578063f26c36e4146107c9578063f2fde38b146107de578063f4f678e3146107fe578063f5298aca1461081e57600080fd5b8063a37292ca146106b6578063b33d5356146106d6578063bd85b039146106f6578063d3706c2914610723578063d848c2f014610738578063e8a3d4851461074b57600080fd5b80638da5cb5b116101135780638da5cb5b146105f35780638db41ca414610611578063938e3d7b1461064157806395d89b41146106615780639a322d2714610676578063a22cb4651461069657600080fd5b80637062755c14610568578063715018a61461057d578063744a41481461059257806374b93661146105a85780637ec4e622146105c85780638456cb59146105de57600080fd5b80633ccfd60b116101fe578063571c2f9e116101b7578063571c2f9e146104ae5780635b7633d0146104c35780635c975abb146104fb57806362b99ad4146105135780636466c7da146105285780636b20c4541461054857600080fd5b80633ccfd60b146103f35780633f4ba83a14610408578063408eab741461041d5780634e1273f41461043d5780634f558e791461046a5780635503a0e81461049957600080fd5b806306fdde031161025057806306fdde03146103475780630e89341c1461036957806316ba10e0146103895780632b4ac086146103a95780632eb2c2d6146103be5780633533a342146103de57600080fd5b8062fdd58e1461028c57806301ffc9a7146102bf57806302fe5305146102ef578063046dc1661461031157806304b9397b14610331575b600080fd5b34801561029857600080fd5b506102ac6102a7366004612c88565b61083e565b6040519081526020015b60405180910390f35b3480156102cb57600080fd5b506102df6102da366004612cca565b6108d9565b60405190151581526020016102b6565b3480156102fb57600080fd5b5061030f61030a366004612d86565b610929565b005b34801561031d57600080fd5b5061030f61032c366004612dce565b61095f565b34801561033d57600080fd5b506102ac60115481565b34801561035357600080fd5b5061035c6109ab565b6040516102b69190612e43565b34801561037557600080fd5b5061035c610384366004612e56565b610a3d565b34801561039557600080fd5b5061030f6103a4366004612d86565b610b0d565b3480156103b557600080fd5b506102ac600381565b3480156103ca57600080fd5b5061030f6103d9366004612f23565b610b4e565b3480156103ea57600080fd5b506102ac600481565b3480156103ff57600080fd5b5061030f610b9a565b34801561041457600080fd5b5061030f610c94565b34801561042957600080fd5b5061030f610438366004612fd0565b610cc8565b34801561044957600080fd5b5061045d610458366004613009565b610d12565b6040516102b69190613110565b34801561047657600080fd5b506102df610485366004612e56565b600090815260046020526040902054151590565b3480156104a557600080fd5b5061035c610e3b565b3480156104ba57600080fd5b506102ac600581565b3480156104cf57600080fd5b506013546104e3906001600160a01b031681565b6040516001600160a01b0390911681526020016102b6565b34801561050757600080fd5b5060005460ff166102df565b34801561051f57600080fd5b5061035c610ec9565b34801561053457600080fd5b5061030f610543366004612e56565b610ed6565b34801561055457600080fd5b5061030f610563366004613123565b610f05565b34801561057457600080fd5b506102ac600181565b34801561058957600080fd5b5061030f610f48565b34801561059e57600080fd5b506102ac60105481565b3480156105b457600080fd5b5061030f6105c3366004612e56565b610f7c565b3480156105d457600080fd5b506102ac60125481565b3480156105ea57600080fd5b5061030f610fab565b3480156105ff57600080fd5b506005546001600160a01b03166104e3565b34801561061d57600080fd5b506102df61062c366004612e56565b600a6020526000908152604090205460ff1681565b34801561064d57600080fd5b5061030f61065c366004612d86565b610fdd565b34801561066d57600080fd5b5061035c61101a565b34801561068257600080fd5b50600e546104e3906001600160a01b031681565b3480156106a257600080fd5b5061030f6106b13660046131a6565b611029565b3480156106c257600080fd5b5061030f6106d1366004612e56565b611034565b3480156106e257600080fd5b5061030f6106f13660046131df565b611063565b34801561070257600080fd5b506102ac610711366004612e56565b60009081526004602052604090205490565b34801561072f57600080fd5b506102ac600281565b61030f610746366004613296565b6110a8565b34801561075757600080fd5b5061035c6116d0565b34801561076c57600080fd5b506102df61077b366004613339565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b3480156107b557600080fd5b5061030f6107c4366004613367565b6116df565b3480156107d557600080fd5b5061035c611724565b3480156107ea57600080fd5b5061030f6107f9366004612dce565b611731565b34801561080a57600080fd5b50600f546104e3906001600160a01b031681565b34801561082a57600080fd5b5061030f6108393660046133cf565b6117c9565b60006001600160a01b0383166108ae5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061090a57506001600160e01b031982166303a24d0760e21b145b806108d357506301ffc9a760e01b6001600160e01b03198316146108d3565b6005546001600160a01b031633146109535760405162461bcd60e51b81526004016108a590613404565b61095c8161180c565b50565b6005546001600160a01b031633146109895760405162461bcd60e51b81526004016108a590613404565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6060600680546109ba90613439565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613439565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b600081815260046020526040902054606090610aad5760405162461bcd60e51b815260206004820152602960248201527f4d657461646174613a2055524920717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a5565b6000610ab88361181f565b90506000815111610ad85760405180602001604052806000815250610b06565b80610ae2846118b3565b600d604051602001610af693929190613473565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314610b375760405162461bcd60e51b81526004016108a590613404565b8051610b4a90600d906020840190612bda565b5050565b6001600160a01b038516331480610b6a5750610b6a853361077b565b610b865760405162461bcd60e51b81526004016108a590613536565b610b9385858585856119bb565b5050505050565b6005546001600160a01b03163314610bc45760405162461bcd60e51b81526004016108a590613404565b600260085403610c165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108a5565b60026008556000610c2f6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c79576040519150601f19603f3d011682016040523d82523d6000602084013e610c7e565b606091505b5050905080610c8c57600080fd5b506001600855565b6005546001600160a01b03163314610cbe5760405162461bcd60e51b81526004016108a590613404565b610cc6611b68565b565b6005546001600160a01b03163314610cf25760405162461bcd60e51b81526004016108a590613404565b610d0d81848460405180602001604052806000815250611bba565b505050565b60608151835114610d775760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108a5565b600083516001600160401b03811115610d9257610d92612ce7565b604051908082528060200260200182016040528015610dbb578160200160208202803683370190505b50905060005b8451811015610e3357610e06858281518110610ddf57610ddf613585565b6020026020010151858381518110610df957610df9613585565b602002602001015161083e565b828281518110610e1857610e18613585565b6020908102919091010152610e2c816135b1565b9050610dc1565b509392505050565b600d8054610e4890613439565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7490613439565b8015610ec15780601f10610e9657610100808354040283529160200191610ec1565b820191906000526020600020905b815481529060010190602001808311610ea457829003601f168201915b505050505081565b600c8054610e4890613439565b6005546001600160a01b03163314610f005760405162461bcd60e51b81526004016108a590613404565b601155565b6001600160a01b038316331480610f215750610f21833361077b565b610f3d5760405162461bcd60e51b81526004016108a590613536565b610d0d838383611ca5565b6005546001600160a01b03163314610f725760405162461bcd60e51b81526004016108a590613404565b610cc66000611e46565b6005546001600160a01b03163314610fa65760405162461bcd60e51b81526004016108a590613404565b601255565b6005546001600160a01b03163314610fd55760405162461bcd60e51b81526004016108a590613404565b610cc6611e98565b6005546001600160a01b031633146110075760405162461bcd60e51b81526004016108a590613404565b8051610b4a90600b906020840190612bda565b6060600780546109ba90613439565b610b4a338383611ed5565b6005546001600160a01b0316331461105e5760405162461bcd60e51b81526004016108a590613404565b601055565b6005546001600160a01b0316331461108d5760405162461bcd60e51b81526004016108a590613404565b610d0d81848460405180602001604052806000815250611fb5565b6110b0612110565b600e54600f546013546040805160208c810280830182019093528c82526001600160a01b0395861695948516949093169261110c928e918e9182918501908490808284376000920191909152508b92508a915089905088612156565b6001600160a01b0316146111575760405162461bcd60e51b81526020600482015260126024820152712737ba1039b4b3b710313c9039b4b3b732b960711b60448201526064016108a5565b60105489146111bc5760405162461bcd60e51b815260206004820152602b60248201527f506c6561736520696e7075742061207661696c6420616d6f756e74206f66207060448201526a1a5c1b081d1bdad95b925960aa1b60648201526084016108a5565b60115487146112225760405162461bcd60e51b815260206004820152602c60248201527f506c6561736520696e7075742061207661696c6420616d6f756e74206f66205760448201526b19505c99481d1bdad95b925960a21b60648201526084016108a5565b60005b6011548110156113f057336001600160a01b038316636352211e8b8b8581811061125157611251613585565b905060200201356040518263ffffffff1660e01b815260040161127691815260200190565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b791906135ca565b6001600160a01b03161461130d5760405162461bcd60e51b815260206004820152601e60248201527f596f75206d757374206265206f776e6572206f6620746865205765417265000060448201526064016108a5565b600a60008a8a8481811061132357611323613585565b602090810292909201358352508101919091526040016000205460ff16156113995760405162461bcd60e51b8152602060048201526024808201527f506c656173652075736520756e636c61696d656420576541726520666f7220636044820152636c61696d60e01b60648201526084016108a5565b6001600a60008b8b858181106113b1576113b1613585565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113e8906135b1565b915050611225565b5060005b60105481101561160857306001600160a01b03841663081812fc8d8d8581811061142057611420613585565b905060200201356040518263ffffffff1660e01b815260040161144591815260200190565b602060405180830381865afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148691906135ca565b6001600160a01b0316148061150a575060405163e985e9c560e01b81523360048201523060248201526001600160a01b0384169063e985e9c590604401602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150491906135e7565b15156001145b6115615760405162461bcd60e51b815260206004820152602260248201527f506c6561736520617070726f76652074686520746f6b656e20666f7220636c61604482015261696d60f01b60648201526084016108a5565b826001600160a01b03166342842e0e3361dead8e8e8681811061158657611586613585565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b505050508080611600906135b1565b9150506113f4565b50604080514260208201526bffffffffffffffffffffffff193360601b169181019190915244605482015260009060740160408051601f198184030181529190528051602090910120905061165e60648261361a565b61166990600161362e565b9050600061167788836122cc565b90506116953382600160405180602001604052806000815250611bba565b604051819033907f4dd6c8de072db5939c4dc757de920d64bcbef063a41150ae51deb4f125032ddf90600090a3505050505050505050505050565b6060600b80546109ba90613439565b6001600160a01b0385163314806116fb57506116fb853361077b565b6117175760405162461bcd60e51b81526004016108a590613536565b610b9385858585856124c0565b600b8054610e4890613439565b6005546001600160a01b0316331461175b5760405162461bcd60e51b81526004016108a590613404565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a5565b61095c81611e46565b6001600160a01b0383163314806117e557506117e5833361077b565b6118015760405162461bcd60e51b81526004016108a590613536565b610d0d8383836125fc565b8051610b4a906003906020840190612bda565b60606003805461182e90613439565b80601f016020809104026020016040519081016040528092919081815260200182805461185a90613439565b80156118a75780601f1061187c576101008083540402835291602001916118a7565b820191906000526020600020905b81548152906001019060200180831161188a57829003601f168201915b50505050509050919050565b6060816000036118da5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561190457806118ee816135b1565b91506118fd9050600a83613646565b91506118de565b6000816001600160401b0381111561191e5761191e612ce7565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b5090505b84156119b35761195d60018361365a565b915061196a600a8661361a565b61197590603061362e565b60f81b81838151811061198a5761198a613585565b60200101906001600160f81b031916908160001a9053506119ac600a86613646565b945061194c565b949350505050565b81518351146119dc5760405162461bcd60e51b81526004016108a590613671565b6001600160a01b038416611a025760405162461bcd60e51b81526004016108a5906136b9565b33611a11818787878787612718565b60005b8451811015611afa576000858281518110611a3157611a31613585565b602002602001015190506000858381518110611a4f57611a4f613585565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611aa05760405162461bcd60e51b81526004016108a5906136fe565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611adf90849061362e565b9250508190555050505080611af3906135b1565b9050611a14565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b4a929190613748565b60405180910390a4611b60818787878787612726565b505050505050565b611b70612881565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038416611be05760405162461bcd60e51b81526004016108a590613776565b336000611bec856128ca565b90506000611bf9856128ca565b9050611c0a83600089858589612718565b60008681526001602090815260408083206001600160a01b038b16845290915281208054879290611c3c90849061362e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c9c83600089898989612915565b50505050505050565b6001600160a01b038316611ccb5760405162461bcd60e51b81526004016108a5906137b7565b8051825114611cec5760405162461bcd60e51b81526004016108a590613671565b6000339050611d0f81856000868660405180602001604052806000815250612718565b60005b8351811015611dd7576000848281518110611d2f57611d2f613585565b602002602001015190506000848381518110611d4d57611d4d613585565b60209081029190910181015160008481526001835260408082206001600160a01b038c168352909352919091205490915081811015611d9e5760405162461bcd60e51b81526004016108a5906137fa565b60009283526001602090815260408085206001600160a01b038b1686529091529092209103905580611dcf816135b1565b915050611d12565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e28929190613748565b60405180910390a46040805160208101909152600090525b50505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ea0612110565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b9d3390565b816001600160a01b0316836001600160a01b031603611f485760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108a5565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611fdb5760405162461bcd60e51b81526004016108a590613776565b8151835114611ffc5760405162461bcd60e51b81526004016108a590613671565b3361200c81600087878787612718565b60005b84518110156120a85783818151811061202a5761202a613585565b60200260200101516001600087848151811061204857612048613585565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612090919061362e565b909155508190506120a0816135b1565b91505061200f565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516120f9929190613748565b60405180910390a4610b9381600087878787612726565b60005460ff1615610cc65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108a5565b600061218a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8660008151811061219d5761219d613585565b6020026020010151816000018181525050866001815181106121c1576121c1613585565b6020026020010151816020018181525050866002815181106121e5576121e5613585565b60200260200101518160400181815250508660038151811061220957612209613585565b602090810291909101015160608201526080810186905260095460009061222f836129d0565b60405161190160f01b60208201526022810192909252604282015260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa1580156122b5573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b6000620f424083106122e0575060056108d3565b6201030283101561237757600382116122fb575060056108d3565b6004821015801561230d5750600a8211155b1561231a575060046108d3565b600b821015801561232c575060148211155b15612339575060036108d3565b6015821015801561234b575060288211155b15612358575060026108d3565b6029821015801561236a575060648211155b15612377575060016108d3565b62010302831015801561238d575062013ee08311155b1561241e57600582116123a2575060056108d3565b600682101580156123b45750600f8211155b156123c1575060046108d3565b601082101580156123d3575060198211155b156123e0575060036108d3565b601a82101580156123f2575060238211155b156123ff575060026108d3565b60248210158015612411575060648211155b1561241e575060016108d3565b62013ee183101580156124345750620192ec8311155b1561248757600a8211612449575060056108d3565b600b821015801561245b575060288211155b15612468575060046108d3565b6029821015801561247a575060648211155b15612487575060036108d3565b620192ec83106108d357600f82116124a1575060056108d3565b601082101580156124b3575060648211155b156108d3575060046108d3565b6001600160a01b0384166124e65760405162461bcd60e51b81526004016108a5906136b9565b3360006124f2856128ca565b905060006124ff856128ca565b905061250f838989858589612718565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156125525760405162461bcd60e51b81526004016108a5906136fe565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061259190849061362e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125f1848a8a8a8a8a612915565b505050505050505050565b6001600160a01b0383166126225760405162461bcd60e51b81526004016108a5906137b7565b33600061262e846128ca565b9050600061263b846128ca565b905061265b83876000858560405180602001604052806000815250612718565b60008581526001602090815260408083206001600160a01b038a1684529091529020548481101561269e5760405162461bcd60e51b81526004016108a5906137fa565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611c9c565b611b60868686868686612a61565b6001600160a01b0384163b15611b605760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061276a908990899088908890889060040161383e565b6020604051808303816000875af19250505080156127a5575060408051601f3d908101601f191682019092526127a29181019061389c565b60015b612851576127b16138b9565b806308c379a0036127ea57506127c56138d5565b806127d057506127ec565b8060405162461bcd60e51b81526004016108a59190612e43565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108a5565b6001600160e01b0319811663bc197c8160e01b14611c9c5760405162461bcd60e51b81526004016108a59061395e565b60005460ff16610cc65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108a5565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061290457612904613585565b602090810291909101015292915050565b6001600160a01b0384163b15611b605760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061295990899089908890889088906004016139a6565b6020604051808303816000875af1925050508015612994575060408051601f3d908101601f191682019092526129919181019061389c565b60015b6129a0576127b16138b9565b6001600160e01b0319811663f23a6e6160e01b14611c9c5760405162461bcd60e51b81526004016108a59061395e565b60007fc2a9e343d3b594766b9e4287bd6037dded266e043bbea8845d1ab5ab2c85442282600001518360200151846040015185606001518660800151604051602001612a4496959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038516612ae85760005b8351811015612ae657828181518110612a8d57612a8d613585565b602002602001015160046000868481518110612aab57612aab613585565b602002602001015181526020019081526020016000206000828254612ad0919061362e565b90915550612adf9050816135b1565b9050612a72565b505b6001600160a01b038416611b605760005b8351811015611c9c576000848281518110612b1657612b16613585565b602002602001015190506000848381518110612b3457612b34613585565b6020026020010151905060006004600084815260200190815260200160002054905081811015612bb75760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016108a5565b60009283526004602052604090922091039055612bd3816135b1565b9050612af9565b828054612be690613439565b90600052602060002090601f016020900481019282612c085760008555612c4e565b82601f10612c2157805160ff1916838001178555612c4e565b82800160010185558215612c4e579182015b82811115612c4e578251825591602001919060010190612c33565b50612c5a929150612c5e565b5090565b5b80821115612c5a5760008155600101612c5f565b6001600160a01b038116811461095c57600080fd5b60008060408385031215612c9b57600080fd5b8235612ca681612c73565b946020939093013593505050565b6001600160e01b03198116811461095c57600080fd5b600060208284031215612cdc57600080fd5b8135610b0681612cb4565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612d2257612d22612ce7565b6040525050565b60006001600160401b03831115612d4257612d42612ce7565b604051612d59601f8501601f191660200182612cfd565b809150838152848484011115612d6e57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612d9857600080fd5b81356001600160401b03811115612dae57600080fd5b8201601f81018413612dbf57600080fd5b6119b384823560208401612d29565b600060208284031215612de057600080fd5b8135610b0681612c73565b60005b83811015612e06578181015183820152602001612dee565b83811115611e405750506000910152565b60008151808452612e2f816020860160208601612deb565b601f01601f19169290920160200192915050565b602081526000610b066020830184612e17565b600060208284031215612e6857600080fd5b5035919050565b60006001600160401b03821115612e8857612e88612ce7565b5060051b60200190565b600082601f830112612ea357600080fd5b81356020612eb082612e6f565b604051612ebd8282612cfd565b83815260059390931b8501820192828101915086841115612edd57600080fd5b8286015b84811015612ef85780358352918301918301612ee1565b509695505050505050565b600082601f830112612f1457600080fd5b610b0683833560208501612d29565b600080600080600060a08688031215612f3b57600080fd5b8535612f4681612c73565b94506020860135612f5681612c73565b935060408601356001600160401b0380821115612f7257600080fd5b612f7e89838a01612e92565b94506060880135915080821115612f9457600080fd5b612fa089838a01612e92565b93506080880135915080821115612fb657600080fd5b50612fc388828901612f03565b9150509295509295909350565b600080600060608486031215612fe557600080fd5b83359250602084013591506040840135612ffe81612c73565b809150509250925092565b6000806040838503121561301c57600080fd5b82356001600160401b038082111561303357600080fd5b818501915085601f83011261304757600080fd5b8135602061305482612e6f565b6040516130618282612cfd565b83815260059390931b850182019282810191508984111561308157600080fd5b948201945b838610156130a857853561309981612c73565b82529482019490820190613086565b965050860135925050808211156130be57600080fd5b506130cb85828601612e92565b9150509250929050565b600081518084526020808501945080840160005b83811015613105578151875295820195908201906001016130e9565b509495945050505050565b602081526000610b0660208301846130d5565b60008060006060848603121561313857600080fd5b833561314381612c73565b925060208401356001600160401b038082111561315f57600080fd5b61316b87838801612e92565b9350604086013591508082111561318157600080fd5b5061318e86828701612e92565b9150509250925092565b801515811461095c57600080fd5b600080604083850312156131b957600080fd5b82356131c481612c73565b915060208301356131d481613198565b809150509250929050565b6000806000606084860312156131f457600080fd5b83356001600160401b038082111561320b57600080fd5b61321787838801612e92565b9450602086013591508082111561322d57600080fd5b5061323a86828701612e92565b9250506040840135612ffe81612c73565b60008083601f84011261325d57600080fd5b5081356001600160401b0381111561327457600080fd5b6020830191508360208260051b850101111561328f57600080fd5b9250929050565b60008060008060008060008060c0898b0312156132b257600080fd5b88356001600160401b03808211156132c957600080fd5b6132d58c838d0161324b565b909a50985060208b01359150808211156132ee57600080fd5b506132fb8b828c0161324b565b90975095505060408901359350606089013560ff8116811461331c57600080fd5b979a969950949793969295929450505060808201359160a0013590565b6000806040838503121561334c57600080fd5b823561335781612c73565b915060208301356131d481612c73565b600080600080600060a0868803121561337f57600080fd5b853561338a81612c73565b9450602086013561339a81612c73565b9350604086013592506060860135915060808601356001600160401b038111156133c357600080fd5b612fc388828901612f03565b6000806000606084860312156133e457600080fd5b83356133ef81612c73565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061344d57607f821691505b60208210810361346d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000845160206134868285838a01612deb565b8551918401916134998184848a01612deb565b8554920191600090600181811c90808316806134b657607f831692505b85831081036134d357634e487b7160e01b85526022600452602485fd5b8080156134e757600181146134f857613525565b60ff19851688528388019550613525565b60008b81526020902060005b8581101561351d5781548a820152908401908801613504565b505083880195505b50939b9a5050505050505050505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135c3576135c361359b565b5060010190565b6000602082840312156135dc57600080fd5b8151610b0681612c73565b6000602082840312156135f957600080fd5b8151610b0681613198565b634e487b7160e01b600052601260045260246000fd5b60008261362957613629613604565b500690565b600082198211156136415761364161359b565b500190565b60008261365557613655613604565b500490565b60008282101561366c5761366c61359b565b500390565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061375b60408301856130d5565b828103602084015261376d81856130d5565b95945050505050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061386a908301866130d5565b828103606084015261387c81866130d5565b905082810360808401526138908185612e17565b98975050505050505050565b6000602082840312156138ae57600080fd5b8151610b0681612cb4565b600060033d11156138d25760046000803e5060005160e01c5b90565b600060443d10156138e35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561391257505050505090565b828501915081518181111561392a5750505050505090565b843d87010160208285010111156139445750505050505090565b61395360208286010187612cfd565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906139e090830184612e17565b97965050505050505056fea264697066735822122016702aad30d436a7a9e531379d8cba0b008744f226707dc2d62a3d4ce8b14aa064736f6c634300080d003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d62444458617147595332396168796d754c6f66696f427a4444666f617a776d6d717a75705438547045514479697066733a2f2f516d55645839613474326d4c71536b6f7a37337033333252694847766d6e66577445755178645453697161536b412f

Deployed Bytecode

0x6080604052600436106102875760003560e01c80637062755c1161015a578063a37292ca116100c1578063e985e9c51161007a578063e985e9c514610760578063f242432a146107a9578063f26c36e4146107c9578063f2fde38b146107de578063f4f678e3146107fe578063f5298aca1461081e57600080fd5b8063a37292ca146106b6578063b33d5356146106d6578063bd85b039146106f6578063d3706c2914610723578063d848c2f014610738578063e8a3d4851461074b57600080fd5b80638da5cb5b116101135780638da5cb5b146105f35780638db41ca414610611578063938e3d7b1461064157806395d89b41146106615780639a322d2714610676578063a22cb4651461069657600080fd5b80637062755c14610568578063715018a61461057d578063744a41481461059257806374b93661146105a85780637ec4e622146105c85780638456cb59146105de57600080fd5b80633ccfd60b116101fe578063571c2f9e116101b7578063571c2f9e146104ae5780635b7633d0146104c35780635c975abb146104fb57806362b99ad4146105135780636466c7da146105285780636b20c4541461054857600080fd5b80633ccfd60b146103f35780633f4ba83a14610408578063408eab741461041d5780634e1273f41461043d5780634f558e791461046a5780635503a0e81461049957600080fd5b806306fdde031161025057806306fdde03146103475780630e89341c1461036957806316ba10e0146103895780632b4ac086146103a95780632eb2c2d6146103be5780633533a342146103de57600080fd5b8062fdd58e1461028c57806301ffc9a7146102bf57806302fe5305146102ef578063046dc1661461031157806304b9397b14610331575b600080fd5b34801561029857600080fd5b506102ac6102a7366004612c88565b61083e565b6040519081526020015b60405180910390f35b3480156102cb57600080fd5b506102df6102da366004612cca565b6108d9565b60405190151581526020016102b6565b3480156102fb57600080fd5b5061030f61030a366004612d86565b610929565b005b34801561031d57600080fd5b5061030f61032c366004612dce565b61095f565b34801561033d57600080fd5b506102ac60115481565b34801561035357600080fd5b5061035c6109ab565b6040516102b69190612e43565b34801561037557600080fd5b5061035c610384366004612e56565b610a3d565b34801561039557600080fd5b5061030f6103a4366004612d86565b610b0d565b3480156103b557600080fd5b506102ac600381565b3480156103ca57600080fd5b5061030f6103d9366004612f23565b610b4e565b3480156103ea57600080fd5b506102ac600481565b3480156103ff57600080fd5b5061030f610b9a565b34801561041457600080fd5b5061030f610c94565b34801561042957600080fd5b5061030f610438366004612fd0565b610cc8565b34801561044957600080fd5b5061045d610458366004613009565b610d12565b6040516102b69190613110565b34801561047657600080fd5b506102df610485366004612e56565b600090815260046020526040902054151590565b3480156104a557600080fd5b5061035c610e3b565b3480156104ba57600080fd5b506102ac600581565b3480156104cf57600080fd5b506013546104e3906001600160a01b031681565b6040516001600160a01b0390911681526020016102b6565b34801561050757600080fd5b5060005460ff166102df565b34801561051f57600080fd5b5061035c610ec9565b34801561053457600080fd5b5061030f610543366004612e56565b610ed6565b34801561055457600080fd5b5061030f610563366004613123565b610f05565b34801561057457600080fd5b506102ac600181565b34801561058957600080fd5b5061030f610f48565b34801561059e57600080fd5b506102ac60105481565b3480156105b457600080fd5b5061030f6105c3366004612e56565b610f7c565b3480156105d457600080fd5b506102ac60125481565b3480156105ea57600080fd5b5061030f610fab565b3480156105ff57600080fd5b506005546001600160a01b03166104e3565b34801561061d57600080fd5b506102df61062c366004612e56565b600a6020526000908152604090205460ff1681565b34801561064d57600080fd5b5061030f61065c366004612d86565b610fdd565b34801561066d57600080fd5b5061035c61101a565b34801561068257600080fd5b50600e546104e3906001600160a01b031681565b3480156106a257600080fd5b5061030f6106b13660046131a6565b611029565b3480156106c257600080fd5b5061030f6106d1366004612e56565b611034565b3480156106e257600080fd5b5061030f6106f13660046131df565b611063565b34801561070257600080fd5b506102ac610711366004612e56565b60009081526004602052604090205490565b34801561072f57600080fd5b506102ac600281565b61030f610746366004613296565b6110a8565b34801561075757600080fd5b5061035c6116d0565b34801561076c57600080fd5b506102df61077b366004613339565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b3480156107b557600080fd5b5061030f6107c4366004613367565b6116df565b3480156107d557600080fd5b5061035c611724565b3480156107ea57600080fd5b5061030f6107f9366004612dce565b611731565b34801561080a57600080fd5b50600f546104e3906001600160a01b031681565b34801561082a57600080fd5b5061030f6108393660046133cf565b6117c9565b60006001600160a01b0383166108ae5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061090a57506001600160e01b031982166303a24d0760e21b145b806108d357506301ffc9a760e01b6001600160e01b03198316146108d3565b6005546001600160a01b031633146109535760405162461bcd60e51b81526004016108a590613404565b61095c8161180c565b50565b6005546001600160a01b031633146109895760405162461bcd60e51b81526004016108a590613404565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6060600680546109ba90613439565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613439565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b600081815260046020526040902054606090610aad5760405162461bcd60e51b815260206004820152602960248201527f4d657461646174613a2055524920717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a5565b6000610ab88361181f565b90506000815111610ad85760405180602001604052806000815250610b06565b80610ae2846118b3565b600d604051602001610af693929190613473565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314610b375760405162461bcd60e51b81526004016108a590613404565b8051610b4a90600d906020840190612bda565b5050565b6001600160a01b038516331480610b6a5750610b6a853361077b565b610b865760405162461bcd60e51b81526004016108a590613536565b610b9385858585856119bb565b5050505050565b6005546001600160a01b03163314610bc45760405162461bcd60e51b81526004016108a590613404565b600260085403610c165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108a5565b60026008556000610c2f6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c79576040519150601f19603f3d011682016040523d82523d6000602084013e610c7e565b606091505b5050905080610c8c57600080fd5b506001600855565b6005546001600160a01b03163314610cbe5760405162461bcd60e51b81526004016108a590613404565b610cc6611b68565b565b6005546001600160a01b03163314610cf25760405162461bcd60e51b81526004016108a590613404565b610d0d81848460405180602001604052806000815250611bba565b505050565b60608151835114610d775760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108a5565b600083516001600160401b03811115610d9257610d92612ce7565b604051908082528060200260200182016040528015610dbb578160200160208202803683370190505b50905060005b8451811015610e3357610e06858281518110610ddf57610ddf613585565b6020026020010151858381518110610df957610df9613585565b602002602001015161083e565b828281518110610e1857610e18613585565b6020908102919091010152610e2c816135b1565b9050610dc1565b509392505050565b600d8054610e4890613439565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7490613439565b8015610ec15780601f10610e9657610100808354040283529160200191610ec1565b820191906000526020600020905b815481529060010190602001808311610ea457829003601f168201915b505050505081565b600c8054610e4890613439565b6005546001600160a01b03163314610f005760405162461bcd60e51b81526004016108a590613404565b601155565b6001600160a01b038316331480610f215750610f21833361077b565b610f3d5760405162461bcd60e51b81526004016108a590613536565b610d0d838383611ca5565b6005546001600160a01b03163314610f725760405162461bcd60e51b81526004016108a590613404565b610cc66000611e46565b6005546001600160a01b03163314610fa65760405162461bcd60e51b81526004016108a590613404565b601255565b6005546001600160a01b03163314610fd55760405162461bcd60e51b81526004016108a590613404565b610cc6611e98565b6005546001600160a01b031633146110075760405162461bcd60e51b81526004016108a590613404565b8051610b4a90600b906020840190612bda565b6060600780546109ba90613439565b610b4a338383611ed5565b6005546001600160a01b0316331461105e5760405162461bcd60e51b81526004016108a590613404565b601055565b6005546001600160a01b0316331461108d5760405162461bcd60e51b81526004016108a590613404565b610d0d81848460405180602001604052806000815250611fb5565b6110b0612110565b600e54600f546013546040805160208c810280830182019093528c82526001600160a01b0395861695948516949093169261110c928e918e9182918501908490808284376000920191909152508b92508a915089905088612156565b6001600160a01b0316146111575760405162461bcd60e51b81526020600482015260126024820152712737ba1039b4b3b710313c9039b4b3b732b960711b60448201526064016108a5565b60105489146111bc5760405162461bcd60e51b815260206004820152602b60248201527f506c6561736520696e7075742061207661696c6420616d6f756e74206f66207060448201526a1a5c1b081d1bdad95b925960aa1b60648201526084016108a5565b60115487146112225760405162461bcd60e51b815260206004820152602c60248201527f506c6561736520696e7075742061207661696c6420616d6f756e74206f66205760448201526b19505c99481d1bdad95b925960a21b60648201526084016108a5565b60005b6011548110156113f057336001600160a01b038316636352211e8b8b8581811061125157611251613585565b905060200201356040518263ffffffff1660e01b815260040161127691815260200190565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b791906135ca565b6001600160a01b03161461130d5760405162461bcd60e51b815260206004820152601e60248201527f596f75206d757374206265206f776e6572206f6620746865205765417265000060448201526064016108a5565b600a60008a8a8481811061132357611323613585565b602090810292909201358352508101919091526040016000205460ff16156113995760405162461bcd60e51b8152602060048201526024808201527f506c656173652075736520756e636c61696d656420576541726520666f7220636044820152636c61696d60e01b60648201526084016108a5565b6001600a60008b8b858181106113b1576113b1613585565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113e8906135b1565b915050611225565b5060005b60105481101561160857306001600160a01b03841663081812fc8d8d8581811061142057611420613585565b905060200201356040518263ffffffff1660e01b815260040161144591815260200190565b602060405180830381865afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148691906135ca565b6001600160a01b0316148061150a575060405163e985e9c560e01b81523360048201523060248201526001600160a01b0384169063e985e9c590604401602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150491906135e7565b15156001145b6115615760405162461bcd60e51b815260206004820152602260248201527f506c6561736520617070726f76652074686520746f6b656e20666f7220636c61604482015261696d60f01b60648201526084016108a5565b826001600160a01b03166342842e0e3361dead8e8e8681811061158657611586613585565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b505050508080611600906135b1565b9150506113f4565b50604080514260208201526bffffffffffffffffffffffff193360601b169181019190915244605482015260009060740160408051601f198184030181529190528051602090910120905061165e60648261361a565b61166990600161362e565b9050600061167788836122cc565b90506116953382600160405180602001604052806000815250611bba565b604051819033907f4dd6c8de072db5939c4dc757de920d64bcbef063a41150ae51deb4f125032ddf90600090a3505050505050505050505050565b6060600b80546109ba90613439565b6001600160a01b0385163314806116fb57506116fb853361077b565b6117175760405162461bcd60e51b81526004016108a590613536565b610b9385858585856124c0565b600b8054610e4890613439565b6005546001600160a01b0316331461175b5760405162461bcd60e51b81526004016108a590613404565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a5565b61095c81611e46565b6001600160a01b0383163314806117e557506117e5833361077b565b6118015760405162461bcd60e51b81526004016108a590613536565b610d0d8383836125fc565b8051610b4a906003906020840190612bda565b60606003805461182e90613439565b80601f016020809104026020016040519081016040528092919081815260200182805461185a90613439565b80156118a75780601f1061187c576101008083540402835291602001916118a7565b820191906000526020600020905b81548152906001019060200180831161188a57829003601f168201915b50505050509050919050565b6060816000036118da5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561190457806118ee816135b1565b91506118fd9050600a83613646565b91506118de565b6000816001600160401b0381111561191e5761191e612ce7565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b5090505b84156119b35761195d60018361365a565b915061196a600a8661361a565b61197590603061362e565b60f81b81838151811061198a5761198a613585565b60200101906001600160f81b031916908160001a9053506119ac600a86613646565b945061194c565b949350505050565b81518351146119dc5760405162461bcd60e51b81526004016108a590613671565b6001600160a01b038416611a025760405162461bcd60e51b81526004016108a5906136b9565b33611a11818787878787612718565b60005b8451811015611afa576000858281518110611a3157611a31613585565b602002602001015190506000858381518110611a4f57611a4f613585565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611aa05760405162461bcd60e51b81526004016108a5906136fe565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611adf90849061362e565b9250508190555050505080611af3906135b1565b9050611a14565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b4a929190613748565b60405180910390a4611b60818787878787612726565b505050505050565b611b70612881565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038416611be05760405162461bcd60e51b81526004016108a590613776565b336000611bec856128ca565b90506000611bf9856128ca565b9050611c0a83600089858589612718565b60008681526001602090815260408083206001600160a01b038b16845290915281208054879290611c3c90849061362e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c9c83600089898989612915565b50505050505050565b6001600160a01b038316611ccb5760405162461bcd60e51b81526004016108a5906137b7565b8051825114611cec5760405162461bcd60e51b81526004016108a590613671565b6000339050611d0f81856000868660405180602001604052806000815250612718565b60005b8351811015611dd7576000848281518110611d2f57611d2f613585565b602002602001015190506000848381518110611d4d57611d4d613585565b60209081029190910181015160008481526001835260408082206001600160a01b038c168352909352919091205490915081811015611d9e5760405162461bcd60e51b81526004016108a5906137fa565b60009283526001602090815260408085206001600160a01b038b1686529091529092209103905580611dcf816135b1565b915050611d12565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e28929190613748565b60405180910390a46040805160208101909152600090525b50505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ea0612110565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b9d3390565b816001600160a01b0316836001600160a01b031603611f485760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108a5565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611fdb5760405162461bcd60e51b81526004016108a590613776565b8151835114611ffc5760405162461bcd60e51b81526004016108a590613671565b3361200c81600087878787612718565b60005b84518110156120a85783818151811061202a5761202a613585565b60200260200101516001600087848151811061204857612048613585565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612090919061362e565b909155508190506120a0816135b1565b91505061200f565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516120f9929190613748565b60405180910390a4610b9381600087878787612726565b60005460ff1615610cc65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108a5565b600061218a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8660008151811061219d5761219d613585565b6020026020010151816000018181525050866001815181106121c1576121c1613585565b6020026020010151816020018181525050866002815181106121e5576121e5613585565b60200260200101518160400181815250508660038151811061220957612209613585565b602090810291909101015160608201526080810186905260095460009061222f836129d0565b60405161190160f01b60208201526022810192909252604282015260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa1580156122b5573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b6000620f424083106122e0575060056108d3565b6201030283101561237757600382116122fb575060056108d3565b6004821015801561230d5750600a8211155b1561231a575060046108d3565b600b821015801561232c575060148211155b15612339575060036108d3565b6015821015801561234b575060288211155b15612358575060026108d3565b6029821015801561236a575060648211155b15612377575060016108d3565b62010302831015801561238d575062013ee08311155b1561241e57600582116123a2575060056108d3565b600682101580156123b45750600f8211155b156123c1575060046108d3565b601082101580156123d3575060198211155b156123e0575060036108d3565b601a82101580156123f2575060238211155b156123ff575060026108d3565b60248210158015612411575060648211155b1561241e575060016108d3565b62013ee183101580156124345750620192ec8311155b1561248757600a8211612449575060056108d3565b600b821015801561245b575060288211155b15612468575060046108d3565b6029821015801561247a575060648211155b15612487575060036108d3565b620192ec83106108d357600f82116124a1575060056108d3565b601082101580156124b3575060648211155b156108d3575060046108d3565b6001600160a01b0384166124e65760405162461bcd60e51b81526004016108a5906136b9565b3360006124f2856128ca565b905060006124ff856128ca565b905061250f838989858589612718565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156125525760405162461bcd60e51b81526004016108a5906136fe565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061259190849061362e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125f1848a8a8a8a8a612915565b505050505050505050565b6001600160a01b0383166126225760405162461bcd60e51b81526004016108a5906137b7565b33600061262e846128ca565b9050600061263b846128ca565b905061265b83876000858560405180602001604052806000815250612718565b60008581526001602090815260408083206001600160a01b038a1684529091529020548481101561269e5760405162461bcd60e51b81526004016108a5906137fa565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611c9c565b611b60868686868686612a61565b6001600160a01b0384163b15611b605760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061276a908990899088908890889060040161383e565b6020604051808303816000875af19250505080156127a5575060408051601f3d908101601f191682019092526127a29181019061389c565b60015b612851576127b16138b9565b806308c379a0036127ea57506127c56138d5565b806127d057506127ec565b8060405162461bcd60e51b81526004016108a59190612e43565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108a5565b6001600160e01b0319811663bc197c8160e01b14611c9c5760405162461bcd60e51b81526004016108a59061395e565b60005460ff16610cc65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108a5565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061290457612904613585565b602090810291909101015292915050565b6001600160a01b0384163b15611b605760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061295990899089908890889088906004016139a6565b6020604051808303816000875af1925050508015612994575060408051601f3d908101601f191682019092526129919181019061389c565b60015b6129a0576127b16138b9565b6001600160e01b0319811663f23a6e6160e01b14611c9c5760405162461bcd60e51b81526004016108a59061395e565b60007fc2a9e343d3b594766b9e4287bd6037dded266e043bbea8845d1ab5ab2c85442282600001518360200151846040015185606001518660800151604051602001612a4496959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038516612ae85760005b8351811015612ae657828181518110612a8d57612a8d613585565b602002602001015160046000868481518110612aab57612aab613585565b602002602001015181526020019081526020016000206000828254612ad0919061362e565b90915550612adf9050816135b1565b9050612a72565b505b6001600160a01b038416611b605760005b8351811015611c9c576000848281518110612b1657612b16613585565b602002602001015190506000848381518110612b3457612b34613585565b6020026020010151905060006004600084815260200190815260200160002054905081811015612bb75760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016108a5565b60009283526004602052604090922091039055612bd3816135b1565b9050612af9565b828054612be690613439565b90600052602060002090601f016020900481019282612c085760008555612c4e565b82601f10612c2157805160ff1916838001178555612c4e565b82800160010185558215612c4e579182015b82811115612c4e578251825591602001919060010190612c33565b50612c5a929150612c5e565b5090565b5b80821115612c5a5760008155600101612c5f565b6001600160a01b038116811461095c57600080fd5b60008060408385031215612c9b57600080fd5b8235612ca681612c73565b946020939093013593505050565b6001600160e01b03198116811461095c57600080fd5b600060208284031215612cdc57600080fd5b8135610b0681612cb4565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612d2257612d22612ce7565b6040525050565b60006001600160401b03831115612d4257612d42612ce7565b604051612d59601f8501601f191660200182612cfd565b809150838152848484011115612d6e57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612d9857600080fd5b81356001600160401b03811115612dae57600080fd5b8201601f81018413612dbf57600080fd5b6119b384823560208401612d29565b600060208284031215612de057600080fd5b8135610b0681612c73565b60005b83811015612e06578181015183820152602001612dee565b83811115611e405750506000910152565b60008151808452612e2f816020860160208601612deb565b601f01601f19169290920160200192915050565b602081526000610b066020830184612e17565b600060208284031215612e6857600080fd5b5035919050565b60006001600160401b03821115612e8857612e88612ce7565b5060051b60200190565b600082601f830112612ea357600080fd5b81356020612eb082612e6f565b604051612ebd8282612cfd565b83815260059390931b8501820192828101915086841115612edd57600080fd5b8286015b84811015612ef85780358352918301918301612ee1565b509695505050505050565b600082601f830112612f1457600080fd5b610b0683833560208501612d29565b600080600080600060a08688031215612f3b57600080fd5b8535612f4681612c73565b94506020860135612f5681612c73565b935060408601356001600160401b0380821115612f7257600080fd5b612f7e89838a01612e92565b94506060880135915080821115612f9457600080fd5b612fa089838a01612e92565b93506080880135915080821115612fb657600080fd5b50612fc388828901612f03565b9150509295509295909350565b600080600060608486031215612fe557600080fd5b83359250602084013591506040840135612ffe81612c73565b809150509250925092565b6000806040838503121561301c57600080fd5b82356001600160401b038082111561303357600080fd5b818501915085601f83011261304757600080fd5b8135602061305482612e6f565b6040516130618282612cfd565b83815260059390931b850182019282810191508984111561308157600080fd5b948201945b838610156130a857853561309981612c73565b82529482019490820190613086565b965050860135925050808211156130be57600080fd5b506130cb85828601612e92565b9150509250929050565b600081518084526020808501945080840160005b83811015613105578151875295820195908201906001016130e9565b509495945050505050565b602081526000610b0660208301846130d5565b60008060006060848603121561313857600080fd5b833561314381612c73565b925060208401356001600160401b038082111561315f57600080fd5b61316b87838801612e92565b9350604086013591508082111561318157600080fd5b5061318e86828701612e92565b9150509250925092565b801515811461095c57600080fd5b600080604083850312156131b957600080fd5b82356131c481612c73565b915060208301356131d481613198565b809150509250929050565b6000806000606084860312156131f457600080fd5b83356001600160401b038082111561320b57600080fd5b61321787838801612e92565b9450602086013591508082111561322d57600080fd5b5061323a86828701612e92565b9250506040840135612ffe81612c73565b60008083601f84011261325d57600080fd5b5081356001600160401b0381111561327457600080fd5b6020830191508360208260051b850101111561328f57600080fd5b9250929050565b60008060008060008060008060c0898b0312156132b257600080fd5b88356001600160401b03808211156132c957600080fd5b6132d58c838d0161324b565b909a50985060208b01359150808211156132ee57600080fd5b506132fb8b828c0161324b565b90975095505060408901359350606089013560ff8116811461331c57600080fd5b979a969950949793969295929450505060808201359160a0013590565b6000806040838503121561334c57600080fd5b823561335781612c73565b915060208301356131d481612c73565b600080600080600060a0868803121561337f57600080fd5b853561338a81612c73565b9450602086013561339a81612c73565b9350604086013592506060860135915060808601356001600160401b038111156133c357600080fd5b612fc388828901612f03565b6000806000606084860312156133e457600080fd5b83356133ef81612c73565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061344d57607f821691505b60208210810361346d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000845160206134868285838a01612deb565b8551918401916134998184848a01612deb565b8554920191600090600181811c90808316806134b657607f831692505b85831081036134d357634e487b7160e01b85526022600452602485fd5b8080156134e757600181146134f857613525565b60ff19851688528388019550613525565b60008b81526020902060005b8581101561351d5781548a820152908401908801613504565b505083880195505b50939b9a5050505050505050505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135c3576135c361359b565b5060010190565b6000602082840312156135dc57600080fd5b8151610b0681612c73565b6000602082840312156135f957600080fd5b8151610b0681613198565b634e487b7160e01b600052601260045260246000fd5b60008261362957613629613604565b500690565b600082198211156136415761364161359b565b500190565b60008261365557613655613604565b500490565b60008282101561366c5761366c61359b565b500390565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061375b60408301856130d5565b828103602084015261376d81856130d5565b95945050505050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061386a908301866130d5565b828103606084015261387c81866130d5565b905082810360808401526138908185612e17565b98975050505050505050565b6000602082840312156138ae57600080fd5b8151610b0681612cb4565b600060033d11156138d25760046000803e5060005160e01c5b90565b600060443d10156138e35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561391257505050505090565b828501915081518181111561392a5750505050505090565b843d87010160208285010111156139445750505050505090565b61395360208286010187612cfd565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906139e090830184612e17565b97965050505050505056fea264697066735822122016702aad30d436a7a9e531379d8cba0b008744f226707dc2d62a3d4ce8b14aa064736f6c634300080d0033

Deployed Bytecode Sourcemap

101365:4844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40148:230;;;;;;;;;;-1:-1:-1;40148:230:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;40148:230:0;;;;;;;;39171:310;;;;;;;;;;-1:-1:-1;39171:310:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;39171:310:0;1038:187:1;61859:93:0;;;;;;;;;;-1:-1:-1;61859:93:0;;;;;:::i;:::-;;:::i;:::-;;105252:116;;;;;;;;;;-1:-1:-1;105252:116:0;;;;;:::i;:::-;;:::i;102193:37::-;;;;;;;;;;;;;;;;61964:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;104741:399::-;;;;;;;;;;-1:-1:-1;104741:399:0;;;;;:::i;:::-;;:::i;105504:106::-;;;;;;;;;;-1:-1:-1;105504:106:0;;;;;:::i;:::-;;:::i;101610:38::-;;;;;;;;;;;;101647:1;101610:38;;42092:439;;;;;;;;;;-1:-1:-1;42092:439:0;;;;;:::i;:::-;;:::i;101655:37::-;;;;;;;;;;;;101691:1;101655:37;;106038:168;;;;;;;;;;;;;:::i;61780:67::-;;;;;;;;;;;;;:::i;104375:161::-;;;;;;;;;;-1:-1:-1;104375:161:0;;;;;:::i;:::-;;:::i;40544:524::-;;;;;;;;;;-1:-1:-1;40544:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56626:122::-;;;;;;;;;;-1:-1:-1;56626:122:0;;;;;:::i;:::-;56683:4;56504:16;;;:12;:16;;;;;;-1:-1:-1;;;56626:122:0;101951:33;;;;;;;;;;;;;:::i;101699:37::-;;;;;;;;;;;;101735:1;101699:37;;102284:73;;;;;;;;;;-1:-1:-1;102284:73:0;;;;-1:-1:-1;;;;;102284:73:0;;;;;;-1:-1:-1;;;;;8493:32:1;;;8475:51;;8463:2;8448:18;102284:73:0;8329:203:1;37097:86:0;;;;;;;;;;-1:-1:-1;37144:4:0;37168:7;;;37097:86;;101862:82;;;;;;;;;;;;;:::i;105758:136::-;;;;;;;;;;-1:-1:-1;105758:136:0;;;;;:::i;:::-;;:::i;58542:359::-;;;;;;;;;;-1:-1:-1;58542:359:0;;;;;:::i;:::-;;:::i;101521:37::-;;;;;;;;;;;;101557:1;101521:37;;60621:103;;;;;;;;;;;;;:::i;102150:36::-;;;;;;;;;;;;;;;;105902:128;;;;;;;;;;-1:-1:-1;105902:128:0;;;;;:::i;:::-;;:::i;102237:40::-;;;;;;;;;;;;;;;;61709:63;;;;;;;;;;;;;:::i;59970:87::-;;;;;;;;;;-1:-1:-1;60043:6:0;;-1:-1:-1;;;;;60043:6:0;59970:87;;101461:47;;;;;;;;;;-1:-1:-1;101461:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;105376:120;;;;;;;;;;-1:-1:-1;105376:120:0;;;;;:::i;:::-;;:::i;62055:87::-;;;;;;;;;;;;;:::i;101993:71::-;;;;;;;;;;-1:-1:-1;101993:71:0;;;;-1:-1:-1;;;;;101993:71:0;;;41141:155;;;;;;;;;;-1:-1:-1;41141:155:0;;;;;:::i;:::-;;:::i;105618:132::-;;;;;;;;;;-1:-1:-1;105618:132:0;;;;;:::i;:::-;;:::i;104544:189::-;;;;;;;;;;-1:-1:-1;104544:189:0;;;;;:::i;:::-;;:::i;56415:113::-;;;;;;;;;;-1:-1:-1;56415:113:0;;;;;:::i;:::-;56477:7;56504:16;;;:12;:16;;;;;;;56415:113;101565:38;;;;;;;;;;;;101602:1;101565:38;;102505:1835;;;;;;:::i;:::-;;:::i;105148:96::-;;;;;;;;;;;;;:::i;41368:168::-;;;;;;;;;;-1:-1:-1;41368:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;41491:27:0;;;41467:4;41491:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;41368:168;41608:407;;;;;;;;;;-1:-1:-1;41608:407:0;;;;;:::i;:::-;;:::i;101745:110::-;;;;;;;;;;;;;:::i;60879:201::-;;;;;;;;;;-1:-1:-1;60879:201:0;;;;;:::i;:::-;;:::i;102071:72::-;;;;;;;;;;-1:-1:-1;102071:72:0;;;;-1:-1:-1;;;;;102071:72:0;;;58207:327;;;;;;;;;;-1:-1:-1;58207:327:0;;;;;:::i;:::-;;:::i;40148:230::-;40234:7;-1:-1:-1;;;;;40262:21:0;;40254:76;;;;-1:-1:-1;;;40254:76:0;;13753:2:1;40254:76:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;-1:-1:-1;;;13882:18:1;;;13875:40;13932:19;;40254:76:0;;;;;;;;;-1:-1:-1;40348:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;40348:22:0;;;;;;;;;;40148:230;;;;;:::o;39171:310::-;39273:4;-1:-1:-1;;;;;;39310:41:0;;-1:-1:-1;;;39310:41:0;;:110;;-1:-1:-1;;;;;;;39368:52:0;;-1:-1:-1;;;39368:52:0;39310:110;:163;;;-1:-1:-1;;;;;;;;;;27013:40:0;;;39437:36;26904:157;61859:93;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;61928:16:::1;61936:7;61928;:16::i;:::-;61859:93:::0;:::o;105252:116::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105330:13:::1;:30:::0;;-1:-1:-1;;;;;;105330:30:0::1;-1:-1:-1::0;;;;;105330:30:0;;;::::1;::::0;;;::::1;::::0;;105252:116::o;61964:83::-;62001:13;62034:5;62027:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61964:83;:::o;104741:399::-;56683:4;56504:16;;;:12;:16;;;;;;104810:13;;104836:70;;;;-1:-1:-1;;;104836:70:0;;14910:2:1;104836:70:0;;;14892:21:1;14949:2;14929:18;;;14922:30;14988:34;14968:18;;;14961:62;-1:-1:-1;;;15039:18:1;;;15032:39;15088:19;;104836:70:0;14708:405:1;104836:70:0;104919:28;104950:19;104960:8;104950:9;:19::i;:::-;104919:50;;105018:1;104993:14;104987:28;:32;:145;;;;;;;;;;;;;;;;;105059:14;105075:26;105092:8;105075:16;:26::i;:::-;105103:9;105042:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;104987:145;104980:152;104741:399;-1:-1:-1;;;104741:399:0:o;105504:106::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105580:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;105504:106:::0;:::o;42092:439::-;-1:-1:-1;;;;;42325:20:0;;35290:10;42325:20;;:60;;-1:-1:-1;42349:36:0;42366:4;35290:10;41368:168;:::i;42349:36::-;42303:157;;;;-1:-1:-1;;;42303:157:0;;;;;;;:::i;:::-;42471:52;42494:4;42500:2;42504:3;42509:7;42518:4;42471:22;:52::i;:::-;42092:439;;;;;:::o;106038:168::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;64316:1:::1;64914:7;;:19:::0;64906:63:::1;;;::::0;-1:-1:-1;;;64906:63:0;;17394:2:1;64906:63:0::1;::::0;::::1;17376:21:1::0;17433:2;17413:18;;;17406:30;17472:33;17452:18;;;17445:61;17523:18;;64906:63:0::1;17192:355:1::0;64906:63:0::1;64316:1;65047:7;:18:::0;106104:7:::2;106125;60043:6:::0;;-1:-1:-1;;;;;60043:6:0;;59970:87;106125:7:::2;-1:-1:-1::0;;;;;106117:21:0::2;106146;106117:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106103:69;;;106191:2;106183:11;;;::::0;::::2;;-1:-1:-1::0;64272:1:0::1;65226:7;:22:::0;106038:168::o;61780:67::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;61829:10:::1;:8;:10::i;:::-;61780:67::o:0;104375:161::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;104485:43:::1;104491:9;104502:8;104512:11;104485:43;;;;;;;;;;;::::0;:5:::1;:43::i;:::-;104375:161:::0;;;:::o;40544:524::-;40700:16;40761:3;:10;40742:8;:15;:29;40734:83;;;;-1:-1:-1;;;40734:83:0;;17964:2:1;40734:83:0;;;17946:21:1;18003:2;17983:18;;;17976:30;18042:34;18022:18;;;18015:62;-1:-1:-1;;;18093:18:1;;;18086:39;18142:19;;40734:83:0;17762:405:1;40734:83:0;40830:30;40877:8;:15;-1:-1:-1;;;;;40863:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40863:30:0;;40830:63;;40911:9;40906:122;40930:8;:15;40926:1;:19;40906:122;;;40986:30;40996:8;41005:1;40996:11;;;;;;;;:::i;:::-;;;;;;;41009:3;41013:1;41009:6;;;;;;;;:::i;:::-;;;;;;;40986:9;:30::i;:::-;40967:13;40981:1;40967:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;40947:3;;;:::i;:::-;;;40906:122;;;-1:-1:-1;41047:13:0;40544:524;-1:-1:-1;;;40544:524:0:o;101951:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;101862:82::-;;;;;;;:::i;105758:136::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105846:18:::1;:40:::0;105758:136::o;58542:359::-;-1:-1:-1;;;;;58707:23:0;;35290:10;58707:23;;:66;;-1:-1:-1;58734:39:0;58751:7;35290:10;41368:168;:::i;58734:39::-;58685:163;;;;-1:-1:-1;;;58685:163:0;;;;;;;:::i;:::-;58861:32;58872:7;58881:3;58886:6;58861:10;:32::i;60621:103::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;60686:30:::1;60713:1;60686:18;:30::i;105902:128::-:0;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105986:16:::1;:36:::0;105902:128::o;61709:63::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;61756:8:::1;:6;:8::i;105376:120::-:0;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105459:29;;::::1;::::0;:11:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;62055:87::-:0;62094:13;62127:7;62120:14;;;;;:::i;41141:155::-;41236:52;35290:10;41269:8;41279;41236:18;:52::i;105618:132::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;105704:17:::1;:38:::0;105618:132::o;104544:189::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;104677:48:::1;104688:9;104699:8;104709:11;104677:48;;;;;;;;;;;::::0;:10:::1;:48::i;102505:1835::-:0;36702:19;:17;:19::i;:::-;102704:11:::1;::::0;102754:12:::1;::::0;102873:13:::1;::::0;102824:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;102704:11:0;;::::1;::::0;102754:12;;::::1;::::0;102873:13;;::::1;::::0;102824:45:::1;::::0;102834:12;;102824:45;;;;;::::1;::::0;102834:12;;102824:45;102834:12;102824:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;102848:11:0;;-1:-1:-1;102861:1:0;;-1:-1:-1;102864:1:0;;-1:-1:-1;102867:1:0;102824:9:::1;:45::i;:::-;-1:-1:-1::0;;;;;102824:62:0::1;;102816:93;;;::::0;-1:-1:-1;;;102816:93:0;;18778:2:1;102816:93:0::1;::::0;::::1;18760:21:1::0;18817:2;18797:18;;;18790:30;-1:-1:-1;;;18836:18:1;;;18829:48;18894:18;;102816:93:0::1;18576:342:1::0;102816:93:0::1;102953:17;::::0;102930:40;::::1;102922:96;;;::::0;-1:-1:-1;;;102922:96:0;;19125:2:1;102922:96:0::1;::::0;::::1;19107:21:1::0;19164:2;19144:18;;;19137:30;19203:34;19183:18;;;19176:62;-1:-1:-1;;;19254:18:1;;;19247:41;19305:19;;102922:96:0::1;18923:407:1::0;102922:96:0::1;103062:18;::::0;103038:42;::::1;103030:99;;;::::0;-1:-1:-1;;;103030:99:0;;19537:2:1;103030:99:0::1;::::0;::::1;19519:21:1::0;19576:2;19556:18;;;19549:30;19615:34;19595:18;;;19588:62;-1:-1:-1;;;19666:18:1;;;19659:42;19718:19;;103030:99:0::1;19335:408:1::0;103030:99:0::1;103148:6;103143:388;103164:18;;103160:1;:22;103143:388;;;103253:10;-1:-1:-1::0;;;;;103211:20:0;::::1;;103232:13:::0;;103246:1;103232:16;;::::1;;;;;:::i;:::-;;;;;;;103211:38;;;;;;;;;;;;;616:25:1::0;;604:2;589:18;;470:177;103211:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;103211:52:0::1;;103203:95;;;::::0;-1:-1:-1;;;103203:95:0;;20206:2:1;103203:95:0::1;::::0;::::1;20188:21:1::0;20245:2;20225:18;;;20218:30;20284:32;20264:18;;;20257:60;20334:18;;103203:95:0::1;20004:354:1::0;103203:95:0::1;103323:14;:32;103338:13;;103352:1;103338:16;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;103323:32:::0;;-1:-1:-1;103323:32:0;::::1;::::0;;;;;;-1:-1:-1;103323:32:0;;::::1;;:41;103315:90;;;::::0;-1:-1:-1;;;103315:90:0;;20565:2:1;103315:90:0::1;::::0;::::1;20547:21:1::0;20604:2;20584:18;;;20577:30;20643:34;20623:18;;;20616:62;-1:-1:-1;;;20694:18:1;;;20687:34;20738:19;;103315:90:0::1;20363:400:1::0;103315:90:0::1;103515:4;103480:14;:32;103495:13;;103509:1;103495:16;;;;;;;:::i;:::-;;;;;;;103480:32;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;103184:3;;;;;:::i;:::-;;;;103143:388;;;;103556:6;103551:410;103572:17;;103568:1;:21;103551:410;;;103700:4;-1:-1:-1::0;;;;;103648:23:0;::::1;;103672:12:::0;;103685:1;103672:15;;::::1;;;;;:::i;:::-;;;;;;;103648:40;;;;;;;;;;;;;616:25:1::0;;604:2;589:18;;470:177;103648:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;103648:57:0::1;;:124;;;-1:-1:-1::0;103709:55:0::1;::::0;-1:-1:-1;;;103709:55:0;;103738:10:::1;103709:55;::::0;::::1;20980:34:1::0;103758:4:0::1;21030:18:1::0;;;21023:43;-1:-1:-1;;;;;103709:28:0;::::1;::::0;::::1;::::0;20915:18:1;;103709:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;103768:4;103709:63;103648:124;103640:171;;;::::0;-1:-1:-1;;;103640:171:0;;21529:2:1;103640:171:0::1;::::0;::::1;21511:21:1::0;21568:2;21548:18;;;21541:30;21607:34;21587:18;;;21580:62;-1:-1:-1;;;21658:18:1;;;21651:32;21700:19;;103640:171:0::1;21327:398:1::0;103640:171:0::1;103847:11;-1:-1:-1::0;;;;;103847:28:0::1;;103876:10;103888:42;103933:12;;103946:1;103933:15;;;;;;;:::i;:::-;103847:102;::::0;-1:-1:-1;;;;;;103847:102:0::1;::::0;;;;;;-1:-1:-1;;;;;21988:15:1;;;103847:102:0::1;::::0;::::1;21970:34:1::0;22040:15;;;;22020:18;;;22013:43;-1:-1:-1;103933:15:0::1;::::0;;::::1;;;22072:18:1::0;;;22065:34;21905:18;;103847:102:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;103591:3;;;;;:::i;:::-;;;;103551:410;;;-1:-1:-1::0;104035:62:0::1;::::0;;104052:15:::1;104035:62;::::0;::::1;22295:19:1::0;-1:-1:-1;;104069:10:0::1;22352:2:1::0;22348:15;22344:53;22330:12;;;22323:75;;;;104080:16:0::1;22414:12:1::0;;;22407:28;103993:20:0::1;::::0;22451:12:1;;104035:62:0::1;::::0;;-1:-1:-1;;104035:62:0;;::::1;::::0;;;;;;104025:73;;104035:62:::1;104025:73:::0;;::::1;::::0;;-1:-1:-1;104126:18:0::1;104141:3;104025:73:::0;104126:18:::1;:::i;:::-;104125:24;::::0;104148:1:::1;104125:24;:::i;:::-;104110:39;;104162:14;104179:36;104189:11;104202:12;104179:9;:36::i;:::-;104162:53;;104242:32;104248:10;104260:6;104268:1;104242:32;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;104292:27;::::0;104312:6;;104300:10:::1;::::0;104292:27:::1;::::0;;;::::1;102667:1673;;;;102505:1835:::0;;;;;;;;:::o;105148:96::-;105192:13;105225:11;105218:18;;;;;:::i;41608:407::-;-1:-1:-1;;;;;41816:20:0;;35290:10;41816:20;;:60;;-1:-1:-1;41840:36:0;41857:4;35290:10;41368:168;:::i;41840:36::-;41794:157;;;;-1:-1:-1;;;41794:157:0;;;;;;;:::i;:::-;41962:45;41980:4;41986:2;41990;41994:6;42002:4;41962:17;:45::i;101745:110::-;;;;;;;:::i;60879:201::-;60043:6;;-1:-1:-1;;;;;60043:6:0;35290:10;60190:23;60182:68;;;;-1:-1:-1;;;60182:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60968:22:0;::::1;60960:73;;;::::0;-1:-1:-1;;;60960:73:0;;23058:2:1;60960:73:0::1;::::0;::::1;23040:21:1::0;23097:2;23077:18;;;23070:30;23136:34;23116:18;;;23109:62;-1:-1:-1;;;23187:18:1;;;23180:36;23233:19;;60960:73:0::1;22856:402:1::0;60960:73:0::1;61044:28;61063:8;61044:18;:28::i;58207:327::-:0;-1:-1:-1;;;;;58347:23:0;;35290:10;58347:23;;:66;;-1:-1:-1;58374:39:0;58391:7;35290:10;41368:168;:::i;58374:39::-;58325:163;;;;-1:-1:-1;;;58325:163:0;;;;;;;:::i;:::-;58501:25;58507:7;58516:2;58520:5;58501;:25::i;46317:88::-;46384:13;;;;:4;;:13;;;;;:::i;39892:105::-;39952:13;39985:4;39978:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39892:105;;;:::o;65628:723::-;65684:13;65905:5;65914:1;65905:10;65901:53;;-1:-1:-1;;65932:10:0;;;;;;;;;;;;-1:-1:-1;;;65932:10:0;;;;;65628:723::o;65901:53::-;65979:5;65964:12;66020:78;66027:9;;66020:78;;66053:8;;;;:::i;:::-;;-1:-1:-1;66076:10:0;;-1:-1:-1;66084:2:0;66076:10;;:::i;:::-;;;66020:78;;;66108:19;66140:6;-1:-1:-1;;;;;66130:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66130:17:0;;66108:39;;66158:154;66165:10;;66158:154;;66192:11;66202:1;66192:11;;:::i;:::-;;-1:-1:-1;66261:10:0;66269:2;66261:5;:10;:::i;:::-;66248:24;;:2;:24;:::i;:::-;66235:39;;66218:6;66225;66218:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;66218:56:0;;;;;;;;-1:-1:-1;66289:11:0;66298:2;66289:11;;:::i;:::-;;;66158:154;;;66336:6;65628:723;-1:-1:-1;;;;65628:723:0:o;44327:1146::-;44554:7;:14;44540:3;:10;:28;44532:81;;;;-1:-1:-1;;;44532:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44632:16:0;;44624:66;;;;-1:-1:-1;;;44624:66:0;;;;;;;:::i;:::-;35290:10;44747:60;35290:10;44778:4;44784:2;44788:3;44793:7;44802:4;44747:20;:60::i;:::-;44825:9;44820:421;44844:3;:10;44840:1;:14;44820:421;;;44876:10;44889:3;44893:1;44889:6;;;;;;;;:::i;:::-;;;;;;;44876:19;;44910:14;44927:7;44935:1;44927:10;;;;;;;;:::i;:::-;;;;;;;;;;;;44954:19;44976:13;;;:9;:13;;;;;;-1:-1:-1;;;;;44976:19:0;;;;;;;;;;;;44927:10;;-1:-1:-1;45018:21:0;;;;45010:76;;;;-1:-1:-1;;;45010:76:0;;;;;;;:::i;:::-;45130:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;45130:19:0;;;;;;;;;;45152:20;;;45130:42;;45202:17;;;;;;;:27;;45152:20;;45130:13;45202:27;;45152:20;;45202:27;:::i;:::-;;;;;;;;44861:380;;;44856:3;;;;:::i;:::-;;;44820:421;;;;45288:2;-1:-1:-1;;;;;45258:47:0;45282:4;-1:-1:-1;;;;;45258:47:0;45272:8;-1:-1:-1;;;;;45258:47:0;;45292:3;45297:7;45258:47;;;;;;;:::i;:::-;;;;;;;;45390:75;45426:8;45436:4;45442:2;45446:3;45451:7;45460:4;45390:35;:75::i;:::-;44521:952;44327:1146;;;;;:::o;37952:120::-;36961:16;:14;:16::i;:::-;38021:5:::1;38011:15:::0;;-1:-1:-1;;38011:15:0::1;::::0;;38042:22:::1;35290:10:::0;38051:12:::1;38042:22;::::0;-1:-1:-1;;;;;8493:32:1;;;8475:51;;8463:2;8448:18;38042:22:0::1;;;;;;;37952:120::o:0;46791:729::-;-1:-1:-1;;;;;46944:16:0;;46936:62;;;;-1:-1:-1;;;46936:62:0;;;;;;;:::i;:::-;35290:10;47011:16;47076:21;47094:2;47076:17;:21::i;:::-;47053:44;;47108:24;47135:25;47153:6;47135:17;:25::i;:::-;47108:52;;47173:66;47194:8;47212:1;47216:2;47220:3;47225:7;47234:4;47173:20;:66::i;:::-;47252:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;47252:17:0;;;;;;;;;:27;;47273:6;;47252:13;:27;;47273:6;;47252:27;:::i;:::-;;;;-1:-1:-1;;47295:52:0;;;25790:25:1;;;25846:2;25831:18;;25824:34;;;-1:-1:-1;;;;;47295:52:0;;;;47328:1;;47295:52;;;;;;25763:18:1;47295:52:0;;;;;;;47438:74;47469:8;47487:1;47491:2;47495;47499:6;47507:4;47438:30;:74::i;:::-;46925:595;;;46791:729;;;;:::o;50092:969::-;-1:-1:-1;;;;;50244:18:0;;50236:66;;;;-1:-1:-1;;;50236:66:0;;;;;;;:::i;:::-;50335:7;:14;50321:3;:10;:28;50313:81;;;;-1:-1:-1;;;50313:81:0;;;;;;;:::i;:::-;50407:16;35290:10;50407:31;;50451:66;50472:8;50482:4;50496:1;50500:3;50505:7;50451:66;;;;;;;;;;;;:20;:66::i;:::-;50535:9;50530:373;50554:3;:10;50550:1;:14;50530:373;;;50586:10;50599:3;50603:1;50599:6;;;;;;;;:::i;:::-;;;;;;;50586:19;;50620:14;50637:7;50645:1;50637:10;;;;;;;;:::i;:::-;;;;;;;;;;;;50664:19;50686:13;;;:9;:13;;;;;;-1:-1:-1;;;;;50686:19:0;;;;;;;;;;;;50637:10;;-1:-1:-1;50728:21:0;;;;50720:70;;;;-1:-1:-1;;;50720:70:0;;;;;;;:::i;:::-;50834:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;50834:19:0;;;;;;;;;;50856:20;;50834:42;;50566:3;;;;:::i;:::-;;;;50530:373;;;;50958:1;-1:-1:-1;;;;;50920:55:0;50944:4;-1:-1:-1;;;;;50920:55:0;50934:8;-1:-1:-1;;;;;50920:55:0;;50962:3;50967:7;50920:55;;;;;;;:::i;:::-;;;;;;;;50988:65;;;;;;;;;51032:1;50988:65;;;50225:836;50092:969;;;:::o;61240:191::-;61333:6;;;-1:-1:-1;;;;;61350:17:0;;;-1:-1:-1;;;;;;61350:17:0;;;;;;;61383:40;;61333:6;;;61350:17;61333:6;;61383:40;;61314:16;;61383:40;61303:128;61240:191;:::o;37693:118::-;36702:19;:17;:19::i;:::-;37753:7:::1;:14:::0;;-1:-1:-1;;37753:14:0::1;37763:4;37753:14;::::0;;37783:20:::1;37790:12;35290:10:::0;;35210:98;51204:331;51359:8;-1:-1:-1;;;;;51350:17:0;:5;-1:-1:-1;;;;;51350:17:0;;51342:71;;;;-1:-1:-1;;;51342:71:0;;26880:2:1;51342:71:0;;;26862:21:1;26919:2;26899:18;;;26892:30;26958:34;26938:18;;;26931:62;-1:-1:-1;;;27009:18:1;;;27002:39;27058:19;;51342:71:0;26678:405:1;51342:71:0;-1:-1:-1;;;;;51424:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;51424:46:0;;;;;;;;;;51486:41;;1178::1;;;51486::0;;1151:18:1;51486:41:0;;;;;;;51204:331;;;:::o;47923:813::-;-1:-1:-1;;;;;48101:16:0;;48093:62;;;;-1:-1:-1;;;48093:62:0;;;;;;;:::i;:::-;48188:7;:14;48174:3;:10;:28;48166:81;;;;-1:-1:-1;;;48166:81:0;;;;;;;:::i;:::-;35290:10;48304:66;35290:10;48260:16;48347:2;48351:3;48356:7;48365:4;48304:20;:66::i;:::-;48388:9;48383:103;48407:3;:10;48403:1;:14;48383:103;;;48464:7;48472:1;48464:10;;;;;;;;:::i;:::-;;;;;;;48439:9;:17;48449:3;48453:1;48449:6;;;;;;;;:::i;:::-;;;;;;;48439:17;;;;;;;;;;;:21;48457:2;-1:-1:-1;;;;;48439:21:0;-1:-1:-1;;;;;48439:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;48419:3:0;;-1:-1:-1;48419:3:0;;;:::i;:::-;;;;48383:103;;;;48539:2;-1:-1:-1;;;;;48503:53:0;48535:1;-1:-1:-1;;;;;48503:53:0;48517:8;-1:-1:-1;;;;;48503:53:0;;48543:3;48548:7;48503:53;;;;;;;:::i;:::-;;;;;;;;48647:81;48683:8;48701:1;48705:2;48709:3;48714:7;48723:4;48647:35;:81::i;37256:108::-;37144:4;37168:7;;;37326:9;37318:38;;;;-1:-1:-1;;;37318:38:0;;27290:2:1;37318:38:0;;;27272:21:1;27329:2;27309:18;;;27302:30;-1:-1:-1;;;27348:18:1;;;27341:46;27404:18;;37318:38:0;27088:340:1;7419:543:0;7546:7;7568:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7568:15:0;7607:7;7615:1;7607:10;;;;;;;;:::i;:::-;;;;;;;7594:1;:10;;:23;;;;;7641:7;7649:1;7641:10;;;;;;;;:::i;:::-;;;;;;;7628:1;:10;;:23;;;;;7675:7;7683:1;7675:10;;;;;;;;:::i;:::-;;;;;;;7662:1;:10;;:23;;;;;7709:7;7717:1;7709:10;;;;;;;;:::i;:::-;;;;;;;;;;;7696;;;:23;7730:12;;;:25;;;7859:16;;-1:-1:-1;;7890:7:0;7696:1;7890:4;:7::i;:::-;7803:105;;-1:-1:-1;;;7803:105:0;;;27691:27:1;27734:11;;;27727:27;;;;27770:12;;;27763:28;27807:12;;7803:105:0;;;-1:-1:-1;;7803:105:0;;;;;;;;;7793:116;;7803:105;7793:116;;;;7927:26;;;;;;;;;28057:25:1;;;28130:4;28118:17;;28098:18;;;28091:45;;;;28152:18;;;28145:34;;;28195:18;;;28188:34;;;7793:116:0;-1:-1:-1;7927:26:0;;28029:19:1;;7927:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7927:26:0;;-1:-1:-1;;7927:26:0;;;7419:543;-1:-1:-1;;;;;;;;;7419:543:0:o;90:1925::-;184:7;233;218:11;:22;214:66;;-1:-1:-1;267:1:0;260:8;;214:66;310:5;296:11;:19;292:535;;;352:1;335:13;:18;331:66;;-1:-1:-1;380:1:0;373:8;;331:66;432:1;415:13;:18;;:41;;;;;454:2;437:13;:19;;415:41;411:90;;;-1:-1:-1;484:1:0;477:8;;411:90;536:2;519:13;:19;;:42;;;;;559:2;542:13;:19;;519:42;515:91;;;-1:-1:-1;589:1:0;582:8;;515:91;641:2;624:13;:19;;:42;;;;;664:2;647:13;:19;;624:42;620:91;;;-1:-1:-1;694:1:0;687:8;;620:91;746:2;729:13;:19;;:43;;;;;769:3;752:13;:20;;729:43;725:91;;;-1:-1:-1;799:1:0;792:8;;725:91;856:5;841:11;:20;;:43;;;;;879:5;865:11;:19;;841:43;837:559;;;921:1;904:13;:18;900:66;;-1:-1:-1;949:1:0;942:8;;900:66;1001:1;984:13;:18;;:41;;;;;1023:2;1006:13;:19;;984:41;980:90;;;-1:-1:-1;1053:1:0;1046:8;;980:90;1105:2;1088:13;:19;;:42;;;;;1128:2;1111:13;:19;;1088:42;1084:91;;;-1:-1:-1;1158:1:0;1151:8;;1084:91;1210:2;1193:13;:19;;:42;;;;;1233:2;1216:13;:19;;1193:42;1189:91;;;-1:-1:-1;1263:1:0;1256:8;;1189:91;1315:2;1298:13;:19;;:43;;;;;1338:3;1321:13;:20;;1298:43;1294:91;;;-1:-1:-1;1368:1:0;1361:8;;1294:91;1425:5;1410:11;:20;;:44;;;;;1448:6;1434:11;:20;;1410:44;1406:353;;;1491:2;1474:13;:19;1470:67;;-1:-1:-1;1520:1:0;1513:8;;1470:67;1572:2;1555:13;:19;;:42;;;;;1595:2;1578:13;:19;;1555:42;1551:91;;;-1:-1:-1;1625:1:0;1618:8;;1551:91;1677:2;1660:13;:19;;:43;;;;;1700:3;1683:13;:20;;1660:43;1656:92;;;-1:-1:-1;1731:1:0;1724:8;;1656:92;1788:6;1773:11;:21;1769:226;;1832:2;1815:13;:19;1811:67;;-1:-1:-1;1861:1:0;1854:8;;1811:67;1913:2;1896:13;:19;;:43;;;;;1936:3;1919:13;:20;;1896:43;1892:92;;;-1:-1:-1;1967:1:0;1960:8;;42995:974;-1:-1:-1;;;;;43183:16:0;;43175:66;;;;-1:-1:-1;;;43175:66:0;;;;;;;:::i;:::-;35290:10;43254:16;43319:21;43337:2;43319:17;:21::i;:::-;43296:44;;43351:24;43378:25;43396:6;43378:17;:25::i;:::-;43351:52;;43416:60;43437:8;43447:4;43453:2;43457:3;43462:7;43471:4;43416:20;:60::i;:::-;43489:19;43511:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43511:19:0;;;;;;;;;;43549:21;;;;43541:76;;;;-1:-1:-1;;;43541:76:0;;;;;;;:::i;:::-;43653:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43653:19:0;;;;;;;;;;43675:20;;;43653:42;;43717:17;;;;;;;:27;;43675:20;;43653:13;43717:27;;43675:20;;43717:27;:::i;:::-;;;;-1:-1:-1;;43762:46:0;;;25790:25:1;;;25846:2;25831:18;;25824:34;;;-1:-1:-1;;;;;43762:46:0;;;;;;;;;;;;;;25763:18:1;43762:46:0;;;;;;;43893:68;43924:8;43934:4;43940:2;43944;43948:6;43956:4;43893:30;:68::i;:::-;43164:805;;;;42995:974;;;;;:::o;49034:808::-;-1:-1:-1;;;;;49161:18:0;;49153:66;;;;-1:-1:-1;;;49153:66:0;;;;;;;:::i;:::-;35290:10;49232:16;49297:21;49315:2;49297:17;:21::i;:::-;49274:44;;49329:24;49356:25;49374:6;49356:17;:25::i;:::-;49329:52;;49394:66;49415:8;49425:4;49439:1;49443:3;49448:7;49394:66;;;;;;;;;;;;:20;:66::i;:::-;49473:19;49495:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;49495:19:0;;;;;;;;;;49533:21;;;;49525:70;;;;-1:-1:-1;;;49525:70:0;;;;;;;:::i;:::-;49631:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;49631:19:0;;;;;;;;;;;;49653:20;;;49631:42;;49702:54;;25790:25:1;;;25831:18;;;25824:34;;;49631:19:0;;49702:54;;;;;;25763:18:1;49702:54:0;;;;;;;49769:65;;;;;;;;;49813:1;49769:65;;;44327:1146;62160:337;62423:66;62450:8;62460:4;62466:2;62470:3;62475:7;62484:4;62423:26;:66::i;54649:813::-;-1:-1:-1;;;;;54889:13:0;;9501:19;:23;54885:570;;54925:79;;-1:-1:-1;;;54925:79:0;;-1:-1:-1;;;;;54925:43:0;;;;;:79;;54969:8;;54979:4;;54985:3;;54990:7;;54999:4;;54925:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54925:79:0;;;;;;;;-1:-1:-1;;54925:79:0;;;;;;;;;;;;:::i;:::-;;;54921:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55317:6;55310:14;;-1:-1:-1;;;55310:14:0;;;;;;;;:::i;54921:523::-;;;55366:62;;-1:-1:-1;;;55366:62:0;;30381:2:1;55366:62:0;;;30363:21:1;30420:2;30400:18;;;30393:30;30459:34;30439:18;;;30432:62;-1:-1:-1;;;30510:18:1;;;30503:50;30570:19;;55366:62:0;30179:416:1;54921:523:0;-1:-1:-1;;;;;;55086:60:0;;-1:-1:-1;;;55086:60:0;55082:159;;55171:50;;-1:-1:-1;;;55171:50:0;;;;;;;:::i;37441:108::-;37144:4;37168:7;;;37500:41;;;;-1:-1:-1;;;37500:41:0;;31211:2:1;37500:41:0;;;31193:21:1;31250:2;31230:18;;;31223:30;-1:-1:-1;;;31269:18:1;;;31262:50;31329:18;;37500:41:0;31009:344:1;55470:198:0;55590:16;;;55604:1;55590:16;;;;;;;;;55536;;55565:22;;55590:16;;;;;;;;;;;;-1:-1:-1;55590:16:0;55565:41;;55628:7;55617:5;55623:1;55617:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;55655:5;55470:198;-1:-1:-1;;55470:198:0:o;53897:744::-;-1:-1:-1;;;;;54112:13:0;;9501:19;:23;54108:526;;54148:72;;-1:-1:-1;;;54148:72:0;;-1:-1:-1;;;;;54148:38:0;;;;;:72;;54187:8;;54197:4;;54203:2;;54207:6;;54215:4;;54148:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54148:72:0;;;;;;;;-1:-1:-1;;54148:72:0;;;;;;;;;;;;:::i;:::-;;;54144:479;;;;:::i;:::-;-1:-1:-1;;;;;;54270:55:0;;-1:-1:-1;;;54270:55:0;54266:154;;54350:50;;-1:-1:-1;;;54350:50:0;;;;;;;:::i;7107:304::-;7166:7;6359:123;7254:6;:15;;;7284:6;:15;;;7314:6;:15;;;7344:6;:15;;;7374:6;:17;;;7203:199;;;;;;;;;;;;32211:25:1;;;32267:2;32252:18;;32245:34;;;;32310:2;32295:18;;32288:34;;;;32353:2;32338:18;;32331:34;32396:3;32381:19;;32374:35;32440:3;32425:19;;32418:35;32198:3;32183:19;;31924:535;7203:199:0;;;;;;;;;;;;;7193:210;;;;;;7186:217;;7107:304;;;:::o;56823:931::-;-1:-1:-1;;;;;57145:18:0;;57141:160;;57185:9;57180:110;57204:3;:10;57200:1;:14;57180:110;;;57264:7;57272:1;57264:10;;;;;;;;:::i;:::-;;;;;;;57240:12;:20;57253:3;57257:1;57253:6;;;;;;;;:::i;:::-;;;;;;;57240:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;57216:3:0;;-1:-1:-1;57216:3:0;;:::i;:::-;;;57180:110;;;;57141:160;-1:-1:-1;;;;;57317:16:0;;57313:434;;57355:9;57350:386;57374:3;:10;57370:1;:14;57350:386;;;57410:10;57423:3;57427:1;57423:6;;;;;;;;:::i;:::-;;;;;;;57410:19;;57448:14;57465:7;57473:1;57465:10;;;;;;;;:::i;:::-;;;;;;;57448:27;;57494:14;57511:12;:16;57524:2;57511:16;;;;;;;;;;;;57494:33;;57564:6;57554;:16;;57546:69;;;;-1:-1:-1;;;57546:69:0;;32666:2:1;57546:69:0;;;32648:21:1;32705:2;32685:18;;;32678:30;32744:34;32724:18;;;32717:62;-1:-1:-1;;;32795:18:1;;;32788:38;32843:19;;57546:69:0;32464:404:1;57546:69:0;57667:16;;;;:12;:16;;;;;;57686:15;;57667:34;;57386:3;;;:::i;:::-;;;57350:386;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:127::-;1291:10;1286:3;1282:20;1279:1;1272:31;1322:4;1319:1;1312:15;1346:4;1343:1;1336:15;1362:249;1472:2;1453:13;;-1:-1:-1;;1449:27:1;1437:40;;-1:-1:-1;;;;;1492:34:1;;1528:22;;;1489:62;1486:88;;;1554:18;;:::i;:::-;1590:2;1583:22;-1:-1:-1;;1362:249:1:o;1616:469::-;1681:5;-1:-1:-1;;;;;1707:6:1;1704:30;1701:56;;;1737:18;;:::i;:::-;1786:2;1780:9;1798:69;1855:2;1834:15;;-1:-1:-1;;1830:29:1;1861:4;1826:40;1780:9;1798:69;:::i;:::-;1885:6;1876:15;;1915:6;1907;1900:22;1955:3;1946:6;1941:3;1937:16;1934:25;1931:45;;;1972:1;1969;1962:12;1931:45;2022:6;2017:3;2010:4;2002:6;1998:17;1985:44;2077:1;2070:4;2061:6;2053;2049:19;2045:30;2038:41;;1616:469;;;;;:::o;2090:451::-;2159:6;2212:2;2200:9;2191:7;2187:23;2183:32;2180:52;;;2228:1;2225;2218:12;2180:52;2268:9;2255:23;-1:-1:-1;;;;;2293:6:1;2290:30;2287:50;;;2333:1;2330;2323:12;2287:50;2356:22;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:1;;2438:1;2435;2428:12;2387:55;2461:74;2527:7;2522:2;2509:16;2504:2;2500;2496:11;2461:74;:::i;2546:247::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;2798:258::-;2870:1;2880:113;2894:6;2891:1;2888:13;2880:113;;;2970:11;;;2964:18;2951:11;;;2944:39;2916:2;2909:10;2880:113;;;3011:6;3008:1;3005:13;3002:48;;;-1:-1:-1;;3046:1:1;3028:16;;3021:27;2798:258::o;3061:::-;3103:3;3141:5;3135:12;3168:6;3163:3;3156:19;3184:63;3240:6;3233:4;3228:3;3224:14;3217:4;3210:5;3206:16;3184:63;:::i;:::-;3301:2;3280:15;-1:-1:-1;;3276:29:1;3267:39;;;;3308:4;3263:50;;3061:258;-1:-1:-1;;3061:258:1:o;3324:220::-;3473:2;3462:9;3455:21;3436:4;3493:45;3534:2;3523:9;3519:18;3511:6;3493:45;:::i;3549:180::-;3608:6;3661:2;3649:9;3640:7;3636:23;3632:32;3629:52;;;3677:1;3674;3667:12;3629:52;-1:-1:-1;3700:23:1;;3549:180;-1:-1:-1;3549:180:1:o;3734:183::-;3794:4;-1:-1:-1;;;;;3819:6:1;3816:30;3813:56;;;3849:18;;:::i;:::-;-1:-1:-1;3894:1:1;3890:14;3906:4;3886:25;;3734:183::o;3922:724::-;3976:5;4029:3;4022:4;4014:6;4010:17;4006:27;3996:55;;4047:1;4044;4037:12;3996:55;4083:6;4070:20;4109:4;4132:43;4172:2;4132:43;:::i;:::-;4204:2;4198:9;4216:31;4244:2;4236:6;4216:31;:::i;:::-;4282:18;;;4374:1;4370:10;;;;4358:23;;4354:32;;;4316:15;;;;-1:-1:-1;4398:15:1;;;4395:35;;;4426:1;4423;4416:12;4395:35;4462:2;4454:6;4450:15;4474:142;4490:6;4485:3;4482:15;4474:142;;;4556:17;;4544:30;;4594:12;;;;4507;;4474:142;;;-1:-1:-1;4634:6:1;3922:724;-1:-1:-1;;;;;;3922:724:1:o;4651:221::-;4693:5;4746:3;4739:4;4731:6;4727:17;4723:27;4713:55;;4764:1;4761;4754:12;4713:55;4786:80;4862:3;4853:6;4840:20;4833:4;4825:6;4821:17;4786:80;:::i;4877:1071::-;5031:6;5039;5047;5055;5063;5116:3;5104:9;5095:7;5091:23;5087:33;5084:53;;;5133:1;5130;5123:12;5084:53;5172:9;5159:23;5191:31;5216:5;5191:31;:::i;:::-;5241:5;-1:-1:-1;5298:2:1;5283:18;;5270:32;5311:33;5270:32;5311:33;:::i;:::-;5363:7;-1:-1:-1;5421:2:1;5406:18;;5393:32;-1:-1:-1;;;;;5474:14:1;;;5471:34;;;5501:1;5498;5491:12;5471:34;5524:61;5577:7;5568:6;5557:9;5553:22;5524:61;:::i;:::-;5514:71;;5638:2;5627:9;5623:18;5610:32;5594:48;;5667:2;5657:8;5654:16;5651:36;;;5683:1;5680;5673:12;5651:36;5706:63;5761:7;5750:8;5739:9;5735:24;5706:63;:::i;:::-;5696:73;;5822:3;5811:9;5807:19;5794:33;5778:49;;5852:2;5842:8;5839:16;5836:36;;;5868:1;5865;5858:12;5836:36;;5891:51;5934:7;5923:8;5912:9;5908:24;5891:51;:::i;:::-;5881:61;;;4877:1071;;;;;;;;:::o;5953:383::-;6030:6;6038;6046;6099:2;6087:9;6078:7;6074:23;6070:32;6067:52;;;6115:1;6112;6105:12;6067:52;6151:9;6138:23;6128:33;;6208:2;6197:9;6193:18;6180:32;6170:42;;6262:2;6251:9;6247:18;6234:32;6275:31;6300:5;6275:31;:::i;:::-;6325:5;6315:15;;;5953:383;;;;;:::o;6341:1277::-;6459:6;6467;6520:2;6508:9;6499:7;6495:23;6491:32;6488:52;;;6536:1;6533;6526:12;6488:52;6576:9;6563:23;-1:-1:-1;;;;;6646:2:1;6638:6;6635:14;6632:34;;;6662:1;6659;6652:12;6632:34;6700:6;6689:9;6685:22;6675:32;;6745:7;6738:4;6734:2;6730:13;6726:27;6716:55;;6767:1;6764;6757:12;6716:55;6803:2;6790:16;6825:4;6848:43;6888:2;6848:43;:::i;:::-;6920:2;6914:9;6932:31;6960:2;6952:6;6932:31;:::i;:::-;6998:18;;;7086:1;7082:10;;;;7074:19;;7070:28;;;7032:15;;;;-1:-1:-1;7110:19:1;;;7107:39;;;7142:1;7139;7132:12;7107:39;7166:11;;;;7186:217;7202:6;7197:3;7194:15;7186:217;;;7282:3;7269:17;7299:31;7324:5;7299:31;:::i;:::-;7343:18;;7219:12;;;;7381;;;;7186:217;;;7422:6;-1:-1:-1;;7466:18:1;;7453:32;;-1:-1:-1;;7497:16:1;;;7494:36;;;7526:1;7523;7516:12;7494:36;;7549:63;7604:7;7593:8;7582:9;7578:24;7549:63;:::i;:::-;7539:73;;;6341:1277;;;;;:::o;7623:435::-;7676:3;7714:5;7708:12;7741:6;7736:3;7729:19;7767:4;7796:2;7791:3;7787:12;7780:19;;7833:2;7826:5;7822:14;7854:1;7864:169;7878:6;7875:1;7872:13;7864:169;;;7939:13;;7927:26;;7973:12;;;;8008:15;;;;7900:1;7893:9;7864:169;;;-1:-1:-1;8049:3:1;;7623:435;-1:-1:-1;;;;;7623:435:1:o;8063:261::-;8242:2;8231:9;8224:21;8205:4;8262:56;8314:2;8303:9;8299:18;8291:6;8262:56;:::i;8537:730::-;8664:6;8672;8680;8733:2;8721:9;8712:7;8708:23;8704:32;8701:52;;;8749:1;8746;8739:12;8701:52;8788:9;8775:23;8807:31;8832:5;8807:31;:::i;:::-;8857:5;-1:-1:-1;8913:2:1;8898:18;;8885:32;-1:-1:-1;;;;;8966:14:1;;;8963:34;;;8993:1;8990;8983:12;8963:34;9016:61;9069:7;9060:6;9049:9;9045:22;9016:61;:::i;:::-;9006:71;;9130:2;9119:9;9115:18;9102:32;9086:48;;9159:2;9149:8;9146:16;9143:36;;;9175:1;9172;9165:12;9143:36;;9198:63;9253:7;9242:8;9231:9;9227:24;9198:63;:::i;:::-;9188:73;;;8537:730;;;;;:::o;9272:118::-;9358:5;9351:13;9344:21;9337:5;9334:32;9324:60;;9380:1;9377;9370:12;9395:382;9460:6;9468;9521:2;9509:9;9500:7;9496:23;9492:32;9489:52;;;9537:1;9534;9527:12;9489:52;9576:9;9563:23;9595:31;9620:5;9595:31;:::i;:::-;9645:5;-1:-1:-1;9702:2:1;9687:18;;9674:32;9715:30;9674:32;9715:30;:::i;:::-;9764:7;9754:17;;;9395:382;;;;;:::o;9782:730::-;9909:6;9917;9925;9978:2;9966:9;9957:7;9953:23;9949:32;9946:52;;;9994:1;9991;9984:12;9946:52;10034:9;10021:23;-1:-1:-1;;;;;10104:2:1;10096:6;10093:14;10090:34;;;10120:1;10117;10110:12;10090:34;10143:61;10196:7;10187:6;10176:9;10172:22;10143:61;:::i;:::-;10133:71;;10257:2;10246:9;10242:18;10229:32;10213:48;;10286:2;10276:8;10273:16;10270:36;;;10302:1;10299;10292:12;10270:36;;10325:63;10380:7;10369:8;10358:9;10354:24;10325:63;:::i;:::-;10315:73;;;10438:2;10427:9;10423:18;10410:32;10451:31;10476:5;10451:31;:::i;10517:367::-;10580:8;10590:6;10644:3;10637:4;10629:6;10625:17;10621:27;10611:55;;10662:1;10659;10652:12;10611:55;-1:-1:-1;10685:20:1;;-1:-1:-1;;;;;10717:30:1;;10714:50;;;10760:1;10757;10750:12;10714:50;10797:4;10789:6;10785:17;10773:29;;10857:3;10850:4;10840:6;10837:1;10833:14;10825:6;10821:27;10817:38;10814:47;10811:67;;;10874:1;10871;10864:12;10811:67;10517:367;;;;;:::o;10889:1137::-;11045:6;11053;11061;11069;11077;11085;11093;11101;11154:3;11142:9;11133:7;11129:23;11125:33;11122:53;;;11171:1;11168;11161:12;11122:53;11211:9;11198:23;-1:-1:-1;;;;;11281:2:1;11273:6;11270:14;11267:34;;;11297:1;11294;11287:12;11267:34;11336:70;11398:7;11389:6;11378:9;11374:22;11336:70;:::i;:::-;11425:8;;-1:-1:-1;11310:96:1;-1:-1:-1;11513:2:1;11498:18;;11485:32;;-1:-1:-1;11529:16:1;;;11526:36;;;11558:1;11555;11548:12;11526:36;;11597:72;11661:7;11650:8;11639:9;11635:24;11597:72;:::i;:::-;11688:8;;-1:-1:-1;11571:98:1;-1:-1:-1;;11770:2:1;11755:18;;11742:32;;-1:-1:-1;11824:2:1;11809:18;;11796:32;11868:4;11857:16;;11847:27;;11837:55;;11888:1;11885;11878:12;11837:55;10889:1137;;;;-1:-1:-1;10889:1137:1;;;;;;11911:5;;-1:-1:-1;;;11963:3:1;11948:19;;11935:33;;12015:3;12000:19;11987:33;;10889:1137::o;12031:388::-;12099:6;12107;12160:2;12148:9;12139:7;12135:23;12131:32;12128:52;;;12176:1;12173;12166:12;12128:52;12215:9;12202:23;12234:31;12259:5;12234:31;:::i;:::-;12284:5;-1:-1:-1;12341:2:1;12326:18;;12313:32;12354:33;12313:32;12354:33;:::i;12424:734::-;12528:6;12536;12544;12552;12560;12613:3;12601:9;12592:7;12588:23;12584:33;12581:53;;;12630:1;12627;12620:12;12581:53;12669:9;12656:23;12688:31;12713:5;12688:31;:::i;:::-;12738:5;-1:-1:-1;12795:2:1;12780:18;;12767:32;12808:33;12767:32;12808:33;:::i;:::-;12860:7;-1:-1:-1;12914:2:1;12899:18;;12886:32;;-1:-1:-1;12965:2:1;12950:18;;12937:32;;-1:-1:-1;13020:3:1;13005:19;;12992:33;-1:-1:-1;;;;;13037:30:1;;13034:50;;;13080:1;13077;13070:12;13034:50;13103:49;13144:7;13135:6;13124:9;13120:22;13103:49;:::i;13163:383::-;13240:6;13248;13256;13309:2;13297:9;13288:7;13284:23;13280:32;13277:52;;;13325:1;13322;13315:12;13277:52;13364:9;13351:23;13383:31;13408:5;13383:31;:::i;:::-;13433:5;13485:2;13470:18;;13457:32;;-1:-1:-1;13536:2:1;13521:18;;;13508:32;;13163:383;-1:-1:-1;;;13163:383:1:o;13962:356::-;14164:2;14146:21;;;14183:18;;;14176:30;14242:34;14237:2;14222:18;;14215:62;14309:2;14294:18;;13962:356::o;14323:380::-;14402:1;14398:12;;;;14445;;;14466:61;;14520:4;14512:6;14508:17;14498:27;;14466:61;14573:2;14565:6;14562:14;14542:18;14539:38;14536:161;;14619:10;14614:3;14610:20;14607:1;14600:31;14654:4;14651:1;14644:15;14682:4;14679:1;14672:15;14536:161;;14323:380;;;:::o;15244:1527::-;15468:3;15506:6;15500:13;15532:4;15545:51;15589:6;15584:3;15579:2;15571:6;15567:15;15545:51;:::i;:::-;15659:13;;15618:16;;;;15681:55;15659:13;15618:16;15703:15;;;15681:55;:::i;:::-;15825:13;;15758:20;;;15798:1;;15885;15907:18;;;;15960;;;;15987:93;;16065:4;16055:8;16051:19;16039:31;;15987:93;16128:2;16118:8;16115:16;16095:18;16092:40;16089:167;;-1:-1:-1;;;16155:33:1;;16211:4;16208:1;16201:15;16241:4;16162:3;16229:17;16089:167;16272:18;16299:110;;;;16423:1;16418:328;;;;16265:481;;16299:110;-1:-1:-1;;16334:24:1;;16320:39;;16379:20;;;;-1:-1:-1;16299:110:1;;16418:328;15191:1;15184:14;;;15228:4;15215:18;;16513:1;16527:169;16541:8;16538:1;16535:15;16527:169;;;16623:14;;16608:13;;;16601:37;16666:16;;;;16558:10;;16527:169;;;16531:3;;16727:8;16720:5;16716:20;16709:27;;16265:481;-1:-1:-1;16762:3:1;;15244:1527;-1:-1:-1;;;;;;;;;;;15244:1527:1:o;16776:411::-;16978:2;16960:21;;;17017:2;16997:18;;;16990:30;17056:34;17051:2;17036:18;;17029:62;-1:-1:-1;;;17122:2:1;17107:18;;17100:45;17177:3;17162:19;;16776:411::o;18172:127::-;18233:10;18228:3;18224:20;18221:1;18214:31;18264:4;18261:1;18254:15;18288:4;18285:1;18278:15;18304:127;18365:10;18360:3;18356:20;18353:1;18346:31;18396:4;18393:1;18386:15;18420:4;18417:1;18410:15;18436:135;18475:3;18496:17;;;18493:43;;18516:18;;:::i;:::-;-1:-1:-1;18563:1:1;18552:13;;18436:135::o;19748:251::-;19818:6;19871:2;19859:9;19850:7;19846:23;19842:32;19839:52;;;19887:1;19884;19877:12;19839:52;19919:9;19913:16;19938:31;19963:5;19938:31;:::i;21077:245::-;21144:6;21197:2;21185:9;21176:7;21172:23;21168:32;21165:52;;;21213:1;21210;21203:12;21165:52;21245:9;21239:16;21264:28;21286:5;21264:28;:::i;22474:127::-;22535:10;22530:3;22526:20;22523:1;22516:31;22566:4;22563:1;22556:15;22590:4;22587:1;22580:15;22606:112;22638:1;22664;22654:35;;22669:18;;:::i;:::-;-1:-1:-1;22703:9:1;;22606:112::o;22723:128::-;22763:3;22794:1;22790:6;22787:1;22784:13;22781:39;;;22800:18;;:::i;:::-;-1:-1:-1;22836:9:1;;22723:128::o;23263:120::-;23303:1;23329;23319:35;;23334:18;;:::i;:::-;-1:-1:-1;23368:9:1;;23263:120::o;23388:125::-;23428:4;23456:1;23453;23450:8;23447:34;;;23461:18;;:::i;:::-;-1:-1:-1;23498:9:1;;23388:125::o;23518:404::-;23720:2;23702:21;;;23759:2;23739:18;;;23732:30;23798:34;23793:2;23778:18;;23771:62;-1:-1:-1;;;23864:2:1;23849:18;;23842:38;23912:3;23897:19;;23518:404::o;23927:401::-;24129:2;24111:21;;;24168:2;24148:18;;;24141:30;24207:34;24202:2;24187:18;;24180:62;-1:-1:-1;;;24273:2:1;24258:18;;24251:35;24318:3;24303:19;;23927:401::o;24333:406::-;24535:2;24517:21;;;24574:2;24554:18;;;24547:30;24613:34;24608:2;24593:18;;24586:62;-1:-1:-1;;;24679:2:1;24664:18;;24657:40;24729:3;24714:19;;24333:406::o;24744:465::-;25001:2;24990:9;24983:21;24964:4;25027:56;25079:2;25068:9;25064:18;25056:6;25027:56;:::i;:::-;25131:9;25123:6;25119:22;25114:2;25103:9;25099:18;25092:50;25159:44;25196:6;25188;25159:44;:::i;:::-;25151:52;24744:465;-1:-1:-1;;;;;24744:465:1:o;25214:397::-;25416:2;25398:21;;;25455:2;25435:18;;;25428:30;25494:34;25489:2;25474:18;;25467:62;-1:-1:-1;;;25560:2:1;25545:18;;25538:31;25601:3;25586:19;;25214:397::o;25869:399::-;26071:2;26053:21;;;26110:2;26090:18;;;26083:30;26149:34;26144:2;26129:18;;26122:62;-1:-1:-1;;;26215:2:1;26200:18;;26193:33;26258:3;26243:19;;25869:399::o;26273:400::-;26475:2;26457:21;;;26514:2;26494:18;;;26487:30;26553:34;26548:2;26533:18;;26526:62;-1:-1:-1;;;26619:2:1;26604:18;;26597:34;26663:3;26648:19;;26273:400::o;28233:827::-;-1:-1:-1;;;;;28630:15:1;;;28612:34;;28682:15;;28677:2;28662:18;;28655:43;28592:3;28729:2;28714:18;;28707:31;;;28555:4;;28761:57;;28798:19;;28790:6;28761:57;:::i;:::-;28866:9;28858:6;28854:22;28849:2;28838:9;28834:18;28827:50;28900:44;28937:6;28929;28900:44;:::i;:::-;28886:58;;28993:9;28985:6;28981:22;28975:3;28964:9;28960:19;28953:51;29021:33;29047:6;29039;29021:33;:::i;:::-;29013:41;28233:827;-1:-1:-1;;;;;;;;28233:827:1:o;29065:249::-;29134:6;29187:2;29175:9;29166:7;29162:23;29158:32;29155:52;;;29203:1;29200;29193:12;29155:52;29235:9;29229:16;29254:30;29278:5;29254:30;:::i;29319:179::-;29354:3;29396:1;29378:16;29375:23;29372:120;;;29442:1;29439;29436;29421:23;-1:-1:-1;29479:1:1;29473:8;29468:3;29464:18;29372:120;29319:179;:::o;29503:671::-;29542:3;29584:4;29566:16;29563:26;29560:39;;;29503:671;:::o;29560:39::-;29626:2;29620:9;-1:-1:-1;;29691:16:1;29687:25;;29684:1;29620:9;29663:50;29742:4;29736:11;29766:16;-1:-1:-1;;;;;29872:2:1;29865:4;29857:6;29853:17;29850:25;29845:2;29837:6;29834:14;29831:45;29828:58;;;29879:5;;;;;29503:671;:::o;29828:58::-;29916:6;29910:4;29906:17;29895:28;;29952:3;29946:10;29979:2;29971:6;29968:14;29965:27;;;29985:5;;;;;;29503:671;:::o;29965:27::-;30069:2;30050:16;30044:4;30040:27;30036:36;30029:4;30020:6;30015:3;30011:16;30007:27;30004:69;30001:82;;;30076:5;;;;;;29503:671;:::o;30001:82::-;30092:57;30143:4;30134:6;30126;30122:19;30118:30;30112:4;30092:57;:::i;:::-;-1:-1:-1;30165:3:1;;29503:671;-1:-1:-1;;;;;29503:671:1:o;30600:404::-;30802:2;30784:21;;;30841:2;30821:18;;;30814:30;30880:34;30875:2;30860:18;;30853:62;-1:-1:-1;;;30946:2:1;30931:18;;30924:38;30994:3;30979:19;;30600:404::o;31358:561::-;-1:-1:-1;;;;;31655:15:1;;;31637:34;;31707:15;;31702:2;31687:18;;31680:43;31754:2;31739:18;;31732:34;;;31797:2;31782:18;;31775:34;;;31617:3;31840;31825:19;;31818:32;;;31580:4;;31867:46;;31893:19;;31885:6;31867:46;:::i;:::-;31859:54;31358:561;-1:-1:-1;;;;;;;31358:561:1:o

Swarm Source

ipfs://16702aad30d436a7a9e531379d8cba0b008744f226707dc2d62a3d4ce8b14aa0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.