ETH Price: $2,294.97 (-2.66%)

Token

RBCLand (RBCL)
 

Overview

Max Total Supply

680 RBCL

Holders

330

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cryptoninja.eth
0x1dE2418F4aC0124BD1cFb7d84043BD8279a5fe90
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:
RBCLand

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.5 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT
// 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/[email protected]

// OpenZeppelin Contracts v4.4.1 (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 Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

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

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        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/utils/cryptography/[email protected]

// 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/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File @openzeppelin/contracts/access/[email protected]

// 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 @openzeppelin/contracts/utils/introspection/[email protected]

// 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/ERC1155/[email protected]

// OpenZeppelin Contracts v4.4.1 (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 be 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/[email protected]

// 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/extensions/[email protected]

// 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/[email protected]

// 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/[email protected]

// 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/[email protected]

// OpenZeppelin Contracts (last updated v4.6.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: balance query for the zero address");
        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 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: transfer caller is not 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}.
     *
     * 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`
     *
     * 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}.
     *
     * 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 a {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 `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 _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/[email protected]

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


pragma solidity ^0.8.9;

// import "hardhat/console.sol";







contract RBCLand is Pausable, Ownable, ERC1155, ERC1155Supply {
    using ECDSA for bytes32;

    uint256 public constant DIAMOND_LAND_ID = 0;
    uint256 public DIAMOND_LAND_AMOUNT = 0;
    uint256 public constant GOLD_LAND_ID = 1;
    uint256 public GOLD_LAND_AMOUNT = 0;
    uint256 public constant SILVER_LAND_ID = 2;
    uint256 public SILVER_LAND_AMOUNT = 0;
    uint256[] LAND_IDS = [DIAMOND_LAND_ID, GOLD_LAND_ID, SILVER_LAND_ID];

    uint256 public mintPrice = 0;

    bytes32 public merkleRoot;

    string public name;
    string public symbol;

    address public watcher;

    mapping(address => uint256) public claimedAmount;
    mapping(uint256 => bool) public usedNonces;

    event Purchased(
        uint256[] indexed index,
        address indexed account,
        uint256[] amount
    );
    event Claimed(
        uint256[] indexed index,
        address indexed account,
        uint256[] amount
    );

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        address _watcher,
        uint256[3] memory _landAmounts
    ) ERC1155(_uri) {
        name = _name;
        symbol = _symbol;
        watcher = _watcher;
        DIAMOND_LAND_AMOUNT = _landAmounts[0];
        GOLD_LAND_AMOUNT = _landAmounts[1];
        SILVER_LAND_AMOUNT = _landAmounts[2];
    }

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

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

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

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

    function setPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

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

    function setWatcher(address _watcher) external onlyOwner {
        watcher = _watcher;
    }

    function setLandAmount(uint256 _landId, uint256 _landAmount)
        external
        onlyOwner
    {
        if (_landId == DIAMOND_LAND_ID) {
            DIAMOND_LAND_AMOUNT = _landAmount;
        }
        if (_landId == GOLD_LAND_ID) {
            GOLD_LAND_AMOUNT = _landAmount;
        }
        if (_landId == SILVER_LAND_ID) {
            SILVER_LAND_AMOUNT = _landAmount;
        }
    }

    function verifySignedByWatcher(
        uint256[] memory amounts,
        uint256 nonce,
        bytes memory signature,
        address _address
    ) public view {
        bytes32 message = keccak256(
            abi.encodePacked(
                amounts[0],
                amounts[1],
                amounts[2],
                nonce,
                _address
            )
        );
        address signerAddress = message.toEthSignedMessageHash().recover(
            signature
        );
        require(signerAddress == watcher, "Not signed by watcher");
    }

    function purchase(
        uint256[] memory amounts,
        uint256 nonce,
        bytes memory signature
    ) external payable whenNotPaused {
        uint256 totalAmount = amounts[0] + amounts[1] + amounts[2];
        require(
            msg.value == mintPrice * totalAmount,
            "Purchase: Incorrect payment"
        );

        _validatePurchaseParameters(amounts, nonce, signature);

        _mintBatch(msg.sender, LAND_IDS, amounts, "");
        emit Purchased(LAND_IDS, msg.sender, amounts);
    }

    function _validatePurchaseParameters(
        uint256[] memory amounts,
        uint256 nonce,
        bytes memory signature
    ) private {
        // prevent reuse the signature
        require(!usedNonces[nonce], "Reusing nonce is forbidden");
        usedNonces[nonce] = true;

        uint256 diamondLandAmount = amounts[0];
        uint256 goldLandAmount = amounts[1];
        uint256 silverLandAmount = amounts[2];

        // check the amount of the purchased land doesn't exceed the limit
        require(
            DIAMOND_LAND_AMOUNT >=
                diamondLandAmount + totalSupply(DIAMOND_LAND_ID),
            "Purchase: exceed diamond land limit"
        );
        require(
            GOLD_LAND_AMOUNT >= goldLandAmount + totalSupply(GOLD_LAND_ID),
            "Purchase: exceed gold land limit"
        );
        require(
            SILVER_LAND_AMOUNT >=
                silverLandAmount + totalSupply(SILVER_LAND_ID),
            "Purchase: exceed silver land limit"
        );

        verifySignedByWatcher(amounts, nonce, signature, msg.sender);
    }

    function claimLand(
        uint256 maxClaimableAmount,
        bytes32[] memory merkleProof,
        uint256[] memory amounts,
        uint256 nonce,
        bytes memory signature
    ) external payable whenNotPaused {
        require(
            claimedAmount[msg.sender] + amounts[0] + amounts[1] + amounts[2] <=
                maxClaimableAmount,
            "Claim: max claimable amount of current address is reached!"
        );

        bytes32 node = keccak256(
            abi.encodePacked(maxClaimableAmount, msg.sender)
        );

        require(
            MerkleProof.verify(merkleProof, merkleRoot, node),
            "Merkle: Invalid proof."
        );

        _validatePurchaseParameters(amounts, nonce, signature);

        claimedAmount[msg.sender] += amounts[0] + amounts[1] + amounts[2];

        _mintBatch(msg.sender, LAND_IDS, amounts, "");
        emit Claimed(LAND_IDS, msg.sender, amounts);
    }

    function uri(uint256 _id) public view override returns (string memory) {
        require(exists(_id), "Land id does not exist");
        return
            string(
                abi.encodePacked(super.uri(_id), Strings.toString(_id), ".json")
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_watcher","type":"address"},{"internalType":"uint256[3]","name":"_landAmounts","type":"uint256[3]"}],"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":"uint256[]","name":"index","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"Claimed","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":"uint256[]","name":"index","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"Purchased","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"},{"inputs":[],"name":"DIAMOND_LAND_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIAMOND_LAND_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_LAND_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_LAND_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILVER_LAND_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILVER_LAND_ID","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":"uint256","name":"maxClaimableAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimLand","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"_landId","type":"uint256"},{"internalType":"uint256","name":"_landAmount","type":"uint256"}],"name":"setLandAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_watcher","type":"address"}],"name":"setWatcher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"_address","type":"address"}],"name":"verifySignedByWatcher","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"watcher","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

