Token Test Collection

Overview ERC1155

Total Supply:
0 TEST

Holders:
1 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x6d7a4c1b4ea2ab91f7a8d17589ee216e9d6da6a9

Contract Name:
ConfigurableERC1155

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-23
*/

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File @openzeppelin/contracts/token/common/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        public
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) /
            _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator)
        internal
        virtual
    {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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

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

pragma solidity ^0.8.0;

/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155 {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return
            bytes(tokenURI).length > 0
                ? string(abi.encodePacked(_baseURI, tokenURI))
                : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File contracts/ConfigurableERC1155.sol

pragma solidity ^0.8.3;

contract ConfigurableERC1155 is
    ERC1155,
    ERC1155URIStorage,
    Ownable,
    ERC1155Supply,
    ERC2981
{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    uint256 public constant NFT = 0;

    address public kalao_contract;
    string public name;
    string public symbol;

    constructor(
        string memory _name,
        string memory _symbol,
        uint96 _royalties_rate,
        address _royalties_recipient,
        address _kalao_contract
    ) ERC1155("") {
        name = _name;
        symbol = _symbol;
        kalao_contract = _kalao_contract;
        // 25 = 2.5% royalties
        if (_royalties_rate > 0 && _royalties_rate < 1000) {
            _setDefaultRoyalty(_royalties_recipient, _royalties_rate);
        }
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    function mint(
        address to,
        uint256 amount,
        string memory _uri
    ) public {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _mint(to, tokenId, amount, "");
        _setURI(tokenId, _uri);
        _setApprovalForAll(to, kalao_contract, true);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC1155, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function uri(uint256 tokenId)
        public
        view
        override(ERC1155, ERC1155URIStorage)
        returns (string memory)
    {
        return super.uri(tokenId);

        //string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        //return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint96","name":"_royalties_rate","type":"uint96"},{"internalType":"address","name":"_royalties_recipient","type":"address"},{"internalType":"address","name":"_kalao_contract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"NFT","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":"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":"kalao_contract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60a06040819052600060808190526200001b9160039162000269565b503480156200002957600080fd5b5060405162002782380380620027828339810160408190526200004c91620003df565b6040805160208101909152600081526200006681620000f9565b50620000723362000112565b84516200008790600b90602088019062000269565b5083516200009d90600c90602087019062000269565b50600a80546001600160a01b0319166001600160a01b0383161790556001600160601b03831615801590620000dc57506103e8836001600160601b0316105b15620000ee57620000ee828462000164565b5050505050620004df565b80516200010e90600290602084019062000269565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001d85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002305760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001cf565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600755565b82805462000277906200048c565b90600052602060002090601f0160209004810192826200029b5760008555620002e6565b82601f10620002b657805160ff1916838001178555620002e6565b82800160010185558215620002e6579182015b82811115620002e6578251825591602001919060010190620002c9565b50620002f4929150620002f8565b5090565b5b80821115620002f45760008155600101620002f9565b80516001600160a01b03811681146200032757600080fd5b919050565b600082601f8301126200033d578081fd5b81516001600160401b03808211156200035a576200035a620004c9565b604051601f8301601f19908116603f01168101908282118183101715620003855762000385620004c9565b81604052838152602092508683858801011115620003a1578485fd5b8491505b83821015620003c45785820183015181830184015290820190620003a5565b83821115620003d557848385830101525b9695505050505050565b600080600080600060a08688031215620003f7578081fd5b85516001600160401b03808211156200040e578283fd5b6200041c89838a016200032c565b9650602088015191508082111562000432578283fd5b5062000441888289016200032c565b604088015190955090506001600160601b038116811462000460578182fd5b925062000470606087016200030f565b915062000480608087016200030f565b90509295509295909350565b600181811c90821680620004a157607f821691505b60208210811415620004c357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61229380620004ef6000396000f3fe608060405234801561001057600080fd5b506004361061016b5760003560e01c80637c0b8de2116100cd578063bd85b03911610081578063e985e9c511610066578063e985e9c51461030e578063f242432a1461034a578063f2fde38b1461035d5761016b565b8063bd85b039146102db578063d3fc9864146102fb5761016b565b806395d89b41116100b257806395d89b41146102ad578063a22cb465146102b5578063bad03aef146102c85761016b565b80637c0b8de2146102855780638da5cb5b1461028d5761016b565b80632a55205a116101245780634e1273f4116101095780634e1273f41461023b5780634f558e791461025b578063715018a61461027d5761016b565b80632a55205a146101f65780632eb2c2d6146102285761016b565b806302fe53051161015557806302fe5305146101b957806306fdde03146101ce5780630e89341c146101e35761016b565b8062fdd58e1461017057806301ffc9a714610196575b600080fd5b61018361017e366004611c3f565b610370565b6040519081526020015b60405180910390f35b6101a96101a4366004611d88565b610419565b604051901515815260200161018d565b6101cc6101c7366004611dc0565b61042c565b005b6101d6610497565b60405161018d9190612035565b6101d66101f1366004611dfb565b610525565b610209610204366004611e13565b610530565b604080516001600160a01b03909316835260208301919091520161018d565b6101cc610236366004611afc565b6105eb565b61024e610249366004611cbd565b61068d565b60405161018d9190611ffd565b6101a9610269366004611dfb565b600090815260066020526040902054151590565b6101cc610803565b610183600081565b61029561086e565b6040516001600160a01b03909116815260200161018d565b6101d661087e565b6101cc6102c3366004611c05565b61088b565b600a54610295906001600160a01b031681565b6101836102e9366004611dfb565b60009081526006602052604090205490565b6101cc610309366004611c68565b61089a565b6101a961031c366004611aca565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101cc610358366004611ba2565b6108f9565b6101cc61036b366004611ab0565b610994565b60006001600160a01b0383166103f35760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b600061042482610a78565b90505b919050565b3361043561086e565b6001600160a01b03161461048b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b61049481610ab6565b50565b600b80546104a4906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906120ef565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b505050505081565b606061042482610ac9565b60008281526008602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916105af5750604080518082019091526007546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b6020810151600090612710906105d3906bffffffffffffffffffffffff16876120a4565b6105dd9190612084565b915196919550909350505050565b6001600160a01b0385163314806106075750610607853361031c565b6106795760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016103ea565b6106868585858585610ba9565b5050505050565b606081518351146107065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016103ea565b6000835167ffffffffffffffff81111561073057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610759578160200160208202803683370190505b50905060005b84518110156107fb576107c085828151811061078b57634e487b7160e01b600052603260045260246000fd5b60200260200101518583815181106107b357634e487b7160e01b600052603260045260246000fd5b6020026020010151610370565b8282815181106107e057634e487b7160e01b600052603260045260246000fd5b60209081029190910101526107f481612157565b905061075f565b509392505050565b3361080c61086e565b6001600160a01b0316146108625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b61086c6000610e46565b565b6005546001600160a01b03165b90565b600c80546104a4906120ef565b610896338383610eb0565b5050565b60006108a560095490565b90506108b5600980546001019055565b6108d084828560405180602001604052806000815250610fa5565b6108da81836110e4565b600a546108f39085906001600160a01b03166001610eb0565b50505050565b6001600160a01b0385163314806109155750610915853361031c565b6109875760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016103ea565b6106868585858585611148565b3361099d61086e565b6001600160a01b0316146109f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b6001600160a01b038116610a6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103ea565b61049481610e46565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610424575061042482611301565b805161089690600290602084019061191d565b600081815260046020526040812080546060929190610ae7906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610b13906120ef565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505090506000815111610b7e57610b798361139c565b610ba2565b600381604051602001610b92929190611eb6565b6040516020818303038152906040525b9392505050565b8151835114610c205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016103ea565b6001600160a01b038416610c845760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016103ea565b33610c93818787878787611430565b60005b8451811015610dd8576000858281518110610cc157634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610ced57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d805760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016103ea565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610dbd90849061206c565b9250508190555050505080610dd190612157565b9050610c96565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610e28929190612010565b60405180910390a4610e3e81878787878761143e565b505050505050565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415610f385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016103ea565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166110215760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016103ea565b33600061102d856115f3565b9050600061103a856115f3565b905061104b83600089858589611430565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061107b90849061206c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46110db8360008989898961164c565b50505050505050565b600082815260046020908152604090912082516111039284019061191d565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61112f84610525565b60405161113c9190612035565b60405180910390a25050565b6001600160a01b0384166111ac5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016103ea565b3360006111b8856115f3565b905060006111c5856115f3565b90506111d5838989858589611430565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156112595760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016103ea565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061129690849061206c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112f6848a8a8a8a8a61164c565b505050505050505050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061136457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061042457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610424565b6060600280546113ab906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546113d7906120ef565b80156114245780601f106113f957610100808354040283529160200191611424565b820191906000526020600020905b81548152906001019060200180831161140757829003601f168201915b50505050509050919050565b610e3e868686868686611757565b6001600160a01b0384163b15610e3e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114829089908990889088908890600401611f5c565b602060405180830381600087803b15801561149c57600080fd5b505af19250505080156114cc575060408051601f3d908101601f191682019092526114c991810190611da4565b60015b611582576114d861219e565b806308c379a0141561151257506114ed6121b5565b806114f85750611514565b8060405162461bcd60e51b81526004016103ea9190612035565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016103ea565b6001600160e01b0319811663bc197c8160e01b146110db5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016103ea565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061163b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15610e3e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906116909089908990889088908890600401611fba565b602060405180830381600087803b1580156116aa57600080fd5b505af19250505080156116da575060408051601f3d908101601f191682019092526116d791810190611da4565b60015b6116e6576114d861219e565b6001600160e01b0319811663f23a6e6160e01b146110db5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016103ea565b6001600160a01b0385166117fa5760005b83518110156117f85782818151811061179157634e487b7160e01b600052603260045260246000fd5b6020026020010151600660008684815181106117bd57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546117e2919061206c565b909155506117f1905081612157565b9050611768565b505b6001600160a01b038416610e3e5760005b83518110156110db57600084828151811061183657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061186257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600060066000848152602001908152602001600020549050818110156118fa5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016103ea565b6000928352600660205260409092209103905561191681612157565b905061180b565b828054611929906120ef565b90600052602060002090601f01602090048101928261194b5760008555611991565b82601f1061196457805160ff1916838001178555611991565b82800160010185558215611991579182015b82811115611991578251825591602001919060010190611976565b5061199d9291506119a1565b5090565b5b8082111561199d57600081556001016119a2565b80356001600160a01b038116811461042757600080fd5b600082601f8301126119dd578081fd5b813560206119ea82612048565b6040516119f7828261212a565b8381528281019150858301600585901b87018401881015611a16578586fd5b855b85811015611a3457813584529284019290840190600101611a18565b5090979650505050505050565b600082601f830112611a51578081fd5b813567ffffffffffffffff811115611a6b57611a6b612188565b604051611a82601f8301601f19166020018261212a565b818152846020838601011115611a96578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611ac1578081fd5b610ba2826119b6565b60008060408385031215611adc578081fd5b611ae5836119b6565b9150611af3602084016119b6565b90509250929050565b600080600080600060a08688031215611b13578081fd5b611b1c866119b6565b9450611b2a602087016119b6565b9350604086013567ffffffffffffffff80821115611b46578283fd5b611b5289838a016119cd565b94506060880135915080821115611b67578283fd5b611b7389838a016119cd565b93506080880135915080821115611b88578283fd5b50611b9588828901611a41565b9150509295509295909350565b600080600080600060a08688031215611bb9578081fd5b611bc2866119b6565b9450611bd0602087016119b6565b93506040860135925060608601359150608086013567ffffffffffffffff811115611bf9578182fd5b611b9588828901611a41565b60008060408385031215611c17578182fd5b611c20836119b6565b915060208301358015158114611c34578182fd5b809150509250929050565b60008060408385031215611c51578182fd5b611c5a836119b6565b946020939093013593505050565b600080600060608486031215611c7c578283fd5b611c85846119b6565b925060208401359150604084013567ffffffffffffffff811115611ca7578182fd5b611cb386828701611a41565b9150509250925092565b60008060408385031215611ccf578182fd5b823567ffffffffffffffff80821115611ce6578384fd5b818501915085601f830112611cf9578384fd5b81356020611d0682612048565b604051611d13828261212a565b8381528281019150858301600585901b870184018b1015611d32578889fd5b8896505b84871015611d5b57611d47816119b6565b835260019690960195918301918301611d36565b5096505086013592505080821115611d71578283fd5b50611d7e858286016119cd565b9150509250929050565b600060208284031215611d99578081fd5b8135610ba281612247565b600060208284031215611db5578081fd5b8151610ba281612247565b600060208284031215611dd1578081fd5b813567ffffffffffffffff811115611de7578182fd5b611df384828501611a41565b949350505050565b600060208284031215611e0c578081fd5b5035919050565b60008060408385031215611e25578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015611e6357815187529582019590820190600101611e47565b509495945050505050565b60008151808452611e868160208601602086016120c3565b601f01601f19169290920160200192915050565b60008151611eac8185602086016120c3565b9290920192915050565b600080845482600182811c915080831680611ed257607f831692505b6020808410821415611ef257634e487b7160e01b87526022600452602487fd5b818015611f065760018114611f1757611f43565b60ff19861689528489019650611f43565b60008b815260209020885b86811015611f3b5781548b820152908501908301611f22565b505084890196505b505050505050611f538185611e9a565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152611f8860a0830186611e34565b8281036060840152611f9a8186611e34565b90508281036080840152611fae8185611e6e565b98975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611ff260a0830184611e6e565b979650505050505050565b600060208252610ba26020830184611e34565b6000604082526120236040830185611e34565b8281036020840152611f538185611e34565b600060208252610ba26020830184611e6e565b600067ffffffffffffffff82111561206257612062612188565b5060051b60200190565b6000821982111561207f5761207f612172565b500190565b60008261209f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156120be576120be612172565b500290565b60005b838110156120de5781810151838201526020016120c6565b838111156108f35750506000910152565b600181811c9082168061210357607f821691505b6020821081141561212457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561215057612150612188565b6040525050565b600060001982141561216b5761216b612172565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561087b57600481823e5160e01c90565b600060443d10156121c55761087b565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156121f757505050505061087b565b82850191508151818111156122115750505050505061087b565b843d870101602082850101111561222d5750505050505061087b565b61223c6020828601018761212a565b509094505050505090565b6001600160e01b03198116811461049457600080fdfea2646970667358221220d0e187685447dbbf4bf1dceea915de87489fc109b3770484203cb0fc2b9a220d64736f6c6343000803003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001f40000000000000000000000009b26f0fabdaaa8370ad586200a1236b9745feb3a000000000000000000000000eff2357c9e40103ac4d268b32de478e4fbbfc4f00000000000000000000000000000000000000000000000000000000000000009486f646c20313135350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000748412d3131353500000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

54113:2344:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21645:318;;;;;;:::i;:::-;;:::i;:::-;;;18489:25:1;;;18477:2;18462:18;21645:318:0;;;;;;;;55788:204;;;;;;:::i;:::-;;:::i;:::-;;;12396:14:1;;12389:22;12371:41;;12359:2;12344:18;55788:204:0;12326:92:1;54944:89:0;;;;;;:::i;:::-;;:::i;:::-;;54405:18;;;:::i;:::-;;;;;;;:::i;56000:454::-;;;;;;:::i;:::-;;:::i;43318:505::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11385:55:1;;;11367:74;;11472:2;11457:18;;11450:34;;;;11340:18;43318:505:0;11322:168:1;23790:442:0;;;;;;:::i;:::-;;:::i;22129:561::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46972:122::-;;;;;;:::i;:::-;47029:4;46850:16;;;:12;:16;;;;;;-1:-1:-1;;;46972:122:0;39832:103;;;:::i;54329:31::-;;54359:1;54329:31;;39181:87;;;:::i;:::-;;;-1:-1:-1;;;;;9684:55:1;;;9666:74;;9654:2;9639:18;39181:87:0;9621:125:1;54430:20:0;;;:::i;22763:187::-;;;;;;:::i;:::-;;:::i;54369:29::-;;;;;-1:-1:-1;;;;;54369:29:0;;;46761:113;;;;;;:::i;:::-;46823:7;46850:16;;;:12;:16;;;;;;;46761:113;55041:332;;;;;;:::i;:::-;;:::i;23022:218::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23195:27:0;;;23166:4;23195:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23022:218;23312:401;;;;;;:::i;:::-;;:::i;40090:238::-;;;;;;:::i;:::-;;:::i;21645:318::-;21776:7;-1:-1:-1;;;;;21823:21:0;;21801:114;;;;-1:-1:-1;;;21801:114:0;;13679:2:1;21801:114:0;;;13661:21:1;13718:2;13698:18;;;13691:30;13757:34;13737:18;;;13730:62;13828:13;13808:18;;;13801:41;13859:19;;21801:114:0;;;;;;;;;-1:-1:-1;21933:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21933:22:0;;;;;;;;;;;;21645:318::o;55788:204::-;55919:4;55948:36;55972:11;55948:23;:36::i;:::-;55941:43;;55788:204;;;;:::o;54944:89::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;55010:15:::1;55018:6;55010:7;:15::i;:::-;54944:89:::0;:::o;54405:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56000:454::-;56124:13;56162:18;56172:7;56162:9;:18::i;43318:505::-;43460:7;43523:27;;;:17;:27;;;;;;;;43494:56;;;;;;;;;-1:-1:-1;;;;;43494:56:0;;;;;-1:-1:-1;;;43494:56:0;;;;;;;;;;;;43460:7;;43563:92;;-1:-1:-1;43614:29:0;;;;;;;;;43624:19;43614:29;-1:-1:-1;;;;;43614:29:0;;;;-1:-1:-1;;;43614:29:0;;;;;;;;43563:92;43705:23;;;;43667:21;;44189:5;;43692:36;;43691:71;43692:36;:10;:36;:::i;:::-;43691:71;;;;:::i;:::-;43783:16;;;;;-1:-1:-1;43318:505:0;;-1:-1:-1;;;;43318:505:0:o;23790:442::-;-1:-1:-1;;;;;24023:20:0;;18319:10;24023:20;;:60;;-1:-1:-1;24047:36:0;24064:4;18319:10;24070:12;18239:98;24047:36;24001:160;;;;-1:-1:-1;;;24001:160:0;;15314:2:1;24001:160:0;;;15296:21:1;15353:2;15333:18;;;15326:30;15392:34;15372:18;;;15365:62;15463:20;15443:18;;;15436:48;15501:19;;24001:160:0;15286:240:1;24001:160:0;24172:52;24195:4;24201:2;24205:3;24210:7;24219:4;24172:22;:52::i;:::-;23790:442;;;;;:::o;22129:561::-;22285:16;22360:3;:10;22341:8;:15;:29;22319:120;;;;-1:-1:-1;;;22319:120:0;;17324:2:1;22319:120:0;;;17306:21:1;17363:2;17343:18;;;17336:30;17402:34;17382:18;;;17375:62;17473:11;17453:18;;;17446:39;17502:19;;22319:120:0;17296:231:1;22319:120:0;22452:30;22499:8;:15;22485:30;;;;;;-1:-1:-1;;;22485:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22485:30:0;;22452:63;;22533:9;22528:122;22552:8;:15;22548:1;:19;22528:122;;;22608:30;22618:8;22627:1;22618:11;;;;;;-1:-1:-1;;;22618:11:0;;;;;;;;;;;;;;;22631:3;22635:1;22631:6;;;;;;-1:-1:-1;;;22631:6:0;;;;;;;;;;;;;;;22608:9;:30::i;:::-;22589:13;22603:1;22589:16;;;;;;-1:-1:-1;;;22589:16:0;;;;;;;;;;;;;;;;;;:49;22569:3;;;:::i;:::-;;;22528:122;;;-1:-1:-1;22669:13:0;22129:561;-1:-1:-1;;;22129:561:0:o;39832:103::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;39897:30:::1;39924:1;39897:18;:30::i;:::-;39832:103::o:0;39181:87::-;39254:6;;-1:-1:-1;;;;;39254:6:0;39181:87;;:::o;54430:20::-;;;;;;;:::i;22763:187::-;22890:52;18319:10;22923:8;22933;22890:18;:52::i;:::-;22763:187;;:::o;55041:332::-;55155:15;55173:25;:15;53540:14;;53448:114;55173:25;55155:43;;55209:27;:15;53659:19;;53677:1;53659:19;;;53570:127;55209:27;55247:30;55253:2;55257:7;55266:6;55247:30;;;;;;;;;;;;:5;:30::i;:::-;55288:22;55296:7;55305:4;55288:7;:22::i;:::-;55344:14;;55321:44;;55340:2;;-1:-1:-1;;;;;55344:14:0;;55321:18;:44::i;:::-;55041:332;;;;:::o;23312:401::-;-1:-1:-1;;;;;23520:20:0;;18319:10;23520:20;;:60;;-1:-1:-1;23544:36:0;23561:4;18319:10;23567:12;18239:98;23544:36;23498:151;;;;-1:-1:-1;;;23498:151:0;;14498:2:1;23498:151:0;;;14480:21:1;14537:2;14517:18;;;14510:30;14576:34;14556:18;;;14549:62;14647:11;14627:18;;;14620:39;14676:19;;23498:151:0;14470:231:1;23498:151:0;23660:45;23678:4;23684:2;23688;23692:6;23700:4;23660:17;:45::i;40090:238::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;-1:-1:-1;;;;;40193:22:0;::::1;40171:110;;;::::0;-1:-1:-1;;;40171:110:0;;14091:2:1;40171:110:0::1;::::0;::::1;14073:21:1::0;14130:2;14110:18;;;14103:30;14169:34;14149:18;;;14142:62;14240:8;14220:18;;;14213:36;14266:19;;40171:110:0::1;14063:228:1::0;40171:110:0::1;40292:28;40311:8;40292:18;:28::i;42972:291::-:0;43119:4;-1:-1:-1;;;;;;43161:41:0;;43176:26;43161:41;;:94;;;43219:36;43243:11;43219:23;:36::i;28230:88::-;28297:13;;;;:4;;:13;;;;;:::i;51681:448::-;51825:22;51850:19;;;:10;:19;;;;;51825:44;;51794:13;;51825:22;51850:19;51825:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52018:1;51999:8;51993:22;:26;:128;;52103:18;52113:7;52103:9;:18::i;:::-;51993:128;;;52063:8;52073;52046:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51993:128;51973:148;51681:448;-1:-1:-1;;;51681:448:0:o;26065:1321::-;26306:7;:14;26292:3;:10;:28;26270:118;;;;-1:-1:-1;;;26270:118:0;;17734:2:1;26270:118:0;;;17716:21:1;17773:2;17753:18;;;17746:30;17812:34;17792:18;;;17785:62;17883:10;17863:18;;;17856:38;17911:19;;26270:118:0;17706:230:1;26270:118:0;-1:-1:-1;;;;;26407:16:0;;26399:66;;;;-1:-1:-1;;;26399:66:0;;14908:2:1;26399:66:0;;;14890:21:1;14947:2;14927:18;;;14920:30;14986:34;14966:18;;;14959:62;-1:-1:-1;;;15037:18:1;;;15030:35;15082:19;;26399:66:0;14880:227:1;26399:66:0;18319:10;26522:60;18319:10;26553:4;26559:2;26563:3;26568:7;26577:4;26522:20;:60::i;:::-;26600:9;26595:470;26619:3;:10;26615:1;:14;26595:470;;;26651:10;26664:3;26668:1;26664:6;;;;;;-1:-1:-1;;;26664:6:0;;;;;;;;;;;;;;;26651:19;;26685:14;26702:7;26710:1;26702:10;;;;;;-1:-1:-1;;;26702:10:0;;;;;;;;;;;;;;;;;;;;26729:19;26751:13;;;;;;;;;;-1:-1:-1;;;;;26751:19:0;;;;;;;;;;;;26702:10;;-1:-1:-1;26811:21:0;;;;26785:125;;;;-1:-1:-1;;;26785:125:0;;15733:2:1;26785:125:0;;;15715:21:1;15772:2;15752:18;;;15745:30;15811:34;15791:18;;;15784:62;-1:-1:-1;;;15862:18:1;;;15855:40;15912:19;;26785:125:0;15705:232:1;26785:125:0;26954:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26954:19:0;;;;;;;;;;26976:20;;;26954:42;;27026:17;;;;;;;:27;;26976:20;;26954:9;27026:27;;26976:20;;27026:27;:::i;:::-;;;;;;;;26595:470;;;26631:3;;;;:::i;:::-;;;26595:470;;;;27112:2;-1:-1:-1;;;;;27082:47:0;27106:4;-1:-1:-1;;;;;27082:47:0;27096:8;-1:-1:-1;;;;;27082:47:0;;27116:3;27121:7;27082:47;;;;;;;:::i;:::-;;;;;;;;27214:164;27264:8;27287:4;27306:2;27323:3;27341:7;27363:4;27214:35;:164::i;:::-;26065:1321;;;;;;:::o;40488:191::-;40581:6;;;-1:-1:-1;;;;;40598:17:0;;;;;;;;;;;40631:40;;40581:6;;;40598:17;40581:6;;40631:40;;40562:16;;40631:40;40488:191;;:::o;33275:331::-;33430:8;-1:-1:-1;;;;;33421:17:0;:5;-1:-1:-1;;;;;33421:17:0;;;33413:71;;;;-1:-1:-1;;;33413:71:0;;16914:2:1;33413:71:0;;;16896:21:1;16953:2;16933:18;;;16926:30;16992:34;16972:18;;;16965:62;17063:11;17043:18;;;17036:39;17092:19;;33413:71:0;16886:231:1;33413:71:0;-1:-1:-1;;;;;33495:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33495:46:0;;;;;;;;;;33557:41;;12371::1;;;33557::0;;12344:18:1;33557:41:0;;;;;;;33275:331;;;:::o;28704:818::-;-1:-1:-1;;;;;28857:16:0;;28849:62;;;;-1:-1:-1;;;28849:62:0;;18143:2:1;28849:62:0;;;18125:21:1;18182:2;18162:18;;;18155:30;18221:34;18201:18;;;18194:62;18292:3;18272:18;;;18265:31;18313:19;;28849:62:0;18115:223:1;28849:62:0;18319:10;28924:16;28989:21;29007:2;28989:17;:21::i;:::-;28966:44;;29021:24;29048:25;29066:6;29048:17;:25::i;:::-;29021:52;;29086:66;29107:8;29125:1;29129:2;29133:3;29138:7;29147:4;29086:20;:66::i;:::-;29165:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29165:17:0;;;;;;;;;:27;;29186:6;;29165:9;:27;;29186:6;;29165:27;:::i;:::-;;;;-1:-1:-1;;29208:52:0;;;18699:25:1;;;18755:2;18740:18;;18733:34;;;-1:-1:-1;;;;;29208:52:0;;;;29241:1;;29208:52;;;;;;18672:18:1;29208:52:0;;;;;;;29351:163;29396:8;29427:1;29444:2;29461;29478:6;29499:4;29351:30;:163::i;:::-;28704:818;;;;;;;:::o;52214:166::-;52300:19;;;;:10;:19;;;;;;;;:30;;;;;;;;:::i;:::-;;52364:7;52346:26;52350:12;52354:7;52350:3;:12::i;:::-;52346:26;;;;;;:::i;:::-;;;;;;;;52214:166;;:::o;24696:1011::-;-1:-1:-1;;;;;24884:16:0;;24876:66;;;;-1:-1:-1;;;24876:66:0;;14908:2:1;24876:66:0;;;14890:21:1;14947:2;14927:18;;;14920:30;14986:34;14966:18;;;14959:62;-1:-1:-1;;;15037:18:1;;;15030:35;15082:19;;24876:66:0;14880:227:1;24876:66:0;18319:10;24955:16;25020:21;25038:2;25020:17;:21::i;:::-;24997:44;;25052:24;25079:25;25097:6;25079:17;:25::i;:::-;25052:52;;25117:60;25138:8;25148:4;25154:2;25158:3;25163:7;25172:4;25117:20;:60::i;:::-;25190:19;25212:13;;;;;;;;;;;-1:-1:-1;;;;;25212:19:0;;;;;;;;;;25264:21;;;;25242:113;;;;-1:-1:-1;;;25242:113:0;;15733:2:1;25242:113:0;;;15715:21:1;15772:2;15752:18;;;15745:30;15811:34;15791:18;;;15784:62;-1:-1:-1;;;15862:18:1;;;15855:40;15912:19;;25242:113:0;15705:232:1;25242:113:0;25391:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25391:19:0;;;;;;;;;;25413:20;;;25391:42;;25455:17;;;;;;;:27;;25413:20;;25391:9;25455:27;;25413:20;;25455:27;:::i;:::-;;;;-1:-1:-1;;25500:46:0;;;18699:25:1;;;18755:2;18740:18;;18733:34;;;-1:-1:-1;;;;;25500:46:0;;;;;;;;;;;;;;18672:18:1;25500:46:0;;;;;;;25631:68;25662:8;25672:4;25678:2;25682;25686:6;25694:4;25631:30;:68::i;:::-;24696:1011;;;;;;;;;:::o;20618:360::-;20765:4;-1:-1:-1;;;;;;20807:41:0;;20822:26;20807:41;;:110;;-1:-1:-1;;;;;;;20865:52:0;;20880:37;20865:52;20807:110;:163;;;-1:-1:-1;19494:25:0;-1:-1:-1;;;;;;19479:40:0;;;20934:36;19320:207;21389:105;21449:13;21482:4;21475:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21389:105;;;:::o;55451:329::-;55706:66;55733:8;55743:4;55749:2;55753:3;55758:7;55767:4;55706:26;:66::i;36872:975::-;-1:-1:-1;;;;;37112:13:0;;10114:19;:23;37108:732;;37165:203;;-1:-1:-1;;;37165:203:0;;-1:-1:-1;;;;;37165:43:0;;;;;:203;;37231:8;;37262:4;;37289:3;;37315:7;;37345:4;;37165:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37165:203:0;;;;;;;;-1:-1:-1;;37165:203:0;;;;;;;;;;;;:::i;:::-;;;37144:685;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37702:6;37695:14;;-1:-1:-1;;;37695:14:0;;;;;;;;:::i;37144:685::-;;;37751:62;;-1:-1:-1;;;37751:62:0;;12849:2:1;37751:62:0;;;12831:21:1;12888:2;12868:18;;;12861:30;12927:34;12907:18;;;12900:62;12998:22;12978:18;;;12971:50;13038:19;;37751:62:0;12821:242:1;37144:685:0;-1:-1:-1;;;;;;37453:60:0;;-1:-1:-1;;;37453:60:0;37427:199;;37556:50;;-1:-1:-1;;;37556:50:0;;13270:2:1;37556:50:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;-1:-1:-1;;;13399:18:1;;;13392:38;13447:19;;37556:50:0;13242:230:1;37855::0;38007:16;;;38021:1;38007:16;;;;;;;;;37948;;37982:22;;38007:16;;;;;;;;;;;;-1:-1:-1;38007:16:0;37982:41;;38045:7;38034:5;38040:1;38034:8;;;;;;-1:-1:-1;;;38034:8:0;;;;;;;;;;;;;;;;;;:18;38072:5;37855:230;-1:-1:-1;;37855:230:0:o;35966:898::-;-1:-1:-1;;;;;36181:13:0;;10114:19;:23;36177:680;;36234:196;;-1:-1:-1;;;36234:196:0;;-1:-1:-1;;;;;36234:38:0;;;;;:196;;36295:8;;36326:4;;36353:2;;36378:6;;36407:4;;36234:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36234:196:0;;;;;;;;-1:-1:-1;;36234:196:0;;;;;;;;;;;;:::i;:::-;;;36213:633;;;;:::i;:::-;-1:-1:-1;;;;;;36493:55:0;;-1:-1:-1;;;36493:55:0;36489:154;;36573:50;;-1:-1:-1;;;36573:50:0;;13270:2:1;36573:50:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;-1:-1:-1;;;13399:18:1;;;13392:38;13447:19;;36573:50:0;13242:230:1;47169:992:0;-1:-1:-1;;;;;47491:18:0;;47487:160;;47531:9;47526:110;47550:3;:10;47546:1;:14;47526:110;;;47610:7;47618:1;47610:10;;;;;;-1:-1:-1;;;47610:10:0;;;;;;;;;;;;;;;47586:12;:20;47599:3;47603:1;47599:6;;;;;;-1:-1:-1;;;47599:6:0;;;;;;;;;;;;;;;47586:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;47562:3:0;;-1:-1:-1;47562:3:0;;:::i;:::-;;;47526:110;;;;47487:160;-1:-1:-1;;;;;47663:16:0;;47659:495;;47701:9;47696:447;47720:3;:10;47716:1;:14;47696:447;;;47756:10;47769:3;47773:1;47769:6;;;;;;-1:-1:-1;;;47769:6:0;;;;;;;;;;;;;;;47756:19;;47794:14;47811:7;47819:1;47811:10;;;;;;-1:-1:-1;;;47811:10:0;;;;;;;;;;;;;;;47794:27;;47840:14;47857:12;:16;47870:2;47857:16;;;;;;;;;;;;47840:33;;47932:6;47922;:16;;47892:130;;;;-1:-1:-1;;;47892:130:0;;16505:2:1;47892:130:0;;;16487:21:1;16544:2;16524:18;;;16517:30;16583:34;16563:18;;;16556:62;16654:10;16634:18;;;16627:38;16682:19;;47892:130:0;16477:230:1;47892:130:0;48074:16;;;;:12;:16;;;;;;48093:15;;48074:34;;47732:3;;;:::i;:::-;;;47696:447;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:755;;322:3;315:4;307:6;303:17;299:27;289:2;;344:5;337;330:20;289:2;384:6;371:20;410:4;433:43;473:2;433:43;:::i;:::-;505:2;499:9;517:31;545:2;537:6;517:31;:::i;:::-;583:18;;;617:15;;;;-1:-1:-1;652:15:1;;;702:1;698:10;;;686:23;;682:32;;679:41;-1:-1:-1;676:2:1;;;737:5;730;723:20;676:2;763:5;777:163;791:2;788:1;785:9;777:163;;;848:17;;836:30;;886:12;;;;918;;;;809:1;802:9;777:163;;;-1:-1:-1;958:6:1;;279:691;-1:-1:-1;;;;;;;279:691:1:o;975:575::-;;1070:3;1063:4;1055:6;1051:17;1047:27;1037:2;;1092:5;1085;1078:20;1037:2;1132:6;1119:20;1158:18;1154:2;1151:26;1148:2;;;1180:18;;:::i;:::-;1229:2;1223:9;1241:67;1296:2;1277:13;;-1:-1:-1;;1273:27:1;1302:4;1269:38;1223:9;1241:67;:::i;:::-;1332:2;1324:6;1317:18;1378:3;1371:4;1366:2;1358:6;1354:15;1350:26;1347:35;1344:2;;;1399:5;1392;1385:20;1344:2;1467;1460:4;1452:6;1448:17;1441:4;1433:6;1429:17;1416:54;1490:15;;;1507:4;1486:26;1479:41;;;;1494:6;1027:523;-1:-1:-1;;1027:523:1:o;1555:196::-;;1667:2;1655:9;1646:7;1642:23;1638:32;1635:2;;;1688:6;1680;1673:22;1635:2;1716:29;1735:9;1716:29;:::i;1756:270::-;;;1885:2;1873:9;1864:7;1860:23;1856:32;1853:2;;;1906:6;1898;1891:22;1853:2;1934:29;1953:9;1934:29;:::i;:::-;1924:39;;1982:38;2016:2;2005:9;2001:18;1982:38;:::i;:::-;1972:48;;1843:183;;;;;:::o;2031:983::-;;;;;;2270:3;2258:9;2249:7;2245:23;2241:33;2238:2;;;2292:6;2284;2277:22;2238:2;2320:29;2339:9;2320:29;:::i;:::-;2310:39;;2368:38;2402:2;2391:9;2387:18;2368:38;:::i;:::-;2358:48;;2457:2;2446:9;2442:18;2429:32;2480:18;2521:2;2513:6;2510:14;2507:2;;;2542:6;2534;2527:22;2507:2;2570:61;2623:7;2614:6;2603:9;2599:22;2570:61;:::i;:::-;2560:71;;2684:2;2673:9;2669:18;2656:32;2640:48;;2713:2;2703:8;2700:16;2697:2;;;2734:6;2726;2719:22;2697:2;2762:63;2817:7;2806:8;2795:9;2791:24;2762:63;:::i;:::-;2752:73;;2878:3;2867:9;2863:19;2850:33;2834:49;;2908:2;2898:8;2895:16;2892:2;;;2929:6;2921;2914:22;2892:2;;2957:51;3000:7;2989:8;2978:9;2974:24;2957:51;:::i;:::-;2947:61;;;2228:786;;;;;;;;:::o;3019:626::-;;;;;;3208:3;3196:9;3187:7;3183:23;3179:33;3176:2;;;3230:6;3222;3215:22;3176:2;3258:29;3277:9;3258:29;:::i;:::-;3248:39;;3306:38;3340:2;3329:9;3325:18;3306:38;:::i;:::-;3296:48;;3391:2;3380:9;3376:18;3363:32;3353:42;;3442:2;3431:9;3427:18;3414:32;3404:42;;3497:3;3486:9;3482:19;3469:33;3525:18;3517:6;3514:30;3511:2;;;3562:6;3554;3547:22;3511:2;3590:49;3631:7;3622:6;3611:9;3607:22;3590:49;:::i;3650:367::-;;;3776:2;3764:9;3755:7;3751:23;3747:32;3744:2;;;3797:6;3789;3782:22;3744:2;3825:29;3844:9;3825:29;:::i;:::-;3815:39;;3904:2;3893:9;3889:18;3876:32;3951:5;3944:13;3937:21;3930:5;3927:32;3917:2;;3978:6;3970;3963:22;3917:2;4006:5;3996:15;;;3734:283;;;;;:::o;4022:264::-;;;4151:2;4139:9;4130:7;4126:23;4122:32;4119:2;;;4172:6;4164;4157:22;4119:2;4200:29;4219:9;4200:29;:::i;:::-;4190:39;4276:2;4261:18;;;;4248:32;;-1:-1:-1;;;4109:177:1:o;4291:483::-;;;;4447:2;4435:9;4426:7;4422:23;4418:32;4415:2;;;4468:6;4460;4453:22;4415:2;4496:29;4515:9;4496:29;:::i;:::-;4486:39;;4572:2;4561:9;4557:18;4544:32;4534:42;;4627:2;4616:9;4612:18;4599:32;4654:18;4646:6;4643:30;4640:2;;;4691:6;4683;4676:22;4640:2;4719:49;4760:7;4751:6;4740:9;4736:22;4719:49;:::i;:::-;4709:59;;;4405:369;;;;;:::o;4779:1274::-;;;4958:2;4946:9;4937:7;4933:23;4929:32;4926:2;;;4979:6;4971;4964:22;4926:2;5024:9;5011:23;5053:18;5094:2;5086:6;5083:14;5080:2;;;5115:6;5107;5100:22;5080:2;5158:6;5147:9;5143:22;5133:32;;5203:7;5196:4;5192:2;5188:13;5184:27;5174:2;;5230:6;5222;5215:22;5174:2;5271;5258:16;5293:4;5316:43;5356:2;5316:43;:::i;:::-;5388:2;5382:9;5400:31;5428:2;5420:6;5400:31;:::i;:::-;5466:18;;;5500:15;;;;-1:-1:-1;5535:11:1;;;5577:1;5573:10;;;5565:19;;5561:28;;5558:41;-1:-1:-1;5555:2:1;;;5617:6;5609;5602:22;5555:2;5644:6;5635:15;;5659:169;5673:2;5670:1;5667:9;5659:169;;;5730:23;5749:3;5730:23;:::i;:::-;5718:36;;5691:1;5684:9;;;;;5774:12;;;;5806;;5659:169;;;-1:-1:-1;5847:6:1;-1:-1:-1;;5891:18:1;;5878:32;;-1:-1:-1;;5922:16:1;;;5919:2;;;5956:6;5948;5941:22;5919:2;;5984:63;6039:7;6028:8;6017:9;6013:24;5984:63;:::i;:::-;5974:73;;;4916:1137;;;;;:::o;6058:255::-;;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6190:6;6182;6175:22;6137:2;6234:9;6221:23;6253:30;6277:5;6253:30;:::i;6318:259::-;;6440:2;6428:9;6419:7;6415:23;6411:32;6408:2;;;6461:6;6453;6446:22;6408:2;6498:9;6492:16;6517:30;6541:5;6517:30;:::i;6582:341::-;;6704:2;6692:9;6683:7;6679:23;6675:32;6672:2;;;6725:6;6717;6710:22;6672:2;6770:9;6757:23;6803:18;6795:6;6792:30;6789:2;;;6840:6;6832;6825:22;6789:2;6868:49;6909:7;6900:6;6889:9;6885:22;6868:49;:::i;:::-;6858:59;6662:261;-1:-1:-1;;;;6662:261:1:o;6928:190::-;;7040:2;7028:9;7019:7;7015:23;7011:32;7008:2;;;7061:6;7053;7046:22;7008:2;-1:-1:-1;7089:23:1;;6998:120;-1:-1:-1;6998:120:1:o;7123:258::-;;;7252:2;7240:9;7231:7;7227:23;7223:32;7220:2;;;7273:6;7265;7258:22;7220:2;-1:-1:-1;;7301:23:1;;;7371:2;7356:18;;;7343:32;;-1:-1:-1;7210:171:1:o;7386:437::-;;7477:5;7471:12;7504:6;7499:3;7492:19;7530:4;7559:2;7554:3;7550:12;7543:19;;7596:2;7589:5;7585:14;7617:3;7629:169;7643:6;7640:1;7637:13;7629:169;;;7704:13;;7692:26;;7738:12;;;;7773:15;;;;7665:1;7658:9;7629:169;;;-1:-1:-1;7814:3:1;;7447:376;-1:-1:-1;;;;;7447:376:1:o;7828:257::-;;7907:5;7901:12;7934:6;7929:3;7922:19;7950:63;8006:6;7999:4;7994:3;7990:14;7983:4;7976:5;7972:16;7950:63;:::i;:::-;8067:2;8046:15;-1:-1:-1;;8042:29:1;8033:39;;;;8074:4;8029:50;;7877:208;-1:-1:-1;;7877:208:1:o;8090:185::-;;8170:5;8164:12;8185:52;8230:6;8225:3;8218:4;8211:5;8207:16;8185:52;:::i;:::-;8253:16;;;;;8140:135;-1:-1:-1;;8140:135:1:o;8280:1235::-;;8485:3;8520:6;8514:13;8550:3;8572:1;8600:9;8596:2;8592:18;8582:28;;8660:2;8649:9;8645:18;8682;8672:2;;8726:4;8718:6;8714:17;8704:27;;8672:2;8752;8800;8792:6;8789:14;8769:18;8766:38;8763:2;;;-1:-1:-1;;;8834:3:1;8827:90;8940:4;8937:1;8930:15;8970:4;8965:3;8958:17;8763:2;9001:18;9028:104;;;;9146:1;9141:322;;;;8994:469;;9028:104;-1:-1:-1;;9061:24:1;;9049:37;;9106:16;;;;-1:-1:-1;9028:104:1;;9141:322;18966:127;19032:17;;;19082:4;19066:21;;9236:3;9252:165;9266:6;9263:1;9260:13;9252:165;;;9344:14;;9331:11;;;9324:35;9387:16;;;;9281:10;;9252:165;;;9256:3;;9446:6;9441:3;9437:16;9430:23;;8994:469;;;;;;;9479:30;9505:3;9497:6;9479:30;:::i;:::-;9472:37;8464:1051;-1:-1:-1;;;;;8464:1051:1:o;9751:849::-;;-1:-1:-1;;;;;10183:2:1;10175:6;10171:15;10160:9;10153:34;10235:2;10227:6;10223:15;10218:2;10207:9;10203:18;10196:43;;10275:3;10270:2;10259:9;10255:18;10248:31;10302:57;10354:3;10343:9;10339:19;10331:6;10302:57;:::i;:::-;10407:9;10399:6;10395:22;10390:2;10379:9;10375:18;10368:50;10441:44;10478:6;10470;10441:44;:::i;:::-;10427:58;;10534:9;10526:6;10522:22;10516:3;10505:9;10501:19;10494:51;10562:32;10587:6;10579;10562:32;:::i;:::-;10554:40;10082:518;-1:-1:-1;;;;;;;;10082:518:1:o;10605:583::-;;-1:-1:-1;;;;;10937:2:1;10929:6;10925:15;10914:9;10907:34;10989:2;10981:6;10977:15;10972:2;10961:9;10957:18;10950:43;;11029:6;11024:2;11013:9;11009:18;11002:34;11072:6;11067:2;11056:9;11052:18;11045:34;11116:3;11110;11099:9;11095:19;11088:32;11137:45;11177:3;11166:9;11162:19;11154:6;11137:45;:::i;:::-;11129:53;10836:352;-1:-1:-1;;;;;;;10836:352:1:o;11495:261::-;;11674:2;11663:9;11656:21;11694:56;11746:2;11735:9;11731:18;11723:6;11694:56;:::i;11761:465::-;;12018:2;12007:9;12000:21;12044:56;12096:2;12085:9;12081:18;12073:6;12044:56;:::i;:::-;12148:9;12140:6;12136:22;12131:2;12120:9;12116:18;12109:50;12176:44;12213:6;12205;12176:44;:::i;12423:219::-;;12572:2;12561:9;12554:21;12592:44;12632:2;12621:9;12617:18;12609:6;12592:44;:::i;18778:183::-;;18871:18;18863:6;18860:30;18857:2;;;18893:18;;:::i;:::-;-1:-1:-1;18938:1:1;18934:14;18950:4;18930:25;;18847:114::o;19098:128::-;;19169:1;19165:6;19162:1;19159:13;19156:2;;;19175:18;;:::i;:::-;-1:-1:-1;19211:9:1;;19146:80::o;19231:274::-;;19297:1;19287:2;;-1:-1:-1;;;19329:1:1;19322:88;19433:4;19430:1;19423:15;19461:4;19458:1;19451:15;19287:2;-1:-1:-1;19490:9:1;;19277:228::o;19510:168::-;;19616:1;19612;19608:6;19604:14;19601:1;19598:21;19593:1;19586:9;19579:17;19575:45;19572:2;;;19623:18;;:::i;:::-;-1:-1:-1;19663:9:1;;19562:116::o;19683:258::-;19755:1;19765:113;19779:6;19776:1;19773:13;19765:113;;;19855:11;;;19849:18;19836:11;;;19829:39;19801:2;19794:10;19765:113;;;19896:6;19893:1;19890:13;19887:2;;;-1:-1:-1;;19931:1:1;19913:16;;19906:27;19736:205::o;19946:437::-;20025:1;20021:12;;;;20068;;;20089:2;;20143:4;20135:6;20131:17;20121:27;;20089:2;20196;20188:6;20185:14;20165:18;20162:38;20159:2;;;-1:-1:-1;;;20230:1:1;20223:88;20334:4;20331:1;20324:15;20362:4;20359:1;20352:15;20159:2;;20001:382;;;:::o;20388:249::-;20498:2;20479:13;;-1:-1:-1;;20475:27:1;20463:40;;20533:18;20518:34;;20554:22;;;20515:62;20512:2;;;20580:18;;:::i;:::-;20616:2;20609:22;-1:-1:-1;;20435:202:1:o;20642:135::-;;-1:-1:-1;;20702:17:1;;20699:2;;;20722:18;;:::i;:::-;-1:-1:-1;20769:1:1;20758:13;;20689:88::o;20782:184::-;-1:-1:-1;;;20831:1:1;20824:88;20931:4;20928:1;20921:15;20955:4;20952:1;20945:15;20971:184;-1:-1:-1;;;21020:1:1;21013:88;21120:4;21117:1;21110:15;21144:4;21141:1;21134:15;21160:185;;21237:1;21219:16;21216:23;21213:2;;;21287:1;21282:3;21277;21262:27;21318:10;21313:3;21309:20;21203:142;:::o;21350:671::-;;21431:4;21413:16;21410:26;21407:2;;;21439:5;;21407:2;21473;21467:9;-1:-1:-1;;21538:16:1;21534:25;;21531:1;21467:9;21510:50;21589:4;21583:11;21613:16;21648:18;21719:2;21712:4;21704:6;21700:17;21697:25;21692:2;21684:6;21681:14;21678:45;21675:2;;;21726:5;;;;;;;21675:2;21763:6;21757:4;21753:17;21742:28;;21799:3;21793:10;21826:2;21818:6;21815:14;21812:2;;;21832:5;;;;;;;;21812:2;21916;21897:16;21891:4;21887:27;21883:36;21876:4;21867:6;21862:3;21858:16;21854:27;21851:69;21848:2;;;21923:5;;;;;;;;21848:2;21939:57;21990:4;21981:6;21973;21969:19;21965:30;21959:4;21939:57;:::i;:::-;-1:-1:-1;22012:3:1;;-1:-1:-1;;;;;21397:624:1;:::o;22026:177::-;-1:-1:-1;;;;;;22104:5:1;22100:78;22093:5;22090:89;22080:2;;22193:1;22190;22183:12

Swarm Source

ipfs://d0e187685447dbbf4bf1dceea915de87489fc109b3770484203cb0fc2b9a220d
Loading