600060058190556006819055600781905560e06040526080908152600160a052600260c0526200003490600890600362000169565b5060006009553480156200004757600080fd5b5060405162003ac638038062003ac68339810160408190526200006a916200032a565b6000805460ff19169055826200008033620000f7565b6200008b8162000150565b508451620000a190600b906020880190620001b9565b508351620000b790600c906020870190620001b9565b50600d80546001600160a01b0319166001600160a01b03939093169290921790915580516005556020810151600655604001516007555062000488915050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b805162000165906003906020840190620001b9565b5050565b828054828255906000526020600020908101928215620001a7579160200282015b82811115620001a75782518255916020019190600101906200018a565b50620001b592915062000235565b5090565b828054620001c7906200044b565b90600052602060002090601f016020900481019282620001eb5760008555620001a7565b82601f106200020657805160ff1916838001178555620001a7565b82800160010185558215620001a75791820182811115620001a75782518255916020019190600101906200018a565b5b80821115620001b5576000815560010162000236565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200028d576200028d6200024c565b604052919050565b600082601f830112620002a757600080fd5b81516001600160401b03811115620002c357620002c36200024c565b6020620002d9601f8301601f1916820162000262565b8281528582848701011115620002ee57600080fd5b60005b838110156200030e578581018301518282018401528201620002f1565b83811115620003205760008385840101525b5095945050505050565b600080600080600060e086880312156200034357600080fd5b85516001600160401b03808211156200035b57600080fd5b6200036989838a0162000295565b96506020915081880151818111156200038157600080fd5b6200038f8a828b0162000295565b965050604088015181811115620003a557600080fd5b620003b38a828b0162000295565b60608a015190965090506001600160a01b0381168114620003d357600080fd5b9350609f88018913620003e557600080fd5b6040516060810181811083821117156200040357620004036200024c565b60405290508060e089018a8111156200041b57600080fd5b60808a015b8181101562000439578051845292840192840162000420565b50508093505050509295509295909350565b600181811c908216806200046057607f821691505b602082108114156200048257634e487b7160e01b600052602260045260246000fd5b50919050565b61362e80620004986000396000f3fe6080604052600436106102195760003560e01c80637cb6475911610123578063bd85b039116100ab578063ead661801161006f578063ead661801461064d578063f242432a14610662578063f2fde38b14610682578063f6f779af146106a2578063fdb49068146106b557600080fd5b8063bd85b0391461058b578063bed84538146105b8578063d6b74865146105ce578063e52991b5146105ee578063e985e9c51461060457600080fd5b806393fd3f6b116100f257806393fd3f6b1461050157806395d89b411461052157806396d1d5cd14610536578063a22cb46514610556578063bae77f511461057657600080fd5b80637cb64759146104755780638456cb59146104955780638da5cb5b146104aa57806391b7f5ed146104e157600080fd5b80632eb4a7ab116101a657806358b768541161017557806358b76854146103ef5780635c975abb146104025780636717e41c1461041a5780636817c76c1461044a578063715018a61461046057600080fd5b80632eb4a7ab146103685780633f4ba83a1461037e5780634e1273f4146103935780634f558e79146103c057600080fd5b806306fdde03116101ed57806306fdde03146102d05780630c5c8b42146102f25780630e89341c1461030857806324f48bc5146103285780632eb2c2d61461034857600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806302fe53051461028157806304e86903146102a3575b600080fd5b34801561022a57600080fd5b5061023e610239366004612b6b565b6106ca565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c366004612bab565b610763565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c366004612c70565b6107b5565b005b3480156102af57600080fd5b5061023e6102be366004612cb9565b600e6020526000908152604090205481565b3480156102dc57600080fd5b506102e561080f565b6040516102489190612d30565b3480156102fe57600080fd5b5061023e60065481565b34801561031457600080fd5b506102e5610323366004612d43565b61089d565b34801561033457600080fd5b506102a1610343366004612cb9565b610934565b34801561035457600080fd5b506102a1610363366004612e11565b6109b1565b34801561037457600080fd5b5061023e600a5481565b34801561038a57600080fd5b506102a1610a53565b34801561039f57600080fd5b506103b36103ae366004612ebb565b610aab565b6040516102489190612fc1565b3480156103cc57600080fd5b506102716103db366004612d43565b600090815260046020526040902054151590565b6102a16103fd366004612fd4565b610bd5565b34801561040e57600080fd5b5060005460ff16610271565b34801561042657600080fd5b50610271610435366004612d43565b600f6020526000908152604090205460ff1681565b34801561045657600080fd5b5061023e60095481565b34801561046c57600080fd5b506102a1610dac565b34801561048157600080fd5b506102a1610490366004612d43565b610e04565b3480156104a157600080fd5b506102a1610e57565b3480156104b657600080fd5b5060005461010090046001600160a01b03165b6040516001600160a01b039091168152602001610248565b3480156104ed57600080fd5b506102a16104fc366004612d43565b610ead565b34801561050d57600080fd5b506102a161051c366004613041565b610f00565b34801561052d57600080fd5b506102e561107e565b34801561054257600080fd5b506102a16105513660046130bf565b61108b565b34801561056257600080fd5b506102a16105713660046130e1565b611106565b34801561058257600080fd5b5061023e600281565b34801561059757600080fd5b5061023e6105a6366004612d43565b60009081526004602052604090205490565b3480156105c457600080fd5b5061023e60075481565b3480156105da57600080fd5b50600d546104c9906001600160a01b031681565b3480156105fa57600080fd5b5061023e60055481565b34801561061057600080fd5b5061027161061f36600461311d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561065957600080fd5b5061023e600081565b34801561066e57600080fd5b506102a161067d366004613150565b611111565b34801561068e57600080fd5b506102a161069d366004612cb9565b611198565b6102a16106b03660046131b5565b611254565b3480156106c157600080fd5b5061023e600181565b60006001600160a01b03831661073b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061079457506001600160e01b031982166303a24d0760e21b145b806107af57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b036101009091041633146108035760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b61080c8161159c565b50565b600b805461081c906132a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610848906132a6565b80156108955780601f1061086a57610100808354040283529160200191610895565b820191906000526020600020905b81548152906001019060200180831161087857829003601f168201915b505050505081565b6000818152600460205260409020546060906108fb5760405162461bcd60e51b815260206004820152601660248201527f4c616e6420696420646f6573206e6f74206578697374000000000000000000006044820152606401610732565b610904826115af565b61090d83611643565b60405160200161091e9291906132e1565b6040516020818303038152906040529050919050565b6000546001600160a01b036101009091041633146109825760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0385163314806109cd57506109cd853361061f565b610a3f5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610732565b610a4c8585858585611761565b5050505050565b6000546001600160a01b03610100909104163314610aa15760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa96119c8565b565b60608151835114610b105760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610732565b6000835167ffffffffffffffff811115610b2c57610b2c612bcf565b604051908082528060200260200182016040528015610b55578160200160208202803683370190505b50905060005b8451811015610bcd57610ba0858281518110610b7957610b79613320565b6020026020010151858381518110610b9357610b93613320565b60200260200101516106ca565b828281518110610bb257610bb2613320565b6020908102919091010152610bc68161334c565b9050610b5b565b509392505050565b60005460ff1615610c1b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b600083600281518110610c3057610c30613320565b602002602001015184600181518110610c4b57610c4b613320565b602002602001015185600081518110610c6657610c66613320565b6020026020010151610c789190613367565b610c829190613367565b905080600954610c92919061337f565b3414610ce05760405162461bcd60e51b815260206004820152601b60248201527f50757263686173653a20496e636f7272656374207061796d656e7400000000006044820152606401610732565b610ceb848484611a64565b610d56336008805480602002602001604051908101604052809291908181526020018280548015610d3b57602002820191906000526020600020905b815481526020019060010190808311610d27575b50505050508660405180602001604052806000815250611cd7565b6040513390610d679060089061339e565b60405180910390207fb19a0e54a0d12c649f962287d12e0573df3d188f5fcad44083dd0a11e759bcc586604051610d9e9190612fc1565b60405180910390a350505050565b6000546001600160a01b03610100909104163314610dfa5760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa96000611ead565b6000546001600160a01b03610100909104163314610e525760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600a55565b6000546001600160a01b03610100909104163314610ea55760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa9611f13565b6000546001600160a01b03610100909104163314610efb5760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600955565b600084600081518110610f1557610f15613320565b602002602001015185600181518110610f3057610f30613320565b602002602001015186600281518110610f4b57610f4b613320565b60200260200101518685604051602001610f9b959493929190948552602085019390935260408401919091526060808401919091521b6bffffffffffffffffffffffff1916608082015260940190565b604051602081830303815290604052805190602001209050600061101684611010846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611f8e565b600d549091506001600160a01b038083169116146110765760405162461bcd60e51b815260206004820152601560248201527f4e6f74207369676e6564206279207761746368657200000000000000000000006044820152606401610732565b505050505050565b600c805461081c906132a6565b6000546001600160a01b036101009091041633146110d95760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b816110e45760058190555b60018214156110f35760068190555b60028214156111025760078190555b5050565b611102338383611faa565b6001600160a01b03851633148061112d575061112d853361061f565b61118b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610732565b610a4c858585858561208b565b6000546001600160a01b036101009091041633146111e65760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b6001600160a01b03811661124b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610732565b61080c81611ead565b60005460ff161561129a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b84836002815181106112ae576112ae613320565b6020026020010151846001815181106112c9576112c9613320565b6020026020010151856000815181106112e4576112e4613320565b6020026020010151600e6000336001600160a01b03166001600160a01b031681526020019081526020016000205461131c9190613367565b6113269190613367565b6113309190613367565b11156113a45760405162461bcd60e51b815260206004820152603a60248201527f436c61696d3a206d617820636c61696d61626c6520616d6f756e74206f66206360448201527f757272656e7420616464726573732069732072656163686564210000000000006064820152608401610732565b600085336040516020016113d492919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090506113f985600a5483612248565b6114455760405162461bcd60e51b815260206004820152601660248201527f4d65726b6c653a20496e76616c69642070726f6f662e000000000000000000006044820152606401610732565b611450848484611a64565b8360028151811061146357611463613320565b60200260200101518460018151811061147e5761147e613320565b60200260200101518560008151811061149957611499613320565b60200260200101516114ab9190613367565b6114b59190613367565b336000908152600e6020526040812080549091906114d4908490613367565b92505081905550611544336008805480602002602001604051908101604052809291908181526020018280548015610d3b5760200282019190600052602060002090815481526020019060010190808311610d275750505050508660405180602001604052806000815250611cd7565b60405133906115559060089061339e565b60405180910390207f9c4c54f7476d9aa900cdb52f2fbf3e00924d02389c9b2401d3ecee109eb988cd8660405161158c9190612fc1565b60405180910390a3505050505050565b8051611102906003906020840190612ab6565b6060600380546115be906132a6565b80601f01602080910402602001604051908101604052809291908181526020018280546115ea906132a6565b80156116375780601f1061160c57610100808354040283529160200191611637565b820191906000526020600020905b81548152906001019060200180831161161a57829003601f168201915b50505050509050919050565b6060816116675750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611691578061167b8161334c565b915061168a9050600a836133f1565b915061166b565b60008167ffffffffffffffff8111156116ac576116ac612bcf565b6040519080825280601f01601f1916602001820160405280156116d6576020820181803683370190505b5090505b8415611759576116eb600183613405565b91506116f8600a8661341c565b611703906030613367565b60f81b81838151811061171857611718613320565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611752600a866133f1565b94506116da565b949350505050565b81518351146117c35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610732565b6001600160a01b0384166118275760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610732565b3361183681878787878761225e565b60005b845181101561196257600085828151811061185657611856613320565b60200260200101519050600085838151811061187457611874613320565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156119085760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610732565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611947908490613367565b925050819055505050508061195b9061334c565b9050611839565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b2929190613430565b60405180910390a461107681878787878761226c565b60005460ff16611a1a5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610732565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600f602052604090205460ff1615611ac35760405162461bcd60e51b815260206004820152601a60248201527f52657573696e67206e6f6e636520697320666f7262696464656e0000000000006044820152606401610732565b6000828152600f60205260408120805460ff19166001179055835184908290611aee57611aee613320565b60200260200101519050600084600181518110611b0d57611b0d613320565b60200260200101519050600085600281518110611b2c57611b2c613320565b60200260200101519050611b4b60008081526004602052604090205490565b611b559084613367565b6005541015611bb25760405162461bcd60e51b815260206004820152602360248201527f50757263686173653a20657863656564206469616d6f6e64206c616e64206c696044820152621b5a5d60ea1b6064820152608401610732565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0554611be89083613367565b6006541015611c395760405162461bcd60e51b815260206004820181905260248201527f50757263686173653a2065786365656420676f6c64206c616e64206c696d69746044820152606401610732565b600260005260046020527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754611c6f9082613367565b6007541015611ccb5760405162461bcd60e51b815260206004820152602260248201527f50757263686173653a206578636565642073696c766572206c616e64206c696d6044820152611a5d60f21b6064820152608401610732565b61107686868633610f00565b6001600160a01b038416611d375760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610732565b8151835114611d995760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610732565b33611da98160008787878761225e565b60005b8451811015611e4557838181518110611dc757611dc7613320565b602002602001015160016000878481518110611de557611de5613320565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611e2d9190613367565b90915550819050611e3d8161334c565b915050611dac565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e96929190613430565b60405180910390a4610a4c8160008787878761226c565b600080546001600160a01b0383811661010081810274ffffffffffffffffffffffffffffffffffffffff0019851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611f595760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a473390565b6000806000611f9d858561242a565b91509150610bcd8161249a565b816001600160a01b0316836001600160a01b0316141561201e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610732565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166120ef5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610732565b3360006120fb85612655565b9050600061210885612655565b905061211883898985858961225e565b60008681526001602090815260408083206001600160a01b038c1684529091529020548581101561219e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610732565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906121dd908490613367565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461223d848a8a8a8a8a6126a0565b505050505050505050565b60008261225585846127ab565b14949350505050565b611076868686868686612817565b6001600160a01b0384163b156110765760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906122b0908990899088908890889060040161345e565b602060405180830381600087803b1580156122ca57600080fd5b505af19250505080156122fa575060408051601f3d908101601f191682019092526122f7918101906134bc565b60015b6123b0576123066134d9565b806308c379a01415612340575061231b6134f5565b806123265750612342565b8060405162461bcd60e51b81526004016107329190612d30565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610732565b6001600160e01b0319811663bc197c8160e01b146124215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610732565b50505050505050565b6000808251604114156124615760208301516040840151606085015160001a61245587828585612990565b94509450505050612493565b82516040141561248b5760208301516040840151612480868383612a7d565b935093505050612493565b506000905060025b9250929050565b60008160048111156124ae576124ae61357f565b14156124b75750565b60018160048111156124cb576124cb61357f565b14156125195760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610732565b600281600481111561252d5761252d61357f565b141561257b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610732565b600381600481111561258f5761258f61357f565b14156125e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610732565b60048160048111156125fc576125fc61357f565b141561080c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610732565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061268f5761268f613320565b602090810291909101015292915050565b6001600160a01b0384163b156110765760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906126e49089908990889088908890600401613595565b602060405180830381600087803b1580156126fe57600080fd5b505af192505050801561272e575060408051601f3d908101601f1916820190925261272b918101906134bc565b60015b61273a576123066134d9565b6001600160e01b0319811663f23a6e6160e01b146124215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610732565b600081815b8451811015610bcd5760008582815181106127cd576127cd613320565b602002602001015190508083116127f35760008381526020829052604090209250612804565b600081815260208490526040902092505b508061280f8161334c565b9150506127b0565b6001600160a01b03851661289e5760005b835181101561289c5782818151811061284357612843613320565b60200260200101516004600086848151811061286157612861613320565b6020026020010151815260200190815260200160002060008282546128869190613367565b9091555061289590508161334c565b9050612828565b505b6001600160a01b0384166110765760005b83518110156124215760008482815181106128cc576128cc613320565b6020026020010151905060008483815181106128ea576128ea613320565b602002602001015190506000600460008481526020019081526020016000205490508181101561296d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610732565b600092835260046020526040909220910390556129898161334c565b90506128af565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129c75750600090506003612a74565b8460ff16601b141580156129df57508460ff16601c14155b156129f05750600090506004612a74565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a44573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a6d57600060019250925050612a74565b9150600090505b94509492505050565b6000806001600160ff1b03831681612a9a60ff86901c601b613367565b9050612aa887828885612990565b935093505050935093915050565b828054612ac2906132a6565b90600052602060002090601f016020900481019282612ae45760008555612b2a565b82601f10612afd57805160ff1916838001178555612b2a565b82800160010185558215612b2a579182015b82811115612b2a578251825591602001919060010190612b0f565b50612b36929150612b3a565b5090565b5b80821115612b365760008155600101612b3b565b80356001600160a01b0381168114612b6657600080fd5b919050565b60008060408385031215612b7e57600080fd5b612b8783612b4f565b946020939093013593505050565b6001600160e01b03198116811461080c57600080fd5b600060208284031215612bbd57600080fd5b8135612bc881612b95565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612c0b57612c0b612bcf565b6040525050565b600067ffffffffffffffff831115612c2c57612c2c612bcf565b604051612c43601f8501601f191660200182612be5565b809150838152848484011115612c5857600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612c8257600080fd5b813567ffffffffffffffff811115612c9957600080fd5b8201601f81018413612caa57600080fd5b61175984823560208401612c12565b600060208284031215612ccb57600080fd5b612bc882612b4f565b60005b83811015612cef578181015183820152602001612cd7565b83811115612cfe576000848401525b50505050565b60008151808452612d1c816020860160208601612cd4565b601f01601f19169290920160200192915050565b602081526000612bc86020830184612d04565b600060208284031215612d5557600080fd5b5035919050565b600067ffffffffffffffff821115612d7657612d76612bcf565b5060051b60200190565b600082601f830112612d9157600080fd5b81356020612d9e82612d5c565b604051612dab8282612be5565b83815260059390931b8501820192828101915086841115612dcb57600080fd5b8286015b84811015612de65780358352918301918301612dcf565b509695505050505050565b600082601f830112612e0257600080fd5b612bc883833560208501612c12565b600080600080600060a08688031215612e2957600080fd5b612e3286612b4f565b9450612e4060208701612b4f565b9350604086013567ffffffffffffffff80821115612e5d57600080fd5b612e6989838a01612d80565b94506060880135915080821115612e7f57600080fd5b612e8b89838a01612d80565b93506080880135915080821115612ea157600080fd5b50612eae88828901612df1565b9150509295509295909350565b60008060408385031215612ece57600080fd5b823567ffffffffffffffff80821115612ee657600080fd5b818501915085601f830112612efa57600080fd5b81356020612f0782612d5c565b604051612f148282612be5565b83815260059390931b8501820192828101915089841115612f3457600080fd5b948201945b83861015612f5957612f4a86612b4f565b82529482019490820190612f39565b96505086013592505080821115612f6f57600080fd5b50612f7c85828601612d80565b9150509250929050565b600081518084526020808501945080840160005b83811015612fb657815187529582019590820190600101612f9a565b509495945050505050565b602081526000612bc86020830184612f86565b600080600060608486031215612fe957600080fd5b833567ffffffffffffffff8082111561300157600080fd5b61300d87838801612d80565b945060208601359350604086013591508082111561302a57600080fd5b5061303786828701612df1565b9150509250925092565b6000806000806080858703121561305757600080fd5b843567ffffffffffffffff8082111561306f57600080fd5b61307b88838901612d80565b955060208701359450604087013591508082111561309857600080fd5b506130a587828801612df1565b9250506130b460608601612b4f565b905092959194509250565b600080604083850312156130d257600080fd5b50508035926020909101359150565b600080604083850312156130f457600080fd5b6130fd83612b4f565b91506020830135801515811461311257600080fd5b809150509250929050565b6000806040838503121561313057600080fd5b61313983612b4f565b915061314760208401612b4f565b90509250929050565b600080600080600060a0868803121561316857600080fd5b61317186612b4f565b945061317f60208701612b4f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156131a957600080fd5b612eae88828901612df1565b600080600080600060a086880312156131cd57600080fd5b8535945060208087013567ffffffffffffffff808211156131ed57600080fd5b818901915089601f83011261320157600080fd5b813561320c81612d5c565b6040516132198282612be5565b82815260059290921b840185019185810191508c83111561323957600080fd5b938501935b828510156132575784358252938501939085019061323e565b98505050604089013592508083111561326f57600080fd5b61327b8a848b01612d80565b955060608901359450608089013592508083111561329857600080fd5b5050612eae88828901612df1565b600181811c908216806132ba57607f821691505b602082108114156132db57634e487b7160e01b600052602260045260246000fd5b50919050565b600083516132f3818460208801612cd4565b835190830190613307818360208801612cd4565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561336057613360613336565b5060010190565b6000821982111561337a5761337a613336565b500190565b600081600019048311821515161561339957613399613336565b500290565b60008183548391508460005260208060002060005b838110156133cf578154855293820193600191820191016133b3565b50929695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082613400576134006133db565b500490565b60008282101561341757613417613336565b500390565b60008261342b5761342b6133db565b500690565b6040815260006134436040830185612f86565b82810360208401526134558185612f86565b95945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261348a60a0830186612f86565b828103606084015261349c8186612f86565b905082810360808401526134b08185612d04565b98975050505050505050565b6000602082840312156134ce57600080fd5b8151612bc881612b95565b600060033d11156134f25760046000803e5060005160e01c5b90565b600060443d10156135035790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561353357505050505090565b828501915081518181111561354b5750505050505090565b843d87010160208285010111156135655750505050505090565b61357460208286010187612be5565b509095945050505050565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526135cd60a0830184612d04565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220fb423a940a870bf111a1365c0e512cd19adf20ddc4bca017bf9389a0388dd62d64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000009333c3a74bd781038dcc9a2d6a7297180d94025d000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000f2700000000000000000000000000000000000000000000000000000000000000075242434c616e640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045242434c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5369586837654374396b4438636e6255616477754e376b3759623264414d51336b373944664d4759576878362f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102195760003560e01c80637cb6475911610123578063bd85b039116100ab578063ead661801161006f578063ead661801461064d578063f242432a14610662578063f2fde38b14610682578063f6f779af146106a2578063fdb49068146106b557600080fd5b8063bd85b0391461058b578063bed84538146105b8578063d6b74865146105ce578063e52991b5146105ee578063e985e9c51461060457600080fd5b806393fd3f6b116100f257806393fd3f6b1461050157806395d89b411461052157806396d1d5cd14610536578063a22cb46514610556578063bae77f511461057657600080fd5b80637cb64759146104755780638456cb59146104955780638da5cb5b146104aa57806391b7f5ed146104e157600080fd5b80632eb4a7ab116101a657806358b768541161017557806358b76854146103ef5780635c975abb146104025780636717e41c1461041a5780636817c76c1461044a578063715018a61461046057600080fd5b80632eb4a7ab146103685780633f4ba83a1461037e5780634e1273f4146103935780634f558e79146103c057600080fd5b806306fdde03116101ed57806306fdde03146102d05780630c5c8b42146102f25780630e89341c1461030857806324f48bc5146103285780632eb2c2d61461034857600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806302fe53051461028157806304e86903146102a3575b600080fd5b34801561022a57600080fd5b5061023e610239366004612b6b565b6106ca565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c366004612bab565b610763565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c366004612c70565b6107b5565b005b3480156102af57600080fd5b5061023e6102be366004612cb9565b600e6020526000908152604090205481565b3480156102dc57600080fd5b506102e561080f565b6040516102489190612d30565b3480156102fe57600080fd5b5061023e60065481565b34801561031457600080fd5b506102e5610323366004612d43565b61089d565b34801561033457600080fd5b506102a1610343366004612cb9565b610934565b34801561035457600080fd5b506102a1610363366004612e11565b6109b1565b34801561037457600080fd5b5061023e600a5481565b34801561038a57600080fd5b506102a1610a53565b34801561039f57600080fd5b506103b36103ae366004612ebb565b610aab565b6040516102489190612fc1565b3480156103cc57600080fd5b506102716103db366004612d43565b600090815260046020526040902054151590565b6102a16103fd366004612fd4565b610bd5565b34801561040e57600080fd5b5060005460ff16610271565b34801561042657600080fd5b50610271610435366004612d43565b600f6020526000908152604090205460ff1681565b34801561045657600080fd5b5061023e60095481565b34801561046c57600080fd5b506102a1610dac565b34801561048157600080fd5b506102a1610490366004612d43565b610e04565b3480156104a157600080fd5b506102a1610e57565b3480156104b657600080fd5b5060005461010090046001600160a01b03165b6040516001600160a01b039091168152602001610248565b3480156104ed57600080fd5b506102a16104fc366004612d43565b610ead565b34801561050d57600080fd5b506102a161051c366004613041565b610f00565b34801561052d57600080fd5b506102e561107e565b34801561054257600080fd5b506102a16105513660046130bf565b61108b565b34801561056257600080fd5b506102a16105713660046130e1565b611106565b34801561058257600080fd5b5061023e600281565b34801561059757600080fd5b5061023e6105a6366004612d43565b60009081526004602052604090205490565b3480156105c457600080fd5b5061023e60075481565b3480156105da57600080fd5b50600d546104c9906001600160a01b031681565b3480156105fa57600080fd5b5061023e60055481565b34801561061057600080fd5b5061027161061f36600461311d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561065957600080fd5b5061023e600081565b34801561066e57600080fd5b506102a161067d366004613150565b611111565b34801561068e57600080fd5b506102a161069d366004612cb9565b611198565b6102a16106b03660046131b5565b611254565b3480156106c157600080fd5b5061023e600181565b60006001600160a01b03831661073b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061079457506001600160e01b031982166303a24d0760e21b145b806107af57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b036101009091041633146108035760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b61080c8161159c565b50565b600b805461081c906132a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610848906132a6565b80156108955780601f1061086a57610100808354040283529160200191610895565b820191906000526020600020905b81548152906001019060200180831161087857829003601f168201915b505050505081565b6000818152600460205260409020546060906108fb5760405162461bcd60e51b815260206004820152601660248201527f4c616e6420696420646f6573206e6f74206578697374000000000000000000006044820152606401610732565b610904826115af565b61090d83611643565b60405160200161091e9291906132e1565b6040516020818303038152906040529050919050565b6000546001600160a01b036101009091041633146109825760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0385163314806109cd57506109cd853361061f565b610a3f5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610732565b610a4c8585858585611761565b5050505050565b6000546001600160a01b03610100909104163314610aa15760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa96119c8565b565b60608151835114610b105760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610732565b6000835167ffffffffffffffff811115610b2c57610b2c612bcf565b604051908082528060200260200182016040528015610b55578160200160208202803683370190505b50905060005b8451811015610bcd57610ba0858281518110610b7957610b79613320565b6020026020010151858381518110610b9357610b93613320565b60200260200101516106ca565b828281518110610bb257610bb2613320565b6020908102919091010152610bc68161334c565b9050610b5b565b509392505050565b60005460ff1615610c1b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b600083600281518110610c3057610c30613320565b602002602001015184600181518110610c4b57610c4b613320565b602002602001015185600081518110610c6657610c66613320565b6020026020010151610c789190613367565b610c829190613367565b905080600954610c92919061337f565b3414610ce05760405162461bcd60e51b815260206004820152601b60248201527f50757263686173653a20496e636f7272656374207061796d656e7400000000006044820152606401610732565b610ceb848484611a64565b610d56336008805480602002602001604051908101604052809291908181526020018280548015610d3b57602002820191906000526020600020905b815481526020019060010190808311610d27575b50505050508660405180602001604052806000815250611cd7565b6040513390610d679060089061339e565b60405180910390207fb19a0e54a0d12c649f962287d12e0573df3d188f5fcad44083dd0a11e759bcc586604051610d9e9190612fc1565b60405180910390a350505050565b6000546001600160a01b03610100909104163314610dfa5760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa96000611ead565b6000546001600160a01b03610100909104163314610e525760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600a55565b6000546001600160a01b03610100909104163314610ea55760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b610aa9611f13565b6000546001600160a01b03610100909104163314610efb5760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b600955565b600084600081518110610f1557610f15613320565b602002602001015185600181518110610f3057610f30613320565b602002602001015186600281518110610f4b57610f4b613320565b60200260200101518685604051602001610f9b959493929190948552602085019390935260408401919091526060808401919091521b6bffffffffffffffffffffffff1916608082015260940190565b604051602081830303815290604052805190602001209050600061101684611010846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611f8e565b600d549091506001600160a01b038083169116146110765760405162461bcd60e51b815260206004820152601560248201527f4e6f74207369676e6564206279207761746368657200000000000000000000006044820152606401610732565b505050505050565b600c805461081c906132a6565b6000546001600160a01b036101009091041633146110d95760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b816110e45760058190555b60018214156110f35760068190555b60028214156111025760078190555b5050565b611102338383611faa565b6001600160a01b03851633148061112d575061112d853361061f565b61118b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610732565b610a4c858585858561208b565b6000546001600160a01b036101009091041633146111e65760405162461bcd60e51b815260206004820181905260248201526000805160206135d98339815191526044820152606401610732565b6001600160a01b03811661124b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610732565b61080c81611ead565b60005460ff161561129a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b84836002815181106112ae576112ae613320565b6020026020010151846001815181106112c9576112c9613320565b6020026020010151856000815181106112e4576112e4613320565b6020026020010151600e6000336001600160a01b03166001600160a01b031681526020019081526020016000205461131c9190613367565b6113269190613367565b6113309190613367565b11156113a45760405162461bcd60e51b815260206004820152603a60248201527f436c61696d3a206d617820636c61696d61626c6520616d6f756e74206f66206360448201527f757272656e7420616464726573732069732072656163686564210000000000006064820152608401610732565b600085336040516020016113d492919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090506113f985600a5483612248565b6114455760405162461bcd60e51b815260206004820152601660248201527f4d65726b6c653a20496e76616c69642070726f6f662e000000000000000000006044820152606401610732565b611450848484611a64565b8360028151811061146357611463613320565b60200260200101518460018151811061147e5761147e613320565b60200260200101518560008151811061149957611499613320565b60200260200101516114ab9190613367565b6114b59190613367565b336000908152600e6020526040812080549091906114d4908490613367565b92505081905550611544336008805480602002602001604051908101604052809291908181526020018280548015610d3b5760200282019190600052602060002090815481526020019060010190808311610d275750505050508660405180602001604052806000815250611cd7565b60405133906115559060089061339e565b60405180910390207f9c4c54f7476d9aa900cdb52f2fbf3e00924d02389c9b2401d3ecee109eb988cd8660405161158c9190612fc1565b60405180910390a3505050505050565b8051611102906003906020840190612ab6565b6060600380546115be906132a6565b80601f01602080910402602001604051908101604052809291908181526020018280546115ea906132a6565b80156116375780601f1061160c57610100808354040283529160200191611637565b820191906000526020600020905b81548152906001019060200180831161161a57829003601f168201915b50505050509050919050565b6060816116675750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611691578061167b8161334c565b915061168a9050600a836133f1565b915061166b565b60008167ffffffffffffffff8111156116ac576116ac612bcf565b6040519080825280601f01601f1916602001820160405280156116d6576020820181803683370190505b5090505b8415611759576116eb600183613405565b91506116f8600a8661341c565b611703906030613367565b60f81b81838151811061171857611718613320565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611752600a866133f1565b94506116da565b949350505050565b81518351146117c35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610732565b6001600160a01b0384166118275760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610732565b3361183681878787878761225e565b60005b845181101561196257600085828151811061185657611856613320565b60200260200101519050600085838151811061187457611874613320565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156119085760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610732565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611947908490613367565b925050819055505050508061195b9061334c565b9050611839565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b2929190613430565b60405180910390a461107681878787878761226c565b60005460ff16611a1a5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610732565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600f602052604090205460ff1615611ac35760405162461bcd60e51b815260206004820152601a60248201527f52657573696e67206e6f6e636520697320666f7262696464656e0000000000006044820152606401610732565b6000828152600f60205260408120805460ff19166001179055835184908290611aee57611aee613320565b60200260200101519050600084600181518110611b0d57611b0d613320565b60200260200101519050600085600281518110611b2c57611b2c613320565b60200260200101519050611b4b60008081526004602052604090205490565b611b559084613367565b6005541015611bb25760405162461bcd60e51b815260206004820152602360248201527f50757263686173653a20657863656564206469616d6f6e64206c616e64206c696044820152621b5a5d60ea1b6064820152608401610732565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0554611be89083613367565b6006541015611c395760405162461bcd60e51b815260206004820181905260248201527f50757263686173653a2065786365656420676f6c64206c616e64206c696d69746044820152606401610732565b600260005260046020527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754611c6f9082613367565b6007541015611ccb5760405162461bcd60e51b815260206004820152602260248201527f50757263686173653a206578636565642073696c766572206c616e64206c696d6044820152611a5d60f21b6064820152608401610732565b61107686868633610f00565b6001600160a01b038416611d375760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610732565b8151835114611d995760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610732565b33611da98160008787878761225e565b60005b8451811015611e4557838181518110611dc757611dc7613320565b602002602001015160016000878481518110611de557611de5613320565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611e2d9190613367565b90915550819050611e3d8161334c565b915050611dac565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e96929190613430565b60405180910390a4610a4c8160008787878761226c565b600080546001600160a01b0383811661010081810274ffffffffffffffffffffffffffffffffffffffff0019851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611f595760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610732565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a473390565b6000806000611f9d858561242a565b91509150610bcd8161249a565b816001600160a01b0316836001600160a01b0316141561201e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610732565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166120ef5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610732565b3360006120fb85612655565b9050600061210885612655565b905061211883898985858961225e565b60008681526001602090815260408083206001600160a01b038c1684529091529020548581101561219e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610732565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906121dd908490613367565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461223d848a8a8a8a8a6126a0565b505050505050505050565b60008261225585846127ab565b14949350505050565b611076868686868686612817565b6001600160a01b0384163b156110765760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906122b0908990899088908890889060040161345e565b602060405180830381600087803b1580156122ca57600080fd5b505af19250505080156122fa575060408051601f3d908101601f191682019092526122f7918101906134bc565b60015b6123b0576123066134d9565b806308c379a01415612340575061231b6134f5565b806123265750612342565b8060405162461bcd60e51b81526004016107329190612d30565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610732565b6001600160e01b0319811663bc197c8160e01b146124215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610732565b50505050505050565b6000808251604114156124615760208301516040840151606085015160001a61245587828585612990565b94509450505050612493565b82516040141561248b5760208301516040840151612480868383612a7d565b935093505050612493565b506000905060025b9250929050565b60008160048111156124ae576124ae61357f565b14156124b75750565b60018160048111156124cb576124cb61357f565b14156125195760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610732565b600281600481111561252d5761252d61357f565b141561257b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610732565b600381600481111561258f5761258f61357f565b14156125e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610732565b60048160048111156125fc576125fc61357f565b141561080c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610732565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061268f5761268f613320565b602090810291909101015292915050565b6001600160a01b0384163b156110765760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906126e49089908990889088908890600401613595565b602060405180830381600087803b1580156126fe57600080fd5b505af192505050801561272e575060408051601f3d908101601f1916820190925261272b918101906134bc565b60015b61273a576123066134d9565b6001600160e01b0319811663f23a6e6160e01b146124215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610732565b600081815b8451811015610bcd5760008582815181106127cd576127cd613320565b602002602001015190508083116127f35760008381526020829052604090209250612804565b600081815260208490526040902092505b508061280f8161334c565b9150506127b0565b6001600160a01b03851661289e5760005b835181101561289c5782818151811061284357612843613320565b60200260200101516004600086848151811061286157612861613320565b6020026020010151815260200190815260200160002060008282546128869190613367565b9091555061289590508161334c565b9050612828565b505b6001600160a01b0384166110765760005b83518110156124215760008482815181106128cc576128cc613320565b6020026020010151905060008483815181106128ea576128ea613320565b602002602001015190506000600460008481526020019081526020016000205490508181101561296d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610732565b600092835260046020526040909220910390556129898161334c565b90506128af565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129c75750600090506003612a74565b8460ff16601b141580156129df57508460ff16601c14155b156129f05750600090506004612a74565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a44573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a6d57600060019250925050612a74565b9150600090505b94509492505050565b6000806001600160ff1b03831681612a9a60ff86901c601b613367565b9050612aa887828885612990565b935093505050935093915050565b828054612ac2906132a6565b90600052602060002090601f016020900481019282612ae45760008555612b2a565b82601f10612afd57805160ff1916838001178555612b2a565b82800160010185558215612b2a579182015b82811115612b2a578251825591602001919060010190612b0f565b50612b36929150612b3a565b5090565b5b80821115612b365760008155600101612b3b565b80356001600160a01b0381168114612b6657600080fd5b919050565b60008060408385031215612b7e57600080fd5b612b8783612b4f565b946020939093013593505050565b6001600160e01b03198116811461080c57600080fd5b600060208284031215612bbd57600080fd5b8135612bc881612b95565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612c0b57612c0b612bcf565b6040525050565b600067ffffffffffffffff831115612c2c57612c2c612bcf565b604051612c43601f8501601f191660200182612be5565b809150838152848484011115612c5857600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612c8257600080fd5b813567ffffffffffffffff811115612c9957600080fd5b8201601f81018413612caa57600080fd5b61175984823560208401612c12565b600060208284031215612ccb57600080fd5b612bc882612b4f565b60005b83811015612cef578181015183820152602001612cd7565b83811115612cfe576000848401525b50505050565b60008151808452612d1c816020860160208601612cd4565b601f01601f19169290920160200192915050565b602081526000612bc86020830184612d04565b600060208284031215612d5557600080fd5b5035919050565b600067ffffffffffffffff821115612d7657612d76612bcf565b5060051b60200190565b600082601f830112612d9157600080fd5b81356020612d9e82612d5c565b604051612dab8282612be5565b83815260059390931b8501820192828101915086841115612dcb57600080fd5b8286015b84811015612de65780358352918301918301612dcf565b509695505050505050565b600082601f830112612e0257600080fd5b612bc883833560208501612c12565b600080600080600060a08688031215612e2957600080fd5b612e3286612b4f565b9450612e4060208701612b4f565b9350604086013567ffffffffffffffff80821115612e5d57600080fd5b612e6989838a01612d80565b94506060880135915080821115612e7f57600080fd5b612e8b89838a01612d80565b93506080880135915080821115612ea157600080fd5b50612eae88828901612df1565b9150509295509295909350565b60008060408385031215612ece57600080fd5b823567ffffffffffffffff80821115612ee657600080fd5b818501915085601f830112612efa57600080fd5b81356020612f0782612d5c565b604051612f148282612be5565b83815260059390931b8501820192828101915089841115612f3457600080fd5b948201945b83861015612f5957612f4a86612b4f565b82529482019490820190612f39565b96505086013592505080821115612f6f57600080fd5b50612f7c85828601612d80565b9150509250929050565b600081518084526020808501945080840160005b83811015612fb657815187529582019590820190600101612f9a565b509495945050505050565b602081526000612bc86020830184612f86565b600080600060608486031215612fe957600080fd5b833567ffffffffffffffff8082111561300157600080fd5b61300d87838801612d80565b945060208601359350604086013591508082111561302a57600080fd5b5061303786828701612df1565b9150509250925092565b6000806000806080858703121561305757600080fd5b843567ffffffffffffffff8082111561306f57600080fd5b61307b88838901612d80565b955060208701359450604087013591508082111561309857600080fd5b506130a587828801612df1565b9250506130b460608601612b4f565b905092959194509250565b600080604083850312156130d257600080fd5b50508035926020909101359150565b600080604083850312156130f457600080fd5b6130fd83612b4f565b91506020830135801515811461311257600080fd5b809150509250929050565b6000806040838503121561313057600080fd5b61313983612b4f565b915061314760208401612b4f565b90509250929050565b600080600080600060a0868803121561316857600080fd5b61317186612b4f565b945061317f60208701612b4f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156131a957600080fd5b612eae88828901612df1565b600080600080600060a086880312156131cd57600080fd5b8535945060208087013567ffffffffffffffff808211156131ed57600080fd5b818901915089601f83011261320157600080fd5b813561320c81612d5c565b6040516132198282612be5565b82815260059290921b840185019185810191508c83111561323957600080fd5b938501935b828510156132575784358252938501939085019061323e565b98505050604089013592508083111561326f57600080fd5b61327b8a848b01612d80565b955060608901359450608089013592508083111561329857600080fd5b5050612eae88828901612df1565b600181811c908216806132ba57607f821691505b602082108114156132db57634e487b7160e01b600052602260045260246000fd5b50919050565b600083516132f3818460208801612cd4565b835190830190613307818360208801612cd4565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561336057613360613336565b5060010190565b6000821982111561337a5761337a613336565b500190565b600081600019048311821515161561339957613399613336565b500290565b60008183548391508460005260208060002060005b838110156133cf578154855293820193600191820191016133b3565b50929695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082613400576134006133db565b500490565b60008282101561341757613417613336565b500390565b60008261342b5761342b6133db565b500690565b6040815260006134436040830185612f86565b82810360208401526134558185612f86565b95945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261348a60a0830186612f86565b828103606084015261349c8186612f86565b905082810360808401526134b08185612d04565b98975050505050505050565b6000602082840312156134ce57600080fd5b8151612bc881612b95565b600060033d11156134f25760046000803e5060005160e01c5b90565b600060443d10156135035790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561353357505050505090565b828501915081518181111561354b5750505050505090565b843d87010160208285010111156135655750505050505090565b61357460208286010187612be5565b509095945050505050565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526135cd60a0830184612d04565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220fb423a940a870bf111a1365c0e512cd19adf20ddc4bca017bf9389a0388dd62d64736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000009333c3a74bd781038dcc9a2d6a7297180d94025d000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000f2700000000000000000000000000000000000000000000000000000000000000075242434c616e640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045242434c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5369586837654374396b4438636e6255616477754e376b3759623264414d51336b373944664d4759576878362f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): RBCLand
Arg [1] : _symbol (string): RBCL
Arg [2] : _uri (string): https://gateway.pinata.cloud/ipfs/QmSiXh7eCt9kD8cnbUadwuN7k7Yb2dAMQ3k79DfMGYWhx6/
Arg [3] : _watcher (address): 0x9333c3a74BD781038dcc9a2d6A7297180d94025d
Arg [4] : _landAmounts (uint256[3]): 40,80,3879

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 0000000000000000000000009333c3a74bd781038dcc9a2d6a7297180d94025d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000f27
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 5242434c616e6400000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 5242434c00000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [12] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [13] : 732f516d5369586837654374396b4438636e6255616477754e376b3759623264
Arg [14] : 414d51336b373944664d4759576878362f000000000000000000000000000000


Deployed Bytecode Sourcemap

57792:6215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40210:231;;;;;;;;;;-1:-1:-1;40210:231:0;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;40210:231:0;;;;;;;;39233:310;;;;;;;;;;-1:-1:-1;39233:310:0;;;;;:::i;:::-;;:::i;:::-;;;1207:14:1;;1200:22;1182:41;;1170:2;1155:18;39233:310:0;1042:187:1;59675:93:0;;;;;;;;;;-1:-1:-1;59675:93:0;;;;;:::i;:::-;;:::i;:::-;;58403:48;;;;;;;;;;-1:-1:-1;58403:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;58318:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58035:35::-;;;;;;;;;;;;;;;;63733:271;;;;;;;;;;-1:-1:-1;63733:271:0;;;;;:::i;:::-;;:::i;59996:94::-;;;;;;;;;;-1:-1:-1;59996:94:0;;;;;:::i;:::-;;:::i;42149:442::-;;;;;;;;;;-1:-1:-1;42149:442:0;;;;;:::i;:::-;;:::i;58284:25::-;;;;;;;;;;;;;;;;59600:67;;;;;;;;;;;;;:::i;40607:524::-;;;;;;;;;;-1:-1:-1;40607:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56545:122::-;;;;;;;;;;-1:-1:-1;56545:122:0;;;;;:::i;:::-;56602:4;56423:16;;;:12;:16;;;;;;-1:-1:-1;;;56545:122:0;61112:530;;;;;;:::i;:::-;;:::i;2130:86::-;;;;;;;;;;-1:-1:-1;2177:4:0;2201:7;;;2130:86;;58458:42;;;;;;;;;;-1:-1:-1;58458:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58247:28;;;;;;;;;;;;;;;;19392:103;;;;;;;;;;;;;:::i;59882:106::-;;;;;;;;;;-1:-1:-1;59882:106:0;;;;;:::i;:::-;;:::i;59529:63::-;;;;;;;;;;;;;:::i;18741:87::-;;;;;;;;;;-1:-1:-1;18787:7:0;18814:6;;;;-1:-1:-1;;;;;18814:6:0;18741:87;;;-1:-1:-1;;;;;8858:55:1;;;8840:74;;8828:2;8813:18;18741:87:0;8694:226:1;59776:98:0;;;;;;;;;;-1:-1:-1;59776:98:0;;;;;:::i;:::-;;:::i;60515:589::-;;;;;;;;;;-1:-1:-1;60515:589:0;;;;;:::i;:::-;;:::i;58343:20::-;;;;;;;;;;;;;:::i;60098:409::-;;;;;;;;;;-1:-1:-1;60098:409:0;;;;;:::i;:::-;;:::i;41204:155::-;;;;;;;;;;-1:-1:-1;41204:155:0;;;;;:::i;:::-;;:::i;58077:42::-;;;;;;;;;;;;58118:1;58077:42;;56334:113;;;;;;;;;;-1:-1:-1;56334:113:0;;;;;:::i;:::-;56396:7;56423:16;;;:12;:16;;;;;;;56334:113;58126:37;;;;;;;;;;;;;;;;58372:22;;;;;;;;;;-1:-1:-1;58372:22:0;;;;-1:-1:-1;;;;;58372:22:0;;;57943:38;;;;;;;;;;;;;;;;41431:168;;;;;;;;;;-1:-1:-1;41431:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;41554:27:0;;;41530:4;41554:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;41431:168;57893:43;;;;;;;;;;;;57935:1;57893:43;;41671:401;;;;;;;;;;-1:-1:-1;41671:401:0;;;;;:::i;:::-;;:::i;19650:201::-;;;;;;;;;;-1:-1:-1;19650:201:0;;;;;:::i;:::-;;:::i;62768:957::-;;;;;;:::i;:::-;;:::i;57988:40::-;;;;;;;;;;;;58027:1;57988:40;;40210:231;40296:7;-1:-1:-1;;;;;40324:21:0;;40316:77;;;;-1:-1:-1;;;40316:77:0;;12864:2:1;40316:77:0;;;12846:21:1;12903:2;12883:18;;;12876:30;12942:34;12922:18;;;12915:62;-1:-1:-1;;;12993:18:1;;;12986:41;13044:19;;40316:77:0;;;;;;;;;-1:-1:-1;40411:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;40411:22:0;;;;;;;;;;;;40210:231::o;39233:310::-;39335:4;-1:-1:-1;;;;;;39372:41:0;;-1:-1:-1;;;39372:41:0;;:110;;-1:-1:-1;;;;;;;39430:52:0;;-1:-1:-1;;;39430:52:0;39372:110;:163;;;-1:-1:-1;;;;;;;;;;38082:40:0;;;39499:36;39352:183;39233:310;-1:-1:-1;;39233:310:0:o;59675:93::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;59744:16:::1;59752:7;59744;:16::i;:::-;59675:93:::0;:::o;58318:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63733:271::-;56602:4;56423:16;;;:12;:16;;;;;;63789:13;;63815:46;;;;-1:-1:-1;;;63815:46:0;;14022:2:1;63815:46:0;;;14004:21:1;14061:2;14041:18;;;14034:30;14100:24;14080:18;;;14073:52;14142:18;;63815:46:0;13820:346:1;63815:46:0;63934:14;63944:3;63934:9;:14::i;:::-;63950:21;63967:3;63950:16;:21::i;:::-;63917:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63872:124;;63733:271;;;:::o;59996:94::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;60064:7:::1;:18:::0;;-1:-1:-1;;60064:18:0::1;-1:-1:-1::0;;;;;60064:18:0;;;::::1;::::0;;;::::1;::::0;;59996:94::o;42149:442::-;-1:-1:-1;;;;;42382:20:0;;860:10;42382:20;;:60;;-1:-1:-1;42406:36:0;42423:4;860:10;41431:168;:::i;42406:36::-;42360:160;;;;-1:-1:-1;;;42360:160:0;;15015:2:1;42360:160:0;;;14997:21:1;15054:2;15034:18;;;15027:30;15093:34;15073:18;;;15066:62;15164:20;15144:18;;;15137:48;15202:19;;42360:160:0;14813:414:1;42360:160:0;42531:52;42554:4;42560:2;42564:3;42569:7;42578:4;42531:22;:52::i;:::-;42149:442;;;;;:::o;59600:67::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;59649:10:::1;:8;:10::i;:::-;59600:67::o:0;40607:524::-;40763:16;40824:3;:10;40805:8;:15;:29;40797:83;;;;-1:-1:-1;;;40797:83:0;;15434:2:1;40797:83:0;;;15416:21:1;15473:2;15453:18;;;15446:30;15512:34;15492:18;;;15485:62;-1:-1:-1;;;15563:18:1;;;15556:39;15612:19;;40797:83:0;15232:405:1;40797:83:0;40893:30;40940:8;:15;40926:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40926:30:0;;40893:63;;40974:9;40969:122;40993:8;:15;40989:1;:19;40969:122;;;41049:30;41059:8;41068:1;41059:11;;;;;;;;:::i;:::-;;;;;;;41072:3;41076:1;41072:6;;;;;;;;:::i;:::-;;;;;;;41049:9;:30::i;:::-;41030:13;41044:1;41030:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;41010:3;;;:::i;:::-;;;40969:122;;;-1:-1:-1;41110:13:0;40607:524;-1:-1:-1;;;40607:524:0:o;61112:530::-;2177:4;2201:7;;;2455:9;2447:38;;;;-1:-1:-1;;;2447:38:0;;16248:2:1;2447:38:0;;;16230:21:1;16287:2;16267:18;;;16260:30;-1:-1:-1;;;16306:18:1;;;16299:46;16362:18;;2447:38:0;16046:340:1;2447:38:0;61271:19:::1;61319:7;61327:1;61319:10;;;;;;;;:::i;:::-;;;;;;;61306:7;61314:1;61306:10;;;;;;;;:::i;:::-;;;;;;;61293:7;61301:1;61293:10;;;;;;;;:::i;:::-;;;;;;;:23;;;;:::i;:::-;:36;;;;:::i;:::-;61271:58;;61387:11;61375:9;;:23;;;;:::i;:::-;61362:9;:36;61340:113;;;::::0;-1:-1:-1;;;61340:113:0;;16899:2:1;61340:113:0::1;::::0;::::1;16881:21:1::0;16938:2;16918:18;;;16911:30;16977:29;16957:18;;;16950:57;17024:18;;61340:113:0::1;16697:351:1::0;61340:113:0::1;61466:54;61494:7;61503:5;61510:9;61466:27;:54::i;:::-;61533:45;61544:10;61556:8;61533:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61566:7;61533:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;61594:40;::::0;61614:10:::1;::::0;61594:40:::1;::::0;61604:8:::1;::::0;61594:40:::1;:::i;:::-;;;;;;;;;61626:7;61594:40;;;;;;:::i;:::-;;;;;;;;61260:382;61112:530:::0;;;:::o;19392:103::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;19457:30:::1;19484:1;19457:18;:30::i;59882:106::-:0;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;59956:10:::1;:24:::0;59882:106::o;59529:63::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;59576:8:::1;:6;:8::i;59776:98::-:0;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;59844:9:::1;:22:::0;59776:98::o;60515:589::-;60695:15;60772:7;60780:1;60772:10;;;;;;;;:::i;:::-;;;;;;;60801:7;60809:1;60801:10;;;;;;;;:::i;:::-;;;;;;;60830:7;60838:1;60830:10;;;;;;;;:::i;:::-;;;;;;;60859:5;60883:8;60737:169;;;;;;;;;;;17865:19:1;;;17909:2;17900:12;;17893:28;;;;17946:2;17937:12;;17930:28;;;;17983:2;17974:12;;;17967:28;;;;18030:15;-1:-1:-1;;18026:53:1;18020:3;18011:13;;18004:76;18105:3;18096:13;;17624:491;60737:169:0;;;;;;;;;;;;;60713:204;;;;;;60695:222;;60928:21;60952:75;61007:9;60952:32;:7;16562:58;;25080:66:1;16562:58:0;;;25068:79:1;25163:12;;;25156:28;;;16429:7:0;;25200:12:1;;16562:58:0;;;;;;;;;;;;16552:69;;;;;;16545:76;;16360:269;;;;60952:32;:40;;:75::i;:::-;61063:7;;60928:99;;-1:-1:-1;;;;;;61046:24:0;;;61063:7;;61046:24;61038:58;;;;-1:-1:-1;;;61038:58:0;;18322:2:1;61038:58:0;;;18304:21:1;18361:2;18341:18;;;18334:30;18400:23;18380:18;;;18373:51;18441:18;;61038:58:0;18120:345:1;61038:58:0;60684:420;;60515:589;;;;:::o;58343:20::-;;;;;;;:::i;60098:409::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;60216:26;60212:92:::1;;60259:19;:33:::0;;;60212:92:::1;58027:1;60318:7;:23;60314:86;;;60358:16;:30:::0;;;60314:86:::1;58118:1;60414:7;:25;60410:90;;;60456:18;:32:::0;;;60410:90:::1;60098:409:::0;;:::o;41204:155::-;41299:52;860:10;41332:8;41342;41299:18;:52::i;41671:401::-;-1:-1:-1;;;;;41879:20:0;;860:10;41879:20;;:60;;-1:-1:-1;41903:36:0;41920:4;860:10;41431:168;:::i;41903:36::-;41857:151;;;;-1:-1:-1;;;41857:151:0;;18672:2:1;41857:151:0;;;18654:21:1;18711:2;18691:18;;;18684:30;18750:34;18730:18;;;18723:62;-1:-1:-1;;;18801:18:1;;;18794:39;18850:19;;41857:151:0;18470:405:1;41857:151:0;42019:45;42037:4;42043:2;42047;42051:6;42059:4;42019:17;:45::i;19650:201::-;18787:7;18814:6;-1:-1:-1;;;;;18814:6:0;;;;;860:10;18961:23;18953:68;;;;-1:-1:-1;;;18953:68:0;;13276:2:1;18953:68:0;;;13258:21:1;;;13295:18;;;13288:30;-1:-1:-1;;;;;;;;;;;13334:18:1;;;13327:62;13406:18;;18953:68:0;13074:356:1;18953:68:0;-1:-1:-1;;;;;19739:22:0;::::1;19731:73;;;::::0;-1:-1:-1;;;19731:73:0;;19082:2:1;19731:73:0::1;::::0;::::1;19064:21:1::0;19121:2;19101:18;;;19094:30;19160:34;19140:18;;;19133:62;-1:-1:-1;;;19211:18:1;;;19204:36;19257:19;;19731:73:0::1;18880:402:1::0;19731:73:0::1;19815:28;19834:8;19815:18;:28::i;62768:957::-:0;2177:4;2201:7;;;2455:9;2447:38;;;;-1:-1:-1;;;2447:38:0;;16248:2:1;2447:38:0;;;16230:21:1;16287:2;16267:18;;;16260:30;-1:-1:-1;;;16306:18:1;;;16299:46;16362:18;;2447:38:0;16046:340:1;2447:38:0;63111:18:::1;63080:7;63088:1;63080:10;;;;;;;;:::i;:::-;;;;;;;63067:7;63075:1;63067:10;;;;;;;;:::i;:::-;;;;;;;63054:7;63062:1;63054:10;;;;;;;;:::i;:::-;;;;;;;63026:13;:25;63040:10;-1:-1:-1::0;;;;;63026:25:0::1;-1:-1:-1::0;;;;;63026:25:0::1;;;;;;;;;;;;;:38;;;;:::i;:::-;:51;;;;:::i;:::-;:64;;;;:::i;:::-;:103;;63004:211;;;::::0;-1:-1:-1;;;63004:211:0;;19489:2:1;63004:211:0::1;::::0;::::1;19471:21:1::0;19528:2;19508:18;;;19501:30;19567:34;19547:18;;;19540:62;19638:28;19618:18;;;19611:56;19684:19;;63004:211:0::1;19287:422:1::0;63004:211:0::1;63228:12;63284:18;63304:10;63267:48;;;;;;;;19871:19:1::0;;;19928:2;19924:15;-1:-1:-1;;19920:53:1;19915:2;19906:12;;19899:75;19999:2;19990:12;;19714:294;63267:48:0::1;;;;;;;;;;;;;63243:83;;;;;;63228:98;;63361:49;63380:11;63393:10;;63405:4;63361:18;:49::i;:::-;63339:121;;;::::0;-1:-1:-1;;;63339:121:0;;20215:2:1;63339:121:0::1;::::0;::::1;20197:21:1::0;20254:2;20234:18;;;20227:30;20293:24;20273:18;;;20266:52;20335:18;;63339:121:0::1;20013:346:1::0;63339:121:0::1;63473:54;63501:7;63510:5;63517:9;63473:27;:54::i;:::-;63595:7;63603:1;63595:10;;;;;;;;:::i;:::-;;;;;;;63582:7;63590:1;63582:10;;;;;;;;:::i;:::-;;;;;;;63569:7;63577:1;63569:10;;;;;;;;:::i;:::-;;;;;;;:23;;;;:::i;:::-;:36;;;;:::i;:::-;63554:10;63540:25;::::0;;;:13:::1;:25;::::0;;;;:65;;:25;;;:65:::1;::::0;;;::::1;:::i;:::-;;;;;;;;63618:45;63629:10;63641:8;63618:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63651:7;63618:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;63679:38;::::0;63697:10:::1;::::0;63679:38:::1;::::0;63687:8:::1;::::0;63679:38:::1;:::i;:::-;;;;;;;;;63709:7;63679:38;;;;;;:::i;:::-;;;;;;;;62993:732;62768:957:::0;;;;;:::o;46377:88::-;46444:13;;;;:4;;:13;;;;;:::i;39954:105::-;40014:13;40047:4;40040:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39954:105;;;:::o;6378:723::-;6434:13;6655:10;6651:53;;-1:-1:-1;;6682:10:0;;;;;;;;;;;;-1:-1:-1;;;6682:10:0;;;;;6378:723::o;6651:53::-;6729:5;6714:12;6770:78;6777:9;;6770:78;;6803:8;;;;:::i;:::-;;-1:-1:-1;6826:10:0;;-1:-1:-1;6834:2:0;6826:10;;:::i;:::-;;;6770:78;;;6858:19;6890:6;6880:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6880:17:0;;6858:39;;6908:154;6915:10;;6908:154;;6942:11;6952:1;6942:11;;:::i;:::-;;-1:-1:-1;7011:10:0;7019:2;7011:5;:10;:::i;:::-;6998:24;;:2;:24;:::i;:::-;6985:39;;6968:6;6975;6968:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;7039:11:0;7048:2;7039:11;;:::i;:::-;;;6908:154;;;7086:6;6378:723;-1:-1:-1;;;;6378:723:0:o;44387:1146::-;44614:7;:14;44600:3;:10;:28;44592:81;;;;-1:-1:-1;;;44592:81:0;;21070:2:1;44592:81:0;;;21052:21:1;21109:2;21089:18;;;21082:30;21148:34;21128:18;;;21121:62;-1:-1:-1;;;21199:18:1;;;21192:38;21247:19;;44592:81:0;20868:404:1;44592:81:0;-1:-1:-1;;;;;44692:16:0;;44684:66;;;;-1:-1:-1;;;44684:66:0;;21479:2:1;44684:66:0;;;21461:21:1;21518:2;21498:18;;;21491:30;21557:34;21537:18;;;21530:62;-1:-1:-1;;;21608:18:1;;;21601:35;21653:19;;44684:66:0;21277:401:1;44684:66:0;860:10;44807:60;860:10;44838:4;44844:2;44848:3;44853:7;44862:4;44807:20;:60::i;:::-;44885:9;44880:421;44904:3;:10;44900:1;:14;44880:421;;;44936:10;44949:3;44953:1;44949:6;;;;;;;;:::i;:::-;;;;;;;44936:19;;44970:14;44987:7;44995:1;44987:10;;;;;;;;:::i;:::-;;;;;;;;;;;;45014:19;45036:13;;;:9;:13;;;;;;-1:-1:-1;;;;;45036:19:0;;;;;;;;;;;;44987:10;;-1:-1:-1;45078:21:0;;;;45070:76;;;;-1:-1:-1;;;45070:76:0;;21885:2:1;45070:76:0;;;21867:21:1;21924:2;21904:18;;;21897:30;21963:34;21943:18;;;21936:62;-1:-1:-1;;;22014:18:1;;;22007:40;22064:19;;45070:76:0;21683:406:1;45070:76:0;45190:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;45190:19:0;;;;;;;;;;45212:20;;;45190:42;;45262:17;;;;;;;:27;;45212:20;;45190:13;45262:27;;45212:20;;45262:27;:::i;:::-;;;;;;;;44921:380;;;44916:3;;;;:::i;:::-;;;44880:421;;;;45348:2;-1:-1:-1;;;;;45318:47:0;45342:4;-1:-1:-1;;;;;45318:47:0;45332:8;-1:-1:-1;;;;;45318:47:0;;45352:3;45357:7;45318:47;;;;;;;:::i;:::-;;;;;;;;45450:75;45486:8;45496:4;45502:2;45506:3;45511:7;45520:4;45450:35;:75::i;3189:120::-;2177:4;2201:7;;;2725:41;;;;-1:-1:-1;;;2725:41:0;;22766:2:1;2725:41:0;;;22748:21:1;22805:2;22785:18;;;22778:30;22844:22;22824:18;;;22817:50;22884:18;;2725:41:0;22564:344:1;2725:41:0;3258:5:::1;3248:15:::0;;-1:-1:-1;;3248:15:0::1;::::0;;3279:22:::1;860:10:::0;3288:12:::1;3279:22;::::0;-1:-1:-1;;;;;8858:55:1;;;8840:74;;8828:2;8813:18;3279:22:0::1;;;;;;;3189:120::o:0;61650:1110::-;61854:17;;;;:10;:17;;;;;;;;61853:18;61845:57;;;;-1:-1:-1;;;61845:57:0;;23115:2:1;61845:57:0;;;23097:21:1;23154:2;23134:18;;;23127:30;23193:28;23173:18;;;23166:56;23239:18;;61845:57:0;22913:350:1;61845:57:0;61913:17;;;;:10;:17;;;;;:24;;-1:-1:-1;;61913:24:0;61933:4;61913:24;;;61978:10;;:7;;61913:17;;61978:10;;;;:::i;:::-;;;;;;;61950:38;;61999:22;62024:7;62032:1;62024:10;;;;;;;;:::i;:::-;;;;;;;61999:35;;62045:24;62072:7;62080:1;62072:10;;;;;;;;:::i;:::-;;;;;;;62045:37;;62253:28;57935:1;56396:7;56423:16;;:12;:16;;;;;;;56334:113;62253:28;62233:48;;:17;:48;:::i;:::-;62193:19;;:88;;62171:173;;;;-1:-1:-1;;;62171:173:0;;23470:2:1;62171:173:0;;;23452:21:1;23509:2;23489:18;;;23482:30;23548:34;23528:18;;;23521:62;-1:-1:-1;;;23599:18:1;;;23592:33;23642:19;;62171:173:0;23268:399:1;62171:173:0;58027:1;56396:7;56423:16;:12;:16;;;;62397:42;;:14;:42;:::i;:::-;62377:16;;:62;;62355:144;;;;-1:-1:-1;;;62355:144:0;;23874:2:1;62355:144:0;;;23856:21:1;;;23893:18;;;23886:30;23952:34;23932:18;;;23925:62;24004:18;;62355:144:0;23672:356:1;62355:144:0;58118:1;56396:7;56423:16;:12;:16;;;;62571:46;;:16;:46;:::i;:::-;62532:18;;:85;;62510:169;;;;-1:-1:-1;;;62510:169:0;;24235:2:1;62510:169:0;;;24217:21:1;24274:2;24254:18;;;24247:30;24313:34;24293:18;;;24286:62;-1:-1:-1;;;24364:18:1;;;24357:32;24406:19;;62510:169:0;24033:398:1;62510:169:0;62692:60;62714:7;62723:5;62730:9;62741:10;62692:21;:60::i;47936:813::-;-1:-1:-1;;;;;48114:16:0;;48106:62;;;;-1:-1:-1;;;48106:62:0;;24638:2:1;48106:62:0;;;24620:21:1;24677:2;24657:18;;;24650:30;24716:34;24696:18;;;24689:62;-1:-1:-1;;;24767:18:1;;;24760:31;24808:19;;48106:62:0;24436:397:1;48106:62:0;48201:7;:14;48187:3;:10;:28;48179:81;;;;-1:-1:-1;;;48179:81:0;;21070:2:1;48179:81:0;;;21052:21:1;21109:2;21089:18;;;21082:30;21148:34;21128:18;;;21121:62;-1:-1:-1;;;21199:18:1;;;21192:38;21247:19;;48179:81:0;20868:404:1;48179:81:0;860:10;48317:66;860:10;48273:16;48360:2;48364:3;48369:7;48378:4;48317:20;:66::i;:::-;48401:9;48396:103;48420:3;:10;48416:1;:14;48396:103;;;48477:7;48485:1;48477:10;;;;;;;;:::i;:::-;;;;;;;48452:9;:17;48462:3;48466:1;48462:6;;;;;;;;:::i;:::-;;;;;;;48452:17;;;;;;;;;;;:21;48470:2;-1:-1:-1;;;;;48452:21:0;-1:-1:-1;;;;;48452:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;48432:3:0;;-1:-1:-1;48432:3:0;;;:::i;:::-;;;;48396:103;;;;48552:2;-1:-1:-1;;;;;48516:53:0;48548:1;-1:-1:-1;;;;;48516:53:0;48530:8;-1:-1:-1;;;;;48516:53:0;;48556:3;48561:7;48516:53;;;;;;;:::i;:::-;;;;;;;;48660:81;48696:8;48714:1;48718:2;48722:3;48727:7;48736:4;48660:35;:81::i;20011:191::-;20085:16;20104:6;;-1:-1:-1;;;;;20121:17:0;;;20104:6;20121:17;;;-1:-1:-1;;20121:17:0;;;;;20154:40;;20104:6;;;;;;;20121:17;;20104:6;;20154:40;;;20074:128;20011:191;:::o;2930:118::-;2177:4;2201:7;;;2455:9;2447:38;;;;-1:-1:-1;;;2447:38:0;;16248:2:1;2447:38:0;;;16230:21:1;16287:2;16267:18;;;16260:30;-1:-1:-1;;;16306:18:1;;;16299:46;16362:18;;2447:38:0;16046:340:1;2447:38:0;2990:7:::1;:14:::0;;-1:-1:-1;;2990:14:0::1;3000:4;2990:14;::::0;;3020:20:::1;3027:12;860:10:::0;;780:98;12558:231;12636:7;12657:17;12676:18;12698:27;12709:4;12715:9;12698:10;:27::i;:::-;12656:69;;;;12736:18;12748:5;12736:11;:18::i;51121:331::-;51276:8;-1:-1:-1;;;;;51267:17:0;:5;-1:-1:-1;;;;;51267:17:0;;;51259:71;;;;-1:-1:-1;;;51259:71:0;;25425:2:1;51259:71:0;;;25407:21:1;25464:2;25444:18;;;25437:30;25503:34;25483:18;;;25476:62;-1:-1:-1;;;25554:18:1;;;25547:39;25603:19;;51259:71:0;25223:405:1;51259:71:0;-1:-1:-1;;;;;51341:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;51341:46:0;;;;;;;;;;51403:41;;1182::1;;;51403::0;;1155:18:1;51403:41:0;;;;;;;51121:331;;;:::o;43055:974::-;-1:-1:-1;;;;;43243:16:0;;43235:66;;;;-1:-1:-1;;;43235:66:0;;21479:2:1;43235:66:0;;;21461:21:1;21518:2;21498:18;;;21491:30;21557:34;21537:18;;;21530:62;-1:-1:-1;;;21608:18:1;;;21601:35;21653:19;;43235:66:0;21277:401:1;43235:66:0;860:10;43314:16;43379:21;43397:2;43379:17;:21::i;:::-;43356:44;;43411:24;43438:25;43456:6;43438:17;:25::i;:::-;43411:52;;43476:60;43497:8;43507:4;43513:2;43517:3;43522:7;43531:4;43476:20;:60::i;:::-;43549:19;43571:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43571:19:0;;;;;;;;;;43609:21;;;;43601:76;;;;-1:-1:-1;;;43601:76:0;;21885:2:1;43601:76:0;;;21867:21:1;21924:2;21904:18;;;21897:30;21963:34;21943:18;;;21936:62;-1:-1:-1;;;22014:18:1;;;22007:40;22064:19;;43601:76:0;21683:406:1;43601:76:0;43713:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43713:19:0;;;;;;;;;;43735:20;;;43713:42;;43777:17;;;;;;;:27;;43735:20;;43713:13;43777:27;;43735:20;;43777:27;:::i;:::-;;;;-1:-1:-1;;43822:46:0;;;25807:25:1;;;25863:2;25848:18;;25841:34;;;-1:-1:-1;;;;;43822:46:0;;;;;;;;;;;;;;25780:18:1;43822:46:0;;;;;;;43953:68;43984:8;43994:4;44000:2;44004;44008:6;44016:4;43953:30;:68::i;:::-;43224:805;;;;43055:974;;;;;:::o;4542:190::-;4667:4;4720;4691:25;4704:5;4711:4;4691:12;:25::i;:::-;:33;;4542:190;-1:-1:-1;;;;4542:190:0:o;59184:337::-;59447:66;59474:8;59484:4;59490:2;59494:3;59499:7;59508:4;59447:26;:66::i;54564:813::-;-1:-1:-1;;;;;54804:13:0;;30129:19;:23;54800:570;;54840:79;;-1:-1:-1;;;54840:79:0;;-1:-1:-1;;;;;54840:43:0;;;;;:79;;54884:8;;54894:4;;54900:3;;54905:7;;54914:4;;54840:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54840:79:0;;;;;;;;-1:-1:-1;;54840:79:0;;;;;;;;;;;;:::i;:::-;;;54836:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;55232:6;55225:14;;-1:-1:-1;;;55225:14:0;;;;;;;;:::i;54836:523::-;;;55281:62;;-1:-1:-1;;;55281:62:0;;28057:2:1;55281:62:0;;;28039:21:1;28096:2;28076:18;;;28069:30;28135:34;28115:18;;;28108:62;28206:22;28186:18;;;28179:50;28246:19;;55281:62:0;27855:416:1;54836:523:0;-1:-1:-1;;;;;;55001:60:0;;-1:-1:-1;;;55001:60:0;54997:159;;55086:50;;-1:-1:-1;;;55086:50:0;;28478:2:1;55086:50:0;;;28460:21:1;28517:2;28497:18;;;28490:30;28556:34;28536:18;;;28529:62;-1:-1:-1;;;28607:18:1;;;28600:38;28655:19;;55086:50:0;28276:404:1;54997:159:0;54920:251;54564:813;;;;;;:::o;10448:1308::-;10529:7;10538:12;10763:9;:16;10783:2;10763:22;10759:990;;;11059:4;11044:20;;11038:27;11109:4;11094:20;;11088:27;11167:4;11152:20;;11146:27;10802:9;11138:36;11210:25;11221:4;11138:36;11038:27;11088;11210:10;:25::i;:::-;11203:32;;;;;;;;;10759:990;11257:9;:16;11277:2;11257:22;11253:496;;;11532:4;11517:20;;11511:27;11583:4;11568:20;;11562:27;11625:23;11636:4;11511:27;11562;11625:10;:23::i;:::-;11618:30;;;;;;;;11253:496;-1:-1:-1;11697:1:0;;-1:-1:-1;11701:35:0;11253:496;10448:1308;;;;;:::o;8719:643::-;8797:20;8788:5;:29;;;;;;;;:::i;:::-;;8784:571;;;8719:643;:::o;8784:571::-;8895:29;8886:5;:38;;;;;;;;:::i;:::-;;8882:473;;;8941:34;;-1:-1:-1;;;8941:34:0;;29019:2:1;8941:34:0;;;29001:21:1;29058:2;29038:18;;;29031:30;29097:26;29077:18;;;29070:54;29141:18;;8941:34:0;28817:348:1;8882:473:0;9006:35;8997:5;:44;;;;;;;;:::i;:::-;;8993:362;;;9058:41;;-1:-1:-1;;;9058:41:0;;29372:2:1;9058:41:0;;;29354:21:1;29411:2;29391:18;;;29384:30;29450:33;29430:18;;;29423:61;29501:18;;9058:41:0;29170:355:1;8993:362:0;9130:30;9121:5;:39;;;;;;;;:::i;:::-;;9117:238;;;9177:44;;-1:-1:-1;;;9177:44:0;;29732:2:1;9177:44:0;;;29714:21:1;29771:2;29751:18;;;29744:30;29810:34;29790:18;;;29783:62;-1:-1:-1;;;29861:18:1;;;29854:32;29903:19;;9177:44:0;29530:398:1;9117:238:0;9252:30;9243:5;:39;;;;;;;;:::i;:::-;;9239:116;;;9299:44;;-1:-1:-1;;;9299:44:0;;30135:2:1;9299:44:0;;;30117:21:1;30174:2;30154:18;;;30147:30;30213:34;30193:18;;;30186:62;-1:-1:-1;;;30264:18:1;;;30257:32;30306:19;;9299:44:0;29933:398:1;55385:198:0;55505:16;;;55519:1;55505:16;;;;;;;;;55451;;55480:22;;55505:16;;;;;;;;;;;;-1:-1:-1;55505:16:0;55480:41;;55543:7;55532:5;55538:1;55532:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;55570:5;55385:198;-1:-1:-1;;55385:198:0:o;53812:744::-;-1:-1:-1;;;;;54027:13:0;;30129:19;:23;54023:526;;54063:72;;-1:-1:-1;;;54063:72:0;;-1:-1:-1;;;;;54063:38:0;;;;;:72;;54102:8;;54112:4;;54118:2;;54122:6;;54130:4;;54063:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54063:72:0;;;;;;;;-1:-1:-1;;54063:72:0;;;;;;;;;;;;:::i;:::-;;;54059:479;;;;:::i;:::-;-1:-1:-1;;;;;;54185:55:0;;-1:-1:-1;;;54185:55:0;54181:154;;54265:50;;-1:-1:-1;;;54265:50:0;;28478:2:1;54265:50:0;;;28460:21:1;28517:2;28497:18;;;28490:30;28556:34;28536:18;;;28529:62;-1:-1:-1;;;28607:18:1;;;28600:38;28655:19;;54265:50:0;28276:404:1;5093:675:0;5176:7;5219:4;5176:7;5234:497;5258:5;:12;5254:1;:16;5234:497;;;5292:20;5315:5;5321:1;5315:8;;;;;;;;:::i;:::-;;;;;;;5292:31;;5358:12;5342;:28;5338:382;;5844:13;5894:15;;;5930:4;5923:15;;;5977:4;5961:21;;5470:57;;5338:382;;;5844:13;5894:15;;;5930:4;5923:15;;;5977:4;5961:21;;5647:57;;5338:382;-1:-1:-1;5272:3:0;;;;:::i;:::-;;;;5234:497;;56742:931;-1:-1:-1;;;;;57064:18:0;;57060:160;;57104:9;57099:110;57123:3;:10;57119:1;:14;57099:110;;;57183:7;57191:1;57183:10;;;;;;;;:::i;:::-;;;;;;;57159:12;:20;57172:3;57176:1;57172:6;;;;;;;;:::i;:::-;;;;;;;57159:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;57135:3:0;;-1:-1:-1;57135:3:0;;:::i;:::-;;;57099:110;;;;57060:160;-1:-1:-1;;;;;57236:16:0;;57232:434;;57274:9;57269:386;57293:3;:10;57289:1;:14;57269:386;;;57329:10;57342:3;57346:1;57342:6;;;;;;;;:::i;:::-;;;;;;;57329:19;;57367:14;57384:7;57392:1;57384:10;;;;;;;;:::i;:::-;;;;;;;57367:27;;57413:14;57430:12;:16;57443:2;57430:16;;;;;;;;;;;;57413:33;;57483:6;57473;:16;;57465:69;;;;-1:-1:-1;;;57465:69:0;;31127:2:1;57465:69:0;;;31109:21:1;31166:2;31146:18;;;31139:30;31205:34;31185:18;;;31178:62;-1:-1:-1;;;31256:18:1;;;31249:38;31304:19;;57465:69:0;30925:404:1;57465:69:0;57586:16;;;;:12;:16;;;;;;57605:15;;57586:34;;57305:3;;;:::i;:::-;;;57269:386;;14010:1632;14141:7;;15075:66;15062:79;;15058:163;;;-1:-1:-1;15174:1:0;;-1:-1:-1;15178:30:0;15158:51;;15058:163;15235:1;:7;;15240:2;15235:7;;:18;;;;;15246:1;:7;;15251:2;15246:7;;15235:18;15231:102;;;-1:-1:-1;15286:1:0;;-1:-1:-1;15290:30:0;15270:51;;15231:102;15447:24;;;15430:14;15447:24;;;;;;;;;31561:25:1;;;31634:4;31622:17;;31602:18;;;31595:45;;;;31656:18;;;31649:34;;;31699:18;;;31692:34;;;15447:24:0;;31533:19:1;;15447:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15447:24:0;;-1:-1:-1;;15447:24:0;;;-1:-1:-1;;;;;;;15486:20:0;;15482:103;;15539:1;15543:29;15523:50;;;;;;;15482:103;15605:6;-1:-1:-1;15613:20:0;;-1:-1:-1;14010:1632:0;;;;;;;;:::o;13052:344::-;13166:7;;-1:-1:-1;;;;;13212:80:0;;13166:7;13319:25;13335:3;13320:18;;;13342:2;13319:25;:::i;:::-;13303:42;;13363:25;13374:4;13380:1;13383;13386;13363:10;:25::i;:::-;13356:32;;;;;;13052:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:131::-;-1:-1:-1;;;;;;730:32:1;;720:43;;710:71;;777:1;774;767:12;792:245;850:6;903:2;891:9;882:7;878:23;874:32;871:52;;;919:1;916;909:12;871:52;958:9;945:23;977:30;1001:5;977:30;:::i;:::-;1026:5;792:245;-1:-1:-1;;;792:245:1:o;1234:127::-;1295:10;1290:3;1286:20;1283:1;1276:31;1326:4;1323:1;1316:15;1350:4;1347:1;1340:15;1366:249;1476:2;1457:13;;-1:-1:-1;;1453:27:1;1441:40;;1511:18;1496:34;;1532:22;;;1493:62;1490:88;;;1558:18;;:::i;:::-;1594:2;1587:22;-1:-1:-1;;1366:249:1:o;1620:469::-;1685:5;1719:18;1711:6;1708:30;1705:56;;;1741:18;;:::i;:::-;1790:2;1784:9;1802:69;1859:2;1838:15;;-1:-1:-1;;1834:29:1;1865:4;1830:40;1784:9;1802:69;:::i;:::-;1889:6;1880:15;;1919:6;1911;1904:22;1959:3;1950:6;1945:3;1941:16;1938:25;1935:45;;;1976:1;1973;1966:12;1935:45;2026:6;2021:3;2014:4;2006:6;2002:17;1989:44;2081:1;2074:4;2065:6;2057;2053:19;2049:30;2042:41;;1620:469;;;;;:::o;2094:451::-;2163:6;2216:2;2204:9;2195:7;2191:23;2187:32;2184:52;;;2232:1;2229;2222:12;2184:52;2272:9;2259:23;2305:18;2297:6;2294:30;2291:50;;;2337:1;2334;2327:12;2291:50;2360:22;;2413:4;2405:13;;2401:27;-1:-1:-1;2391:55:1;;2442:1;2439;2432:12;2391:55;2465:74;2531:7;2526:2;2513:16;2508:2;2504;2500:11;2465:74;:::i;2550:186::-;2609:6;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;2701:29;2720:9;2701:29;:::i;2741:258::-;2813:1;2823:113;2837:6;2834:1;2831:13;2823:113;;;2913:11;;;2907:18;2894:11;;;2887:39;2859:2;2852:10;2823:113;;;2954:6;2951:1;2948:13;2945:48;;;2989:1;2980:6;2975:3;2971:16;2964:27;2945:48;;2741:258;;;:::o;3004:::-;3046:3;3084:5;3078:12;3111:6;3106:3;3099:19;3127:63;3183:6;3176:4;3171:3;3167:14;3160:4;3153:5;3149:16;3127:63;:::i;:::-;3244:2;3223:15;-1:-1:-1;;3219:29:1;3210:39;;;;3251:4;3206:50;;3004:258;-1:-1:-1;;3004:258:1:o;3267:220::-;3416:2;3405:9;3398:21;3379:4;3436:45;3477:2;3466:9;3462:18;3454:6;3436:45;:::i;3492:180::-;3551:6;3604:2;3592:9;3583:7;3579:23;3575:32;3572:52;;;3620:1;3617;3610:12;3572:52;-1:-1:-1;3643:23:1;;3492:180;-1:-1:-1;3492:180:1:o;3677:183::-;3737:4;3770:18;3762:6;3759:30;3756:56;;;3792:18;;:::i;:::-;-1:-1:-1;3837:1:1;3833:14;3849:4;3829:25;;3677:183::o;3865:724::-;3919:5;3972:3;3965:4;3957:6;3953:17;3949:27;3939:55;;3990:1;3987;3980:12;3939:55;4026:6;4013:20;4052:4;4075:43;4115:2;4075:43;:::i;:::-;4147:2;4141:9;4159:31;4187:2;4179:6;4159:31;:::i;:::-;4225:18;;;4317:1;4313:10;;;;4301:23;;4297:32;;;4259:15;;;;-1:-1:-1;4341:15:1;;;4338:35;;;4369:1;4366;4359:12;4338:35;4405:2;4397:6;4393:15;4417:142;4433:6;4428:3;4425:15;4417:142;;;4499:17;;4487:30;;4537:12;;;;4450;;4417:142;;;-1:-1:-1;4577:6:1;3865:724;-1:-1:-1;;;;;;3865:724:1:o;4594:221::-;4636:5;4689:3;4682:4;4674:6;4670:17;4666:27;4656:55;;4707:1;4704;4697:12;4656:55;4729:80;4805:3;4796:6;4783:20;4776:4;4768:6;4764:17;4729:80;:::i;4820:943::-;4974:6;4982;4990;4998;5006;5059:3;5047:9;5038:7;5034:23;5030:33;5027:53;;;5076:1;5073;5066:12;5027:53;5099:29;5118:9;5099:29;:::i;:::-;5089:39;;5147:38;5181:2;5170:9;5166:18;5147:38;:::i;:::-;5137:48;;5236:2;5225:9;5221:18;5208:32;5259:18;5300:2;5292:6;5289:14;5286:34;;;5316:1;5313;5306:12;5286:34;5339:61;5392:7;5383:6;5372:9;5368:22;5339:61;:::i;:::-;5329:71;;5453:2;5442:9;5438:18;5425:32;5409:48;;5482:2;5472:8;5469:16;5466:36;;;5498:1;5495;5488:12;5466:36;5521:63;5576:7;5565:8;5554:9;5550:24;5521:63;:::i;:::-;5511:73;;5637:3;5626:9;5622:19;5609:33;5593:49;;5667:2;5657:8;5654:16;5651:36;;;5683:1;5680;5673:12;5651:36;;5706:51;5749:7;5738:8;5727:9;5723:24;5706:51;:::i;:::-;5696:61;;;4820:943;;;;;;;;:::o;5950:1208::-;6068:6;6076;6129:2;6117:9;6108:7;6104:23;6100:32;6097:52;;;6145:1;6142;6135:12;6097:52;6185:9;6172:23;6214:18;6255:2;6247:6;6244:14;6241:34;;;6271:1;6268;6261:12;6241:34;6309:6;6298:9;6294:22;6284:32;;6354:7;6347:4;6343:2;6339:13;6335:27;6325:55;;6376:1;6373;6366:12;6325:55;6412:2;6399:16;6434:4;6457:43;6497:2;6457:43;:::i;:::-;6529:2;6523:9;6541:31;6569:2;6561:6;6541:31;:::i;:::-;6607:18;;;6695:1;6691:10;;;;6683:19;;6679:28;;;6641:15;;;;-1:-1:-1;6719:19:1;;;6716:39;;;6751:1;6748;6741:12;6716:39;6775:11;;;;6795:148;6811:6;6806:3;6803:15;6795:148;;;6877:23;6896:3;6877:23;:::i;:::-;6865:36;;6828:12;;;;6921;;;;6795:148;;;6962:6;-1:-1:-1;;7006:18:1;;6993:32;;-1:-1:-1;;7037:16:1;;;7034:36;;;7066:1;7063;7056:12;7034:36;;7089:63;7144:7;7133:8;7122:9;7118:24;7089:63;:::i;:::-;7079:73;;;5950:1208;;;;;:::o;7163:435::-;7216:3;7254:5;7248:12;7281:6;7276:3;7269:19;7307:4;7336:2;7331:3;7327:12;7320:19;;7373:2;7366:5;7362:14;7394:1;7404:169;7418:6;7415:1;7412:13;7404:169;;;7479:13;;7467:26;;7513:12;;;;7548:15;;;;7440:1;7433:9;7404:169;;;-1:-1:-1;7589:3:1;;7163:435;-1:-1:-1;;;;;7163:435:1:o;7603:261::-;7782:2;7771:9;7764:21;7745:4;7802:56;7854:2;7843:9;7839:18;7831:6;7802:56;:::i;7869:635::-;7980:6;7988;7996;8049:2;8037:9;8028:7;8024:23;8020:32;8017:52;;;8065:1;8062;8055:12;8017:52;8105:9;8092:23;8134:18;8175:2;8167:6;8164:14;8161:34;;;8191:1;8188;8181:12;8161:34;8214:61;8267:7;8258:6;8247:9;8243:22;8214:61;:::i;:::-;8204:71;;8322:2;8311:9;8307:18;8294:32;8284:42;;8379:2;8368:9;8364:18;8351:32;8335:48;;8408:2;8398:8;8395:16;8392:36;;;8424:1;8421;8414:12;8392:36;;8447:51;8490:7;8479:8;8468:9;8464:24;8447:51;:::i;:::-;8437:61;;;7869:635;;;;;:::o;8925:710::-;9045:6;9053;9061;9069;9122:3;9110:9;9101:7;9097:23;9093:33;9090:53;;;9139:1;9136;9129:12;9090:53;9179:9;9166:23;9208:18;9249:2;9241:6;9238:14;9235:34;;;9265:1;9262;9255:12;9235:34;9288:61;9341:7;9332:6;9321:9;9317:22;9288:61;:::i;:::-;9278:71;;9396:2;9385:9;9381:18;9368:32;9358:42;;9453:2;9442:9;9438:18;9425:32;9409:48;;9482:2;9472:8;9469:16;9466:36;;;9498:1;9495;9488:12;9466:36;;9521:51;9564:7;9553:8;9542:9;9538:24;9521:51;:::i;:::-;9511:61;;;9591:38;9625:2;9614:9;9610:18;9591:38;:::i;:::-;9581:48;;8925:710;;;;;;;:::o;9640:248::-;9708:6;9716;9769:2;9757:9;9748:7;9744:23;9740:32;9737:52;;;9785:1;9782;9775:12;9737:52;-1:-1:-1;;9808:23:1;;;9878:2;9863:18;;;9850:32;;-1:-1:-1;9640:248:1:o;9893:347::-;9958:6;9966;10019:2;10007:9;9998:7;9994:23;9990:32;9987:52;;;10035:1;10032;10025:12;9987:52;10058:29;10077:9;10058:29;:::i;:::-;10048:39;;10137:2;10126:9;10122:18;10109:32;10184:5;10177:13;10170:21;10163:5;10160:32;10150:60;;10206:1;10203;10196:12;10150:60;10229:5;10219:15;;;9893:347;;;;;:::o;10245:260::-;10313:6;10321;10374:2;10362:9;10353:7;10349:23;10345:32;10342:52;;;10390:1;10387;10380:12;10342:52;10413:29;10432:9;10413:29;:::i;:::-;10403:39;;10461:38;10495:2;10484:9;10480:18;10461:38;:::i;:::-;10451:48;;10245:260;;;;;:::o;10510:606::-;10614:6;10622;10630;10638;10646;10699:3;10687:9;10678:7;10674:23;10670:33;10667:53;;;10716:1;10713;10706:12;10667:53;10739:29;10758:9;10739:29;:::i;:::-;10729:39;;10787:38;10821:2;10810:9;10806:18;10787:38;:::i;:::-;10777:48;;10872:2;10861:9;10857:18;10844:32;10834:42;;10923:2;10912:9;10908:18;10895:32;10885:42;;10978:3;10967:9;10963:19;10950:33;11006:18;10998:6;10995:30;10992:50;;;11038:1;11035;11028:12;10992:50;11061:49;11102:7;11093:6;11082:9;11078:22;11061:49;:::i;11121:1536::-;11275:6;11283;11291;11299;11307;11360:3;11348:9;11339:7;11335:23;11331:33;11328:53;;;11377:1;11374;11367:12;11328:53;11413:9;11400:23;11390:33;;11442:2;11495;11484:9;11480:18;11467:32;11518:18;11559:2;11551:6;11548:14;11545:34;;;11575:1;11572;11565:12;11545:34;11613:6;11602:9;11598:22;11588:32;;11658:7;11651:4;11647:2;11643:13;11639:27;11629:55;;11680:1;11677;11670:12;11629:55;11716:2;11703:16;11738:43;11778:2;11738:43;:::i;:::-;11810:2;11804:9;11822:31;11850:2;11842:6;11822:31;:::i;:::-;11888:18;;;11976:1;11972:10;;;;11964:19;;11960:28;;;11922:15;;;;-1:-1:-1;12000:19:1;;;11997:39;;;12032:1;12029;12022:12;11997:39;12056:11;;;;12076:142;12092:6;12087:3;12084:15;12076:142;;;12158:17;;12146:30;;12109:12;;;;12196;;;;12076:142;;;12237:6;-1:-1:-1;;;12296:2:1;12281:18;;12268:32;;-1:-1:-1;12312:16:1;;;12309:36;;;12341:1;12338;12331:12;12309:36;12364:63;12419:7;12408:8;12397:9;12393:24;12364:63;:::i;:::-;12354:73;;12474:2;12463:9;12459:18;12446:32;12436:42;;12531:3;12520:9;12516:19;12503:33;12487:49;;12561:2;12551:8;12548:16;12545:36;;;12577:1;12574;12567:12;12545:36;;;12600:51;12643:7;12632:8;12621:9;12617:24;12600:51;:::i;13435:380::-;13514:1;13510:12;;;;13557;;;13578:61;;13632:4;13624:6;13620:17;13610:27;;13578:61;13685:2;13677:6;13674:14;13654:18;13651:38;13648:161;;;13731:10;13726:3;13722:20;13719:1;13712:31;13766:4;13763:1;13756:15;13794:4;13791:1;13784:15;13648:161;;13435:380;;;:::o;14171:637::-;14451:3;14489:6;14483:13;14505:53;14551:6;14546:3;14539:4;14531:6;14527:17;14505:53;:::i;:::-;14621:13;;14580:16;;;;14643:57;14621:13;14580:16;14677:4;14665:17;;14643:57;:::i;:::-;-1:-1:-1;;;14722:20:1;;14751:22;;;14800:1;14789:13;;14171:637;-1:-1:-1;;;;14171:637:1:o;15642:127::-;15703:10;15698:3;15694:20;15691:1;15684:31;15734:4;15731:1;15724:15;15758:4;15755:1;15748:15;15774:127;15835:10;15830:3;15826:20;15823:1;15816:31;15866:4;15863:1;15856:15;15890:4;15887:1;15880:15;15906:135;15945:3;-1:-1:-1;;15966:17:1;;15963:43;;;15986:18;;:::i;:::-;-1:-1:-1;16033:1:1;16022:13;;15906:135::o;16391:128::-;16431:3;16462:1;16458:6;16455:1;16452:13;16449:39;;;16468:18;;:::i;:::-;-1:-1:-1;16504:9:1;;16391:128::o;16524:168::-;16564:7;16630:1;16626;16622:6;16618:14;16615:1;16612:21;16607:1;16600:9;16593:17;16589:45;16586:71;;;16637:18;;:::i;:::-;-1:-1:-1;16677:9:1;;16524:168::o;17053:566::-;17211:3;17242;17274:6;17268:13;17299:3;17290:12;;17321:6;17318:1;17311:17;17347:4;17387:2;17384:1;17374:16;17408:1;17418:174;17432:6;17429:1;17426:13;17418:174;;;17495:13;;17481:28;;17531:14;;;;17580:1;17568:14;;;;17447:9;17418:174;;;-1:-1:-1;17608:5:1;;17053:566;-1:-1:-1;;;;;;17053:566:1:o;20364:127::-;20425:10;20420:3;20416:20;20413:1;20406:31;20456:4;20453:1;20446:15;20480:4;20477:1;20470:15;20496:120;20536:1;20562;20552:35;;20567:18;;:::i;:::-;-1:-1:-1;20601:9:1;;20496:120::o;20621:125::-;20661:4;20689:1;20686;20683:8;20680:34;;;20694:18;;:::i;:::-;-1:-1:-1;20731:9:1;;20621:125::o;20751:112::-;20783:1;20809;20799:35;;20814:18;;:::i;:::-;-1:-1:-1;20848:9:1;;20751:112::o;22094:465::-;22351:2;22340:9;22333:21;22314:4;22377:56;22429:2;22418:9;22414:18;22406:6;22377:56;:::i;:::-;22481:9;22473:6;22469:22;22464:2;22453:9;22449:18;22442:50;22509:44;22546:6;22538;22509:44;:::i;:::-;22501:52;22094:465;-1:-1:-1;;;;;22094:465:1:o;25886:850::-;26208:4;-1:-1:-1;;;;;26318:2:1;26310:6;26306:15;26295:9;26288:34;26370:2;26362:6;26358:15;26353:2;26342:9;26338:18;26331:43;;26410:3;26405:2;26394:9;26390:18;26383:31;26437:57;26489:3;26478:9;26474:19;26466:6;26437:57;:::i;:::-;26542:9;26534:6;26530:22;26525:2;26514:9;26510:18;26503:50;26576:44;26613:6;26605;26576:44;:::i;:::-;26562:58;;26669:9;26661:6;26657:22;26651:3;26640:9;26636:19;26629:51;26697:33;26723:6;26715;26697:33;:::i;:::-;26689:41;25886:850;-1:-1:-1;;;;;;;;25886:850:1:o;26741:249::-;26810:6;26863:2;26851:9;26842:7;26838:23;26834:32;26831:52;;;26879:1;26876;26869:12;26831:52;26911:9;26905:16;26930:30;26954:5;26930:30;:::i;26995:179::-;27030:3;27072:1;27054:16;27051:23;27048:120;;;27118:1;27115;27112;27097:23;-1:-1:-1;27155:1:1;27149:8;27144:3;27140:18;27048:120;26995:179;:::o;27179:671::-;27218:3;27260:4;27242:16;27239:26;27236:39;;;27179:671;:::o;27236:39::-;27302:2;27296:9;-1:-1:-1;;27367:16:1;27363:25;;27360:1;27296:9;27339:50;27418:4;27412:11;27442:16;27477:18;27548:2;27541:4;27533:6;27529:17;27526:25;27521:2;27513:6;27510:14;27507:45;27504:58;;;27555:5;;;;;27179:671;:::o;27504:58::-;27592:6;27586:4;27582:17;27571:28;;27628:3;27622:10;27655:2;27647:6;27644:14;27641:27;;;27661:5;;;;;;27179:671;:::o;27641:27::-;27745:2;27726:16;27720:4;27716:27;27712:36;27705:4;27696:6;27691:3;27687:16;27683:27;27680:69;27677:82;;;27752:5;;;;;;27179:671;:::o;27677:82::-;27768:57;27819:4;27810:6;27802;27798:19;27794:30;27788:4;27768:57;:::i;:::-;-1:-1:-1;27841:3:1;;27179:671;-1:-1:-1;;;;;27179:671:1:o;28685:127::-;28746:10;28741:3;28737:20;28734:1;28727:31;28777:4;28774:1;28767:15;28801:4;28798:1;28791:15;30336:584;30558:4;-1:-1:-1;;;;;30668:2:1;30660:6;30656:15;30645:9;30638:34;30720:2;30712:6;30708:15;30703:2;30692:9;30688:18;30681:43;;30760:6;30755:2;30744:9;30740:18;30733:34;30803:6;30798:2;30787:9;30783:18;30776:34;30847:3;30841;30830:9;30826:19;30819:32;30868:46;30909:3;30898:9;30894:19;30886:6;30868:46;:::i;:::-;30860:54;30336:584;-1:-1:-1;;;;;;;30336:584:1:o

Swarm Source

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