ETH Price: $3,203.65 (+5.11%)

Token

 

Overview

Max Total Supply

4,104

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0xed02383d3b21052a02eda1b456f0f154738e7a2d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BokkyPooBahsNFT

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-07
*/

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

// SPDX-License-Identifier: MIT

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: contracts/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: contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity ^0.8.0;


/**
 * _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.
        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. 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: contracts/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: contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: contracts/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: contracts/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 {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

        _doSafeTransferAcceptanceCheck(operator, 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(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        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");
            _balances[id][from] = fromBalance - amount;
            _balances[id][to] += amount;
        }

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

        _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 `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

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

        _doSafeTransferAcceptanceCheck(operator, address(0), account, 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 (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        _balances[id][account] = accountBalance - amount;

        emit TransferSingle(operator, account, address(0), id, amount);
    }

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

        address operator = _msgSender();

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

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

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

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

    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(to).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(to).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: contracts/token/ERC1155/extensions/ERC1155Burnable.sol



pragma solidity ^0.8.0;


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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}

// File: contracts/security/Pausable.sol



pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

// File: contracts/token/ERC1155/extensions/ERC1155Pausable.sol



pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    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);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

// File: contracts/access/AccessControl.sol



pragma solidity ^0.8.0;



/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/utils/structs/EnumerableSet.sol



pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: contracts/access/AccessControlEnumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping (bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

// File: contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol + setURI => BokkyPooBahsNFT



pragma solidity ^0.8.0;






/**
 * @dev {ERC1155} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract BokkyPooBahsNFT is Context, AccessControlEnumerable, ERC1155Burnable, ERC1155Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that
     * deploys the contract.
     */
    constructor(string memory uri) ERC1155(uri) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    /**
     * @dev Sets new URI
     *
     * Requirements:
     *
     * - the caller must have the `DEFAULT_ADMIN_ROLE`.
     */
    function setURI(string memory uri_) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "BokkyPooBahsNFT: must have admin role to setURI");

        _setURI(uri_);
    }

    /**
     * @dev Creates `amount` new tokens for `to`, of token type `id`.
     *
     * See {ERC1155-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 id, uint256 amount, bytes memory data) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "BokkyPooBahsNFT: must have minter role to mint");

        _mint(to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}.
     */
    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "BokkyPooBahsNFT: must have minter role to mint");

        _mintBatch(to, ids, amounts, data);
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC1155Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "BokkyPooBahsNFT: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC1155Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "BokkyPooBahsNFT: must have pauser role to unpause");
        _unpause();
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC1155) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002e3138038062002e318339810160408190526200003491620002d8565b806200004081620000b8565b506005805460ff19169055620000596000335b620000d1565b620000857f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000053565b620000b17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000053565b5062000401565b8051620000cd90600490602084019062000232565b5050565b620000e882826200011460201b62000f341760201c565b60008281526001602090815260409091206200010f91839062000f4262000120821b17901c565b505050565b620000cd828262000140565b600062000137836001600160a01b038416620001e0565b90505b92915050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000cd576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200019c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600081815260018301602052604081205462000229575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200013a565b5060006200013a565b8280546200024090620003ae565b90600052602060002090601f016020900481019282620002645760008555620002af565b82601f106200027f57805160ff1916838001178555620002af565b82800160010185558215620002af579182015b82811115620002af57825182559160200191906001019062000292565b50620002bd929150620002c1565b5090565b5b80821115620002bd5760008155600101620002c2565b60006020808385031215620002eb578182fd5b82516001600160401b038082111562000302578384fd5b818501915085601f83011262000316578384fd5b8151818111156200032b576200032b620003eb565b604051601f8201601f19908116603f01168101908382118183101715620003565762000356620003eb565b8160405282815288868487010111156200036e578687fd5b8693505b8284101562000391578484018601518185018701529285019262000372565b82841115620003a257868684830101525b98975050505050505050565b600181811c90821680620003c357607f821691505b60208210811415620003e557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612a2080620004116000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c8063731133e9116100de578063ca15c87311610097578063e63ab1e911610071578063e63ab1e914610383578063e985e9c5146103aa578063f242432a146103e6578063f5298aca146103f95761018d565b8063ca15c87314610336578063d539139314610349578063d547741f146103705761018d565b8063731133e9146102c25780638456cb59146102d55780639010d07c146102dd57806391d1485414610308578063a217fddf1461031b578063a22cb465146103235761018d565b80632eb2c2d61161014b5780633f4ba83a116101255780633f4ba83a1461027f5780634e1273f4146102875780635c975abb146102a75780636b20c454146102af5761018d565b80632eb2c2d6146102465780632f2ff15d1461025957806336568abe1461026c5761018d565b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db5780630e89341c146101f05780631f7fdffa14610210578063248a9ca314610223575b600080fd5b6101a56101a03660046121d5565b61040c565b6040519081526020015b60405180910390f35b6101cb6101c63660046123a9565b6104a8565b60405190151581526020016101af565b6101ee6101e93660046123e1565b6104bb565b005b6102036101fe36600461234e565b610536565b6040516101af9190612598565b6101ee61021e366004612106565b6105ca565b6101a561023136600461234e565b60009081526020819052604090206001015490565b6101ee610254366004611f8c565b610622565b6101ee610267366004612366565b6108b9565b6101ee61027a366004612366565b6108e0565b6101ee610902565b61029a610295366004612283565b61099c565b6040516101af9190612557565b6101cb610afe565b6101ee6102bd366004612095565b610b08565b6101ee6102d0366004612230565b610b4b565b6101ee610b9d565b6102f06102eb366004612388565b610c33565b6040516001600160a01b0390911681526020016101af565b6101cb610316366004612366565b610c52565b6101a5600081565b6101ee61033136600461219b565b610c7b565b6101a561034436600461234e565b610d5f565b6101a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6101ee61037e366004612366565b610d76565b6101a57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6101cb6103b8366004611f5a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6101ee6103f4366004612032565b610d80565b6101ee6104073660046121fe565b610ef1565b60006001600160a01b03831661047d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006104b382610f57565b90505b919050565b6104c6600033610316565b61052a5760405162461bcd60e51b815260206004820152602f60248201527f426f6b6b79506f6f426168734e46543a206d75737420686176652061646d696e60448201526e20726f6c6520746f2073657455524960881b6064820152608401610474565b61053381610f97565b50565b6060600480546105459061287c565b80601f01602080910402602001604051908101604052809291908181526020018280546105719061287c565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b50505050509050919050565b6105f47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610316565b6106105760405162461bcd60e51b815260040161047490612752565b61061c84848484610faa565b50505050565b81518351146106435760405162461bcd60e51b8152600401610474906127a0565b6001600160a01b0384166106695760405162461bcd60e51b815260040161047490612680565b6001600160a01b038516331480610685575061068585336103b8565b6106ec5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610474565b336106fb818787878787611128565b60005b845181101561084b57600085828151811061072957634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061075557634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526002835260408082206001600160a01b038e1683529093529190912054909150818110156107a65760405162461bcd60e51b815260040161047490612708565b6107b08282612865565b6002600085815260200190815260200160002060008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550816002600085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610830919061284d565b9250508190555050505080610844906128e4565b90506106fe565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161089b92919061256a565b60405180910390a46108b1818787878787611136565b505050505050565b6108c382826112a1565b60008281526001602052604090206108db9082610f42565b505050565b6108ea8282611322565b60008281526001602052604090206108db908261139c565b61092c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610316565b6109925760405162461bcd60e51b815260206004820152603160248201527f426f6b6b79506f6f426168734e46543a206d75737420686176652070617573656044820152707220726f6c6520746f20756e706175736560781b6064820152608401610474565b61099a6113b1565b565b60608151835114610a015760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610474565b6000835167ffffffffffffffff811115610a2b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a54578160200160208202803683370190505b50905060005b8451811015610af657610abb858281518110610a8657634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610aae57634e487b7160e01b600052603260045260246000fd5b602002602001015161040c565b828281518110610adb57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610aef816128e4565b9050610a5a565b509392505050565b60055460ff165b90565b6001600160a01b038316331480610b245750610b2483336103b8565b610b405760405162461bcd60e51b815260040161047490612637565b6108db838383611446565b610b757f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610316565b610b915760405162461bcd60e51b815260040161047490612752565b61061c84848484611600565b610bc77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610316565b610c2b5760405162461bcd60e51b815260206004820152602f60248201527f426f6b6b79506f6f426168734e46543a206d757374206861766520706175736560448201526e7220726f6c6520746f20706175736560881b6064820152608401610474565b61099a6116c9565b6000828152600160205260408120610c4b9083611746565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b0383161415610ce65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610474565b3360008181526003602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d53911515815260200190565b60405180910390a35050565b60008181526001602052604081206104b390611752565b6108ea828261175c565b6001600160a01b038416610da65760405162461bcd60e51b815260040161047490612680565b6001600160a01b038516331480610dc25750610dc285336103b8565b610dde5760405162461bcd60e51b815260040161047490612637565b33610dfd818787610dee886117dc565b610df7886117dc565b87611128565b60008481526002602090815260408083206001600160a01b038a16845290915290205483811015610e405760405162461bcd60e51b815260040161047490612708565b610e4a8482612865565b60008681526002602090815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290610e8890849061284d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ee8828888888888611835565b50505050505050565b6001600160a01b038316331480610f0d5750610f0d83336103b8565b610f295760405162461bcd60e51b815260040161047490612637565b6108db8383836118ff565b610f3e8282611a0c565b5050565b6000610c4b836001600160a01b038416611a90565b60006001600160e01b03198216636cdb3d1360e11b1480610f8857506001600160e01b031982166303a24d0760e21b145b806104b357506104b382611adf565b8051610f3e906004906020840190611db9565b6001600160a01b038416610fd05760405162461bcd60e51b8152600401610474906127e8565b8151835114610ff15760405162461bcd60e51b8152600401610474906127a0565b3361100181600087878787611128565b60005b84518110156110b95783818151811061102d57634e487b7160e01b600052603260045260246000fd5b60200260200101516002600087848151811061105957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110a1919061284d565b909155508190506110b1816128e4565b915050611004565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161110a92919061256a565b60405180910390a461112181600087878787611136565b5050505050565b6108b1868686868686611b04565b6001600160a01b0384163b156108b15760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061117a90899089908890889088906004016124b4565b602060405180830381600087803b15801561119457600080fd5b505af19250505080156111c4575060408051601f3d908101601f191682019092526111c1918101906123c5565b60015b611271576111d061292b565b806308c379a0141561120a57506111e5612942565b806111f0575061120c565b8060405162461bcd60e51b81526004016104749190612598565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610474565b6001600160e01b0319811663bc197c8160e01b14610ee85760405162461bcd60e51b8152600401610474906125ab565b6000828152602081905260409020600101546112be905b33610316565b610f345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401610474565b6001600160a01b03811633146113925760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610474565b610f3e8282611b6e565b6000610c4b836001600160a01b038416611bd3565b6113b9610afe565b6113fc5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610474565b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661146c5760405162461bcd60e51b8152600401610474906126c5565b805182511461148d5760405162461bcd60e51b8152600401610474906127a0565b60003390506114b081856000868660405180602001604052806000815250611128565b60005b83518110156115a15760008482815181106114de57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061150a57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526002835260408082206001600160a01b038c16835290935291909120549091508181101561155b5760405162461bcd60e51b8152600401610474906125f3565b6115658282612865565b60009384526002602090815260408086206001600160a01b038c1687529091529093209290925550819050611599816128e4565b9150506114b3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516115f292919061256a565b60405180910390a450505050565b6001600160a01b0384166116265760405162461bcd60e51b8152600401610474906127e8565b3361163781600087610dee886117dc565b60008481526002602090815260408083206001600160a01b03891684529091528120805485929061166990849061284d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461112181600087878787611835565b6116d1610afe565b156117115760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610474565b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114293390565b6000610c4b8383611cf0565b60006104b3825490565b600082815260208190526040902060010154611777906112b8565b6113925760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b6064820152608401610474565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061182457634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156108b15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118799089908990889088908890600401612512565b602060405180830381600087803b15801561189357600080fd5b505af19250505080156118c3575060408051601f3d908101601f191682019092526118c0918101906123c5565b60015b6118cf576111d061292b565b6001600160e01b0319811663f23a6e6160e01b14610ee85760405162461bcd60e51b8152600401610474906125ab565b6001600160a01b0383166119255760405162461bcd60e51b8152600401610474906126c5565b3361195481856000611936876117dc565b61193f876117dc565b60405180602001604052806000815250611128565b60008381526002602090815260408083206001600160a01b0388168452909152902054828110156119975760405162461bcd60e51b8152600401610474906125f3565b6119a18382612865565b60008581526002602090815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b611a168282610c52565b610f3e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611a4c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054611ad7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a2565b5060006104a2565b60006001600160e01b03198216635a05180f60e01b14806104b357506104b382611d84565b611b0c610afe565b156108b15760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610474565b611b788282610c52565b15610f3e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015611ce6576000611bf7600183612865565b8554909150600090611c0b90600190612865565b90506000866000018281548110611c3257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611c6357634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611c7a83600161284d565b60008281526001890160205260409020558654879080611caa57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506104a2565b60009150506104a2565b81546000908210611d4e5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610474565b826000018281548110611d7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006001600160e01b03198216637965db0b60e01b14806104b357506301ffc9a760e01b6001600160e01b03198316146104b3565b828054611dc59061287c565b90600052602060002090601f016020900481019282611de75760008555611e2d565b82601f10611e0057805160ff1916838001178555611e2d565b82800160010185558215611e2d579182015b82811115611e2d578251825591602001919060010190611e12565b50611e39929150611e3d565b5090565b5b80821115611e395760008155600101611e3e565b600067ffffffffffffffff831115611e6c57611e6c612915565b604051611e83601f8501601f1916602001826128b7565b809150838152848484011115611e9857600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146104b657600080fd5b600082601f830112611ed7578081fd5b81356020611ee482612829565b604051611ef182826128b7565b8381528281019150858301600585901b87018401881015611f10578586fd5b855b85811015611f2e57813584529284019290840190600101611f12565b5090979650505050505050565b600082601f830112611f4b578081fd5b610c4b83833560208501611e52565b60008060408385031215611f6c578182fd5b611f7583611eb0565b9150611f8360208401611eb0565b90509250929050565b600080600080600060a08688031215611fa3578081fd5b611fac86611eb0565b9450611fba60208701611eb0565b9350604086013567ffffffffffffffff80821115611fd6578283fd5b611fe289838a01611ec7565b94506060880135915080821115611ff7578283fd5b61200389838a01611ec7565b93506080880135915080821115612018578283fd5b5061202588828901611f3b565b9150509295509295909350565b600080600080600060a08688031215612049578081fd5b61205286611eb0565b945061206060208701611eb0565b93506040860135925060608601359150608086013567ffffffffffffffff811115612089578182fd5b61202588828901611f3b565b6000806000606084860312156120a9578283fd5b6120b284611eb0565b9250602084013567ffffffffffffffff808211156120ce578384fd5b6120da87838801611ec7565b935060408601359150808211156120ef578283fd5b506120fc86828701611ec7565b9150509250925092565b6000806000806080858703121561211b578384fd5b61212485611eb0565b9350602085013567ffffffffffffffff80821115612140578485fd5b61214c88838901611ec7565b94506040870135915080821115612161578384fd5b61216d88838901611ec7565b93506060870135915080821115612182578283fd5b5061218f87828801611f3b565b91505092959194509250565b600080604083850312156121ad578182fd5b6121b683611eb0565b9150602083013580151581146121ca578182fd5b809150509250929050565b600080604083850312156121e7578182fd5b6121f083611eb0565b946020939093013593505050565b600080600060608486031215612212578081fd5b61221b84611eb0565b95602085013595506040909401359392505050565b60008060008060808587031215612245578182fd5b61224e85611eb0565b93506020850135925060408501359150606085013567ffffffffffffffff811115612277578182fd5b61218f87828801611f3b565b60008060408385031215612295578182fd5b823567ffffffffffffffff808211156122ac578384fd5b818501915085601f8301126122bf578384fd5b813560206122cc82612829565b6040516122d982826128b7565b8381528281019150858301600585901b870184018b10156122f8578889fd5b8896505b848710156123215761230d81611eb0565b8352600196909601959183019183016122fc565b5096505086013592505080821115612337578283fd5b5061234485828601611ec7565b9150509250929050565b60006020828403121561235f578081fd5b5035919050565b60008060408385031215612378578182fd5b82359150611f8360208401611eb0565b6000806040838503121561239a578182fd5b50508035926020909101359150565b6000602082840312156123ba578081fd5b8135610c4b816129d4565b6000602082840312156123d6578081fd5b8151610c4b816129d4565b6000602082840312156123f2578081fd5b813567ffffffffffffffff811115612408578182fd5b8201601f81018413612418578182fd5b61242784823560208401611e52565b949350505050565b6000815180845260208085019450808401835b8381101561245e57815187529582019590820190600101612442565b509495945050505050565b60008151808452815b8181101561248e57602081850181015186830182015201612472565b8181111561249f5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a0604082018190526000906124e09083018661242f565b82810360608401526124f2818661242f565b905082810360808401526125068185612469565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061254c90830184612469565b979650505050505050565b600060208252610c4b602083018461242f565b60006040825261257d604083018561242f565b828103602084015261258f818561242f565b95945050505050565b600060208252610c4b6020830184612469565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602e908201527f426f6b6b79506f6f426168734e46543a206d7573742068617665206d696e746560408201526d1c881c9bdb19481d1bc81b5a5b9d60921b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600067ffffffffffffffff82111561284357612843612915565b5060051b60200190565b60008219821115612860576128606128ff565b500190565b600082821015612877576128776128ff565b500390565b600181811c9082168061289057607f821691505b602082108114156128b157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156128dd576128dd612915565b6040525050565b60006000198214156128f8576128f86128ff565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115610b0557600481823e5160e01c90565b600060443d101561295257610b05565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612984575050505050610b05565b828501915081518181111561299e57505050505050610b05565b843d87010160208285010111156129ba57505050505050610b05565b6129c9602082860101876128b7565b509094505050505090565b6001600160e01b03198116811461053357600080fdfea2646970667358221220c83a48e65425db4118ea76687fc4c2b91e2b58050a72217914533b9f018ab2bf64736f6c634300080300330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f657468657276656e64696e676d616368696e652e696f2f6e6674732f7b69647d2e6a736f6e00000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c8063731133e9116100de578063ca15c87311610097578063e63ab1e911610071578063e63ab1e914610383578063e985e9c5146103aa578063f242432a146103e6578063f5298aca146103f95761018d565b8063ca15c87314610336578063d539139314610349578063d547741f146103705761018d565b8063731133e9146102c25780638456cb59146102d55780639010d07c146102dd57806391d1485414610308578063a217fddf1461031b578063a22cb465146103235761018d565b80632eb2c2d61161014b5780633f4ba83a116101255780633f4ba83a1461027f5780634e1273f4146102875780635c975abb146102a75780636b20c454146102af5761018d565b80632eb2c2d6146102465780632f2ff15d1461025957806336568abe1461026c5761018d565b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db5780630e89341c146101f05780631f7fdffa14610210578063248a9ca314610223575b600080fd5b6101a56101a03660046121d5565b61040c565b6040519081526020015b60405180910390f35b6101cb6101c63660046123a9565b6104a8565b60405190151581526020016101af565b6101ee6101e93660046123e1565b6104bb565b005b6102036101fe36600461234e565b610536565b6040516101af9190612598565b6101ee61021e366004612106565b6105ca565b6101a561023136600461234e565b60009081526020819052604090206001015490565b6101ee610254366004611f8c565b610622565b6101ee610267366004612366565b6108b9565b6101ee61027a366004612366565b6108e0565b6101ee610902565b61029a610295366004612283565b61099c565b6040516101af9190612557565b6101cb610afe565b6101ee6102bd366004612095565b610b08565b6101ee6102d0366004612230565b610b4b565b6101ee610b9d565b6102f06102eb366004612388565b610c33565b6040516001600160a01b0390911681526020016101af565b6101cb610316366004612366565b610c52565b6101a5600081565b6101ee61033136600461219b565b610c7b565b6101a561034436600461234e565b610d5f565b6101a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6101ee61037e366004612366565b610d76565b6101a57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6101cb6103b8366004611f5a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6101ee6103f4366004612032565b610d80565b6101ee6104073660046121fe565b610ef1565b60006001600160a01b03831661047d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006104b382610f57565b90505b919050565b6104c6600033610316565b61052a5760405162461bcd60e51b815260206004820152602f60248201527f426f6b6b79506f6f426168734e46543a206d75737420686176652061646d696e60448201526e20726f6c6520746f2073657455524960881b6064820152608401610474565b61053381610f97565b50565b6060600480546105459061287c565b80601f01602080910402602001604051908101604052809291908181526020018280546105719061287c565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b50505050509050919050565b6105f47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610316565b6106105760405162461bcd60e51b815260040161047490612752565b61061c84848484610faa565b50505050565b81518351146106435760405162461bcd60e51b8152600401610474906127a0565b6001600160a01b0384166106695760405162461bcd60e51b815260040161047490612680565b6001600160a01b038516331480610685575061068585336103b8565b6106ec5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610474565b336106fb818787878787611128565b60005b845181101561084b57600085828151811061072957634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061075557634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526002835260408082206001600160a01b038e1683529093529190912054909150818110156107a65760405162461bcd60e51b815260040161047490612708565b6107b08282612865565b6002600085815260200190815260200160002060008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550816002600085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610830919061284d565b9250508190555050505080610844906128e4565b90506106fe565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161089b92919061256a565b60405180910390a46108b1818787878787611136565b505050505050565b6108c382826112a1565b60008281526001602052604090206108db9082610f42565b505050565b6108ea8282611322565b60008281526001602052604090206108db908261139c565b61092c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610316565b6109925760405162461bcd60e51b815260206004820152603160248201527f426f6b6b79506f6f426168734e46543a206d75737420686176652070617573656044820152707220726f6c6520746f20756e706175736560781b6064820152608401610474565b61099a6113b1565b565b60608151835114610a015760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610474565b6000835167ffffffffffffffff811115610a2b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a54578160200160208202803683370190505b50905060005b8451811015610af657610abb858281518110610a8657634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610aae57634e487b7160e01b600052603260045260246000fd5b602002602001015161040c565b828281518110610adb57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610aef816128e4565b9050610a5a565b509392505050565b60055460ff165b90565b6001600160a01b038316331480610b245750610b2483336103b8565b610b405760405162461bcd60e51b815260040161047490612637565b6108db838383611446565b610b757f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610316565b610b915760405162461bcd60e51b815260040161047490612752565b61061c84848484611600565b610bc77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610316565b610c2b5760405162461bcd60e51b815260206004820152602f60248201527f426f6b6b79506f6f426168734e46543a206d757374206861766520706175736560448201526e7220726f6c6520746f20706175736560881b6064820152608401610474565b61099a6116c9565b6000828152600160205260408120610c4b9083611746565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b0383161415610ce65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610474565b3360008181526003602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d53911515815260200190565b60405180910390a35050565b60008181526001602052604081206104b390611752565b6108ea828261175c565b6001600160a01b038416610da65760405162461bcd60e51b815260040161047490612680565b6001600160a01b038516331480610dc25750610dc285336103b8565b610dde5760405162461bcd60e51b815260040161047490612637565b33610dfd818787610dee886117dc565b610df7886117dc565b87611128565b60008481526002602090815260408083206001600160a01b038a16845290915290205483811015610e405760405162461bcd60e51b815260040161047490612708565b610e4a8482612865565b60008681526002602090815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290610e8890849061284d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ee8828888888888611835565b50505050505050565b6001600160a01b038316331480610f0d5750610f0d83336103b8565b610f295760405162461bcd60e51b815260040161047490612637565b6108db8383836118ff565b610f3e8282611a0c565b5050565b6000610c4b836001600160a01b038416611a90565b60006001600160e01b03198216636cdb3d1360e11b1480610f8857506001600160e01b031982166303a24d0760e21b145b806104b357506104b382611adf565b8051610f3e906004906020840190611db9565b6001600160a01b038416610fd05760405162461bcd60e51b8152600401610474906127e8565b8151835114610ff15760405162461bcd60e51b8152600401610474906127a0565b3361100181600087878787611128565b60005b84518110156110b95783818151811061102d57634e487b7160e01b600052603260045260246000fd5b60200260200101516002600087848151811061105957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110a1919061284d565b909155508190506110b1816128e4565b915050611004565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161110a92919061256a565b60405180910390a461112181600087878787611136565b5050505050565b6108b1868686868686611b04565b6001600160a01b0384163b156108b15760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061117a90899089908890889088906004016124b4565b602060405180830381600087803b15801561119457600080fd5b505af19250505080156111c4575060408051601f3d908101601f191682019092526111c1918101906123c5565b60015b611271576111d061292b565b806308c379a0141561120a57506111e5612942565b806111f0575061120c565b8060405162461bcd60e51b81526004016104749190612598565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610474565b6001600160e01b0319811663bc197c8160e01b14610ee85760405162461bcd60e51b8152600401610474906125ab565b6000828152602081905260409020600101546112be905b33610316565b610f345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401610474565b6001600160a01b03811633146113925760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610474565b610f3e8282611b6e565b6000610c4b836001600160a01b038416611bd3565b6113b9610afe565b6113fc5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610474565b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661146c5760405162461bcd60e51b8152600401610474906126c5565b805182511461148d5760405162461bcd60e51b8152600401610474906127a0565b60003390506114b081856000868660405180602001604052806000815250611128565b60005b83518110156115a15760008482815181106114de57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061150a57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526002835260408082206001600160a01b038c16835290935291909120549091508181101561155b5760405162461bcd60e51b8152600401610474906125f3565b6115658282612865565b60009384526002602090815260408086206001600160a01b038c1687529091529093209290925550819050611599816128e4565b9150506114b3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516115f292919061256a565b60405180910390a450505050565b6001600160a01b0384166116265760405162461bcd60e51b8152600401610474906127e8565b3361163781600087610dee886117dc565b60008481526002602090815260408083206001600160a01b03891684529091528120805485929061166990849061284d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461112181600087878787611835565b6116d1610afe565b156117115760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610474565b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114293390565b6000610c4b8383611cf0565b60006104b3825490565b600082815260208190526040902060010154611777906112b8565b6113925760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b6064820152608401610474565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061182457634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156108b15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118799089908990889088908890600401612512565b602060405180830381600087803b15801561189357600080fd5b505af19250505080156118c3575060408051601f3d908101601f191682019092526118c0918101906123c5565b60015b6118cf576111d061292b565b6001600160e01b0319811663f23a6e6160e01b14610ee85760405162461bcd60e51b8152600401610474906125ab565b6001600160a01b0383166119255760405162461bcd60e51b8152600401610474906126c5565b3361195481856000611936876117dc565b61193f876117dc565b60405180602001604052806000815250611128565b60008381526002602090815260408083206001600160a01b0388168452909152902054828110156119975760405162461bcd60e51b8152600401610474906125f3565b6119a18382612865565b60008581526002602090815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b611a168282610c52565b610f3e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611a4c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054611ad7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a2565b5060006104a2565b60006001600160e01b03198216635a05180f60e01b14806104b357506104b382611d84565b611b0c610afe565b156108b15760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610474565b611b788282610c52565b15610f3e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015611ce6576000611bf7600183612865565b8554909150600090611c0b90600190612865565b90506000866000018281548110611c3257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611c6357634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611c7a83600161284d565b60008281526001890160205260409020558654879080611caa57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506104a2565b60009150506104a2565b81546000908210611d4e5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610474565b826000018281548110611d7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006001600160e01b03198216637965db0b60e01b14806104b357506301ffc9a760e01b6001600160e01b03198316146104b3565b828054611dc59061287c565b90600052602060002090601f016020900481019282611de75760008555611e2d565b82601f10611e0057805160ff1916838001178555611e2d565b82800160010185558215611e2d579182015b82811115611e2d578251825591602001919060010190611e12565b50611e39929150611e3d565b5090565b5b80821115611e395760008155600101611e3e565b600067ffffffffffffffff831115611e6c57611e6c612915565b604051611e83601f8501601f1916602001826128b7565b809150838152848484011115611e9857600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146104b657600080fd5b600082601f830112611ed7578081fd5b81356020611ee482612829565b604051611ef182826128b7565b8381528281019150858301600585901b87018401881015611f10578586fd5b855b85811015611f2e57813584529284019290840190600101611f12565b5090979650505050505050565b600082601f830112611f4b578081fd5b610c4b83833560208501611e52565b60008060408385031215611f6c578182fd5b611f7583611eb0565b9150611f8360208401611eb0565b90509250929050565b600080600080600060a08688031215611fa3578081fd5b611fac86611eb0565b9450611fba60208701611eb0565b9350604086013567ffffffffffffffff80821115611fd6578283fd5b611fe289838a01611ec7565b94506060880135915080821115611ff7578283fd5b61200389838a01611ec7565b93506080880135915080821115612018578283fd5b5061202588828901611f3b565b9150509295509295909350565b600080600080600060a08688031215612049578081fd5b61205286611eb0565b945061206060208701611eb0565b93506040860135925060608601359150608086013567ffffffffffffffff811115612089578182fd5b61202588828901611f3b565b6000806000606084860312156120a9578283fd5b6120b284611eb0565b9250602084013567ffffffffffffffff808211156120ce578384fd5b6120da87838801611ec7565b935060408601359150808211156120ef578283fd5b506120fc86828701611ec7565b9150509250925092565b6000806000806080858703121561211b578384fd5b61212485611eb0565b9350602085013567ffffffffffffffff80821115612140578485fd5b61214c88838901611ec7565b94506040870135915080821115612161578384fd5b61216d88838901611ec7565b93506060870135915080821115612182578283fd5b5061218f87828801611f3b565b91505092959194509250565b600080604083850312156121ad578182fd5b6121b683611eb0565b9150602083013580151581146121ca578182fd5b809150509250929050565b600080604083850312156121e7578182fd5b6121f083611eb0565b946020939093013593505050565b600080600060608486031215612212578081fd5b61221b84611eb0565b95602085013595506040909401359392505050565b60008060008060808587031215612245578182fd5b61224e85611eb0565b93506020850135925060408501359150606085013567ffffffffffffffff811115612277578182fd5b61218f87828801611f3b565b60008060408385031215612295578182fd5b823567ffffffffffffffff808211156122ac578384fd5b818501915085601f8301126122bf578384fd5b813560206122cc82612829565b6040516122d982826128b7565b8381528281019150858301600585901b870184018b10156122f8578889fd5b8896505b848710156123215761230d81611eb0565b8352600196909601959183019183016122fc565b5096505086013592505080821115612337578283fd5b5061234485828601611ec7565b9150509250929050565b60006020828403121561235f578081fd5b5035919050565b60008060408385031215612378578182fd5b82359150611f8360208401611eb0565b6000806040838503121561239a578182fd5b50508035926020909101359150565b6000602082840312156123ba578081fd5b8135610c4b816129d4565b6000602082840312156123d6578081fd5b8151610c4b816129d4565b6000602082840312156123f2578081fd5b813567ffffffffffffffff811115612408578182fd5b8201601f81018413612418578182fd5b61242784823560208401611e52565b949350505050565b6000815180845260208085019450808401835b8381101561245e57815187529582019590820190600101612442565b509495945050505050565b60008151808452815b8181101561248e57602081850181015186830182015201612472565b8181111561249f5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a0604082018190526000906124e09083018661242f565b82810360608401526124f2818661242f565b905082810360808401526125068185612469565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061254c90830184612469565b979650505050505050565b600060208252610c4b602083018461242f565b60006040825261257d604083018561242f565b828103602084015261258f818561242f565b95945050505050565b600060208252610c4b6020830184612469565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602e908201527f426f6b6b79506f6f426168734e46543a206d7573742068617665206d696e746560408201526d1c881c9bdb19481d1bc81b5a5b9d60921b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600067ffffffffffffffff82111561284357612843612915565b5060051b60200190565b60008219821115612860576128606128ff565b500190565b600082821015612877576128776128ff565b500390565b600181811c9082168061289057607f821691505b602082108114156128b157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156128dd576128dd612915565b6040525050565b60006000198214156128f8576128f86128ff565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115610b0557600481823e5160e01c90565b600060443d101561295257610b05565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612984575050505050610b05565b828501915081518181111561299e57505050505050610b05565b843d87010160208285010111156129ba57505050505050610b05565b6129c9602082860101876128b7565b509094505050505090565b6001600160e01b03198116811461053357600080fdfea2646970667358221220c83a48e65425db4118ea76687fc4c2b91e2b58050a72217914533b9f018ab2bf64736f6c63430008030033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f657468657276656e64696e676d616368696e652e696f2f6e6674732f7b69647d2e6a736f6e00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri (string): https://ethervendingmachine.io/nfts/{id}.json

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [2] : 68747470733a2f2f657468657276656e64696e676d616368696e652e696f2f6e
Arg [3] : 6674732f7b69647d2e6a736f6e00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

56896:3160:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19742:231;;;;;;:::i;:::-;;:::i;:::-;;;13513:25:1;;;13501:2;13486:18;19742:231:0;;;;;;;;59505:187;;;;;;:::i;:::-;;:::i;:::-;;;13340:14:1;;13333:22;13315:41;;13303:2;13288:18;59505:187:0;13270:92:1;57633:189:0;;;;;;:::i;:::-;;:::i;:::-;;19486:105;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58391:272::-;;;;;;:::i;:::-;;:::i;40011:123::-;;;;;;:::i;:::-;40077:7;40104:12;;;;;;;;;;:22;;;;40011:123;22445:1239;;;;;;:::i;:::-;;:::i;55204:165::-;;;;;;:::i;:::-;;:::i;55727:174::-;;;;;;:::i;:::-;;:::i;59263:170::-;;;:::i;20139:549::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33531:86::-;;;:::i;32144:319::-;;;;;;:::i;:::-;;:::i;58044:240::-;;;;;;:::i;:::-;;:::i;58879:164::-;;;:::i;54659:145::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10999:32:1;;;10981:51;;10969:2;10954:18;54659:145:0;10936:102:1;39683:139:0;;;;;;:::i;:::-;;:::i;38139:49::-;;38184:4;38139:49;;20761:311;;;;;;:::i;:::-;;:::i;54978:134::-;;;;;;:::i;:::-;;:::i;56998:62::-;;57036:24;56998:62;;55462:170;;;;;;:::i;:::-;;:::i;57067:62::-;;57105:24;57067:62;;21144:168;;;;;;:::i;:::-;-1:-1:-1;;;;;21267:27:0;;;21243:4;21267:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21144:168;21384:984;;;;;;:::i;:::-;;:::i;31849:287::-;;;;;;:::i;:::-;;:::i;19742:231::-;19828:7;-1:-1:-1;;;;;19856:21:0;;19848:77;;;;-1:-1:-1;;;19848:77:0;;16391:2:1;19848:77:0;;;16373:21:1;16430:2;16410:18;;;16403:30;16469:34;16449:18;;;16442:62;-1:-1:-1;;;16520:18:1;;;16513:41;16571:19;;19848:77:0;;;;;;;;;-1:-1:-1;19943:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;19943:22:0;;;;;;;;;;19742:231;;;;;:::o;59505:187::-;59624:4;59648:36;59672:11;59648:23;:36::i;:::-;59641:43;;59505:187;;;;:::o;57633:189::-;57695:41;38184:4;16554:10;57723:12;16474:98;57695:41;57687:101;;;;-1:-1:-1;;;57687:101:0;;22493:2:1;57687:101:0;;;22475:21:1;22532:2;22512:18;;;22505:30;22571:34;22551:18;;;22544:62;-1:-1:-1;;;22622:18:1;;;22615:45;22677:19;;57687:101:0;22465:237:1;57687:101:0;57801:13;57809:4;57801:7;:13::i;:::-;57633:189;:::o;19486:105::-;19546:13;19579:4;19572:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19486:105;;;:::o;58391:272::-;58523:34;57036:24;16554:10;58544:12;16474:98;58523:34;58515:93;;;;-1:-1:-1;;;58515:93:0;;;;;;;:::i;:::-;58621:34;58632:2;58636:3;58641:7;58650:4;58621:10;:34::i;:::-;58391:272;;;;:::o;22445:1239::-;22710:7;:14;22696:3;:10;:28;22688:81;;;;-1:-1:-1;;;22688:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22788:16:0;;22780:66;;;;-1:-1:-1;;;22780:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22879:20:0;;16554:10;22879:20;;:60;;-1:-1:-1;22903:36:0;22920:4;16554:10;22926:12;16474:98;22903:36;22857:160;;;;-1:-1:-1;;;22857:160:0;;19199:2:1;22857:160:0;;;19181:21:1;19238:2;19218:18;;;19211:30;19277:34;19257:18;;;19250:62;-1:-1:-1;;;19328:18:1;;;19321:48;19386:19;;22857:160:0;19171:240:1;22857:160:0;16554:10;23074:60;16554:10;23105:4;23111:2;23115:3;23120:7;23129:4;23074:20;:60::i;:::-;23152:9;23147:377;23171:3;:10;23167:1;:14;23147:377;;;23203:10;23216:3;23220:1;23216:6;;;;;;-1:-1:-1;;;23216:6:0;;;;;;;;;;;;;;;23203:19;;23237:14;23254:7;23262:1;23254:10;;;;;;-1:-1:-1;;;23254:10:0;;;;;;;;;;;;;;;;;;;;23281:19;23303:13;;;:9;:13;;;;;;-1:-1:-1;;;;;23303:19:0;;;;;;;;;;;;23254:10;;-1:-1:-1;23345:21:0;;;;23337:76;;;;-1:-1:-1;;;23337:76:0;;;;;;;:::i;:::-;23450:20;23464:6;23450:11;:20;:::i;:::-;23428:9;:13;23438:2;23428:13;;;;;;;;;;;:19;23442:4;-1:-1:-1;;;;;23428:19:0;-1:-1:-1;;;;;23428:19:0;;;;;;;;;;;;:42;;;;23506:6;23485:9;:13;23495:2;23485:13;;;;;;;;;;;:17;23499:2;-1:-1:-1;;;;;23485:17:0;-1:-1:-1;;;;;23485:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23147:377;;;23183:3;;;;:::i;:::-;;;23147:377;;;;23571:2;-1:-1:-1;;;;;23541:47:0;23565:4;-1:-1:-1;;;;;23541:47:0;23555:8;-1:-1:-1;;;;;23541:47:0;;23575:3;23580:7;23541:47;;;;;;;:::i;:::-;;;;;;;;23601:75;23637:8;23647:4;23653:2;23657:3;23662:7;23671:4;23601:35;:75::i;:::-;22445:1239;;;;;;:::o;55204:165::-;55289:30;55305:4;55311:7;55289:15;:30::i;:::-;55330:18;;;;:12;:18;;;;;:31;;55353:7;55330:22;:31::i;:::-;;55204:165;;:::o;55727:174::-;55815:33;55834:4;55840:7;55815:18;:33::i;:::-;55859:18;;;;:12;:18;;;;;:34;;55885:7;55859:25;:34::i;59263:170::-;59316:34;57105:24;16554:10;59337:12;16474:98;59316:34;59308:96;;;;-1:-1:-1;;;59308:96:0;;15973:2:1;59308:96:0;;;15955:21:1;16012:2;15992:18;;;15985:30;16051:34;16031:18;;;16024:62;-1:-1:-1;;;16102:18:1;;;16095:47;16159:19;;59308:96:0;15945:239:1;59308:96:0;59415:10;:8;:10::i;:::-;59263:170::o;20139:549::-;20320:16;20381:3;:10;20362:8;:15;:29;20354:83;;;;-1:-1:-1;;;20354:83:0;;21674:2:1;20354:83:0;;;21656:21:1;21713:2;21693:18;;;21686:30;21752:34;21732:18;;;21725:62;-1:-1:-1;;;21803:18:1;;;21796:39;21852:19;;20354:83:0;21646:231:1;20354:83:0;20450:30;20497:8;:15;20483:30;;;;;;-1:-1:-1;;;20483:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20483:30:0;;20450:63;;20531:9;20526:122;20550:8;:15;20546:1;:19;20526:122;;;20606:30;20616:8;20625:1;20616:11;;;;;;-1:-1:-1;;;20616:11:0;;;;;;;;;;;;;;;20629:3;20633:1;20629:6;;;;;;-1:-1:-1;;;20629:6:0;;;;;;;;;;;;;;;20606:9;:30::i;:::-;20587:13;20601:1;20587:16;;;;;;-1:-1:-1;;;20587:16:0;;;;;;;;;;;;;;;;;;:49;20567:3;;;:::i;:::-;;;20526:122;;;-1:-1:-1;20667:13:0;20139:549;-1:-1:-1;;;20139:549:0:o;33531:86::-;33602:7;;;;33531:86;;:::o;32144:319::-;-1:-1:-1;;;;;32275:23:0;;16554:10;32275:23;;:66;;-1:-1:-1;32302:39:0;32319:7;16554:10;32328:12;16474:98;32302:39;32253:157;;;;-1:-1:-1;;;32253:157:0;;;;;;;:::i;:::-;32423:32;32434:7;32443:3;32448:6;32423:10;:32::i;58044:240::-;58151:34;57036:24;16554:10;58172:12;16474:98;58151:34;58143:93;;;;-1:-1:-1;;;58143:93:0;;;;;;;:::i;:::-;58249:27;58255:2;58259;58263:6;58271:4;58249:5;:27::i;58879:164::-;58930:34;57105:24;16554:10;58951:12;16474:98;58930:34;58922:94;;;;-1:-1:-1;;;58922:94:0;;20433:2:1;58922:94:0;;;20415:21:1;20472:2;20452:18;;;20445:30;20511:34;20491:18;;;20484:62;-1:-1:-1;;;20562:18:1;;;20555:45;20617:19;;58922:94:0;20405:237:1;58922:94:0;59027:8;:6;:8::i;54659:145::-;54741:7;54768:18;;;:12;:18;;;;;:28;;54790:5;54768:21;:28::i;:::-;54761:35;54659:145;-1:-1:-1;;;54659:145:0:o;39683:139::-;39761:4;39785:12;;;;;;;;;;;-1:-1:-1;;;;;39785:29:0;;;;;;;;;;;;;;;39683:139::o;20761:311::-;16554:10;-1:-1:-1;;;;;20864:24:0;;;;20856:78;;;;-1:-1:-1;;;20856:78:0;;21264:2:1;20856:78:0;;;21246:21:1;21303:2;21283:18;;;21276:30;21342:34;21322:18;;;21315:62;-1:-1:-1;;;21393:18:1;;;21386:39;21442:19;;20856:78:0;21236:231:1;20856:78:0;16554:10;20947:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20947:42:0;;;;;;;;;;:53;;-1:-1:-1;;20947:53:0;;;;;;;:42;-1:-1:-1;;;;;21016:48:0;;21055:8;21016:48;;;;13340:14:1;13333:22;13315:41;;13303:2;13288:18;;13270:92;21016:48:0;;;;;;;;20761:311;;:::o;54978:134::-;55050:7;55077:18;;;:12;:18;;;;;:27;;:25;:27::i;55462:170::-;55548:31;55565:4;55571:7;55548:16;:31::i;21384:984::-;-1:-1:-1;;;;;21610:16:0;;21602:66;;;;-1:-1:-1;;;21602:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21701:20:0;;16554:10;21701:20;;:60;;-1:-1:-1;21725:36:0;21742:4;16554:10;21748:12;16474:98;21725:36;21679:151;;;;-1:-1:-1;;;21679:151:0;;;;;;;:::i;:::-;16554:10;21887:96;16554:10;21918:4;21924:2;21928:21;21946:2;21928:17;:21::i;:::-;21951:25;21969:6;21951:17;:25::i;:::-;21978:4;21887:20;:96::i;:::-;21996:19;22018:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;22018:19:0;;;;;;;;;;22056:21;;;;22048:76;;;;-1:-1:-1;;;22048:76:0;;;;;;;:::i;:::-;22157:20;22171:6;22157:11;:20;:::i;:::-;22135:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;22135:19:0;;;;;;;;;;:42;;;;22188:17;;;;;;;:27;;22209:6;;22135:13;22188:27;;22209:6;;22188:27;:::i;:::-;;;;-1:-1:-1;;22233:46:0;;;23881:25:1;;;23937:2;23922:18;;23915:34;;;-1:-1:-1;;;;;22233:46:0;;;;;;;;;;;;;;23854:18:1;22233:46:0;;;;;;;22292:68;22323:8;22333:4;22339:2;22343;22347:6;22355:4;22292:30;:68::i;:::-;21384:984;;;;;;;:::o;31849:287::-;-1:-1:-1;;;;;31955:23:0;;16554:10;31955:23;;:66;;-1:-1:-1;31982:39:0;31999:7;16554:10;32008:12;16474:98;31982:39;31933:157;;;;-1:-1:-1;;;31933:157:0;;;;;;;:::i;:::-;32103:25;32109:7;32118:2;32122:5;32103;:25::i;42416:112::-;42495:25;42506:4;42512:7;42495:10;:25::i;:::-;42416:112;;:::o;49981:152::-;50051:4;50075:50;50080:3;-1:-1:-1;;;;;50100:23:0;;50075:4;:50::i;18778:297::-;18880:4;-1:-1:-1;;;;;;18904:41:0;;-1:-1:-1;;;18904:41:0;;:110;;-1:-1:-1;;;;;;;18962:52:0;;-1:-1:-1;;;18962:52:0;18904:110;:163;;;;19031:36;19055:11;19031:23;:36::i;24528:88::-;24595:13;;;;:4;;:13;;;;;:::i;25929:689::-;-1:-1:-1;;;;;26064:16:0;;26056:62;;;;-1:-1:-1;;;26056:62:0;;;;;;;:::i;:::-;26151:7;:14;26137:3;:10;:28;26129:81;;;;-1:-1:-1;;;26129:81:0;;;;;;;:::i;:::-;16554:10;26267:66;16554:10;26223:16;26310:2;26314:3;26319:7;26328:4;26267:20;:66::i;:::-;26351:6;26346:100;26367:3;:10;26363:1;:14;26346:100;;;26424:7;26432:1;26424:10;;;;;;-1:-1:-1;;;26424:10:0;;;;;;;;;;;;;;;26399:9;:17;26409:3;26413:1;26409:6;;;;;;-1:-1:-1;;;26409:6:0;;;;;;;;;;;;;;;26399:17;;;;;;;;;;;:21;26417:2;-1:-1:-1;;;;;26399:21:0;-1:-1:-1;;;;;26399:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;26379:3:0;;-1:-1:-1;26379:3:0;;;:::i;:::-;;;;26346:100;;;;26499:2;-1:-1:-1;;;;;26463:53:0;26495:1;-1:-1:-1;;;;;26463:53:0;26477:8;-1:-1:-1;;;;;26463:53:0;;26503:3;26508:7;26463:53;;;;;;;:::i;:::-;;;;;;;;26529:81;26565:8;26583:1;26587:2;26591:3;26596:7;26605:4;26529:35;:81::i;:::-;25929:689;;;;;:::o;59700:353::-;59979:66;60006:8;60016:4;60022:2;60026:3;60031:7;60040:4;59979:26;:66::i;30501:799::-;-1:-1:-1;;;;;30755:13:0;;8972:20;9011:8;30751:542;;30791:79;;-1:-1:-1;;;30791:79:0;;-1:-1:-1;;;;;30791:43:0;;;;;:79;;30835:8;;30845:4;;30851:3;;30856:7;;30865:4;;30791:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30791:79:0;;;;;;;;-1:-1:-1;;30791:79:0;;;;;;;;;;;;:::i;:::-;;;30787:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;31155:6;31148:14;;-1:-1:-1;;;31148:14:0;;;;;;;;:::i;30787:495::-;;;31204:62;;-1:-1:-1;;;31204:62:0;;13975:2:1;31204:62:0;;;13957:21:1;14014:2;13994:18;;;13987:30;14053:34;14033:18;;;14026:62;-1:-1:-1;;;14104:18:1;;;14097:50;14164:19;;31204:62:0;13947:242:1;30787:495:0;-1:-1:-1;;;;;;30920:64:0;;-1:-1:-1;;;30920:64:0;30916:163;;31009:50;;-1:-1:-1;;;31009:50:0;;;;;;;:::i;40396:232::-;40077:7;40104:12;;;;;;;;;;:22;;;40489:41;;40497:18;16554:10;40517:12;16474:98;40489:41;40481:101;;;;-1:-1:-1;;;40481:101:0;;15208:2:1;40481:101:0;;;15190:21:1;15247:2;15227:18;;;15220:30;15286:34;15266:18;;;15259:62;-1:-1:-1;;;15337:18:1;;;15330:45;15392:19;;40481:101:0;15180:237:1;41615:218:0;-1:-1:-1;;;;;41711:23:0;;16554:10;41711:23;41703:83;;;;-1:-1:-1;;;41703:83:0;;23311:2:1;41703:83:0;;;23293:21:1;23350:2;23330:18;;;23323:30;23389:34;23369:18;;;23362:62;-1:-1:-1;;;23440:18:1;;;23433:45;23495:19;;41703:83:0;23283:237:1;41703:83:0;41799:26;41811:4;41817:7;41799:11;:26::i;50309:158::-;50382:4;50406:53;50414:3;-1:-1:-1;;;;;50434:23:0;;50406:7;:53::i;34590:120::-;34134:8;:6;:8::i;:::-;34126:41;;;;-1:-1:-1;;;34126:41:0;;15624:2:1;34126:41:0;;;15606:21:1;15663:2;15643:18;;;15636:30;-1:-1:-1;;;15682:18:1;;;15675:50;15742:18;;34126:41:0;15596:170:1;34126:41:0;34649:7:::1;:15:::0;;-1:-1:-1;;34649:15:0::1;::::0;;34680:22:::1;16554:10:::0;34689:12:::1;34680:22;::::0;-1:-1:-1;;;;;10999:32:1;;;10981:51;;10969:2;10954:18;34680:22:0::1;;;;;;;34590:120::o:0;27685:837::-;-1:-1:-1;;;;;27806:21:0;;27798:69;;;;-1:-1:-1;;;27798:69:0;;;;;;;:::i;:::-;27900:7;:14;27886:3;:10;:28;27878:81;;;;-1:-1:-1;;;27878:81:0;;;;;;;:::i;:::-;27972:16;16554:10;27972:31;;28016:69;28037:8;28047:7;28064:1;28068:3;28073:7;28016:69;;;;;;;;;;;;:20;:69::i;:::-;28103:6;28098:341;28119:3;:10;28115:1;:14;28098:341;;;28151:10;28164:3;28168:1;28164:6;;;;;;-1:-1:-1;;;28164:6:0;;;;;;;;;;;;;;;28151:19;;28185:14;28202:7;28210:1;28202:10;;;;;;-1:-1:-1;;;28202:10:0;;;;;;;;;;;;;;;;;;;;28229:22;28254:13;;;:9;:13;;;;;;-1:-1:-1;;;;;28254:22:0;;;;;;;;;;;;28202:10;;-1:-1:-1;28299:24:0;;;;28291:73;;;;-1:-1:-1;;;28291:73:0;;;;;;;:::i;:::-;28404:23;28421:6;28404:14;:23;:::i;:::-;28379:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28379:22:0;;;;;;;;;;:48;;;;-1:-1:-1;28131:3:0;;-1:-1:-1;28131:3:0;;;:::i;:::-;;;;28098:341;;;;28497:1;-1:-1:-1;;;;;28456:58:0;28480:7;-1:-1:-1;;;;;28456:58:0;28470:8;-1:-1:-1;;;;;28456:58:0;;28501:3;28506:7;28456:58;;;;;;;:::i;:::-;;;;;;;;27685:837;;;;:::o;25017:556::-;-1:-1:-1;;;;;25132:21:0;;25124:67;;;;-1:-1:-1;;;25124:67:0;;;;;;;:::i;:::-;16554:10;25248:107;16554:10;25204:16;25291:7;25300:21;25318:2;25300:17;:21::i;25248:107::-;25368:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;25368:22:0;;;;;;;;;:32;;25394:6;;25368:13;:32;;25394:6;;25368:32;:::i;:::-;;;;-1:-1:-1;;25416:57:0;;;23881:25:1;;;23937:2;23922:18;;23915:34;;;-1:-1:-1;;;;;25416:57:0;;;;25449:1;;25416:57;;;;;;23854:18:1;25416:57:0;;;;;;;25486:79;25517:8;25535:1;25539:7;25548:2;25552:6;25560:4;25486:30;:79::i;34331:118::-;33857:8;:6;:8::i;:::-;33856:9;33848:38;;;;-1:-1:-1;;;33848:38:0;;18448:2:1;33848:38:0;;;18430:21:1;18487:2;18467:18;;;18460:30;-1:-1:-1;;;18506:18:1;;;18499:46;18562:18;;33848:38:0;18420:166:1;33848:38:0;34391:7:::1;:14:::0;;-1:-1:-1;;34391:14:0::1;34401:4;34391:14;::::0;;34421:20:::1;34428:12;16554:10:::0;16474:98;;51267:158;51341:7;51392:22;51396:3;51408:5;51392:3;:22::i;50806:117::-;50869:7;50896:19;50904:3;47563:18;;47480:109;40873:235;40077:7;40104:12;;;;;;;;;;:22;;;40967:41;;40975:18;40011:123;40967:41;40959:102;;;;-1:-1:-1;;;40959:102:0;;18031:2:1;40959:102:0;;;18013:21:1;18070:2;18050:18;;;18043:30;18109:34;18089:18;;;18082:62;-1:-1:-1;;;18160:18:1;;;18153:46;18216:19;;40959:102:0;18003:238:1;31308:198:0;31428:16;;;31442:1;31428:16;;;;;;;;;31374;;31403:22;;31428:16;;;;;;;;;;;;-1:-1:-1;31428:16:0;31403:41;;31466:7;31455:5;31461:1;31455:8;;;;;;-1:-1:-1;;;31455:8:0;;;;;;;;;;;;;;;;;;:18;31493:5;31308:198;-1:-1:-1;;31308:198:0:o;29731:762::-;-1:-1:-1;;;;;29960:13:0;;8972:20;9011:8;29956:530;;29996:72;;-1:-1:-1;;;29996:72:0;;-1:-1:-1;;;;;29996:38:0;;;;;:72;;30035:8;;30045:4;;30051:2;;30055:6;;30063:4;;29996:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29996:72:0;;;;;;;;-1:-1:-1;;29996:72:0;;;;;;;;;;;;:::i;:::-;;;29992:483;;;;:::i;:::-;-1:-1:-1;;;;;;30118:59:0;;-1:-1:-1;;;30118:59:0;30114:158;;30202:50;;-1:-1:-1;;;30202:50:0;;;;;;;:::i;26877:605::-;-1:-1:-1;;;;;26973:21:0;;26965:69;;;;-1:-1:-1;;;26965:69:0;;;;;;;:::i;:::-;16554:10;27091:105;16554:10;27122:7;27047:16;27143:21;27161:2;27143:17;:21::i;:::-;27166:25;27184:6;27166:17;:25::i;:::-;27091:105;;;;;;;;;;;;:20;:105::i;:::-;27209:22;27234:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27234:22:0;;;;;;;;;;27275:24;;;;27267:73;;;;-1:-1:-1;;;27267:73:0;;;;;;;:::i;:::-;27376:23;27393:6;27376:14;:23;:::i;:::-;27351:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27351:22:0;;;;;;;;;;;;:48;;;;27417:57;;23881:25:1;;;23922:18;;;23915:34;;;27351:13:0;;27417:57;;;;;23854:18:1;27417:57:0;;;;;;;26877:605;;;;;:::o;42863:229::-;42938:22;42946:4;42952:7;42938;:22::i;:::-;42933:152;;42977:6;:12;;;;;;;;;;;-1:-1:-1;;;;;42977:29:0;;;;;;;;;:36;;-1:-1:-1;;42977:36:0;43009:4;42977:36;;;43060:12;16554:10;16474:98;;43060:12;-1:-1:-1;;;;;43033:40:0;43051:7;-1:-1:-1;;;;;43033:40:0;43045:4;43033:40;;;;;;;;;;42863:229;;:::o;45045:414::-;45108:4;47362:19;;;:12;;;:19;;;;;;45125:327;;-1:-1:-1;45168:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;45351:18;;45329:19;;;:12;;;:19;;;;;;:40;;;;45384:11;;45125:327;-1:-1:-1;45435:5:0;45428:12;;53833:227;53918:4;-1:-1:-1;;;;;;53942:57:0;;-1:-1:-1;;;53942:57:0;;:110;;;54016:36;54040:11;54016:23;:36::i;35340:424::-;35699:8;:6;:8::i;:::-;35698:9;35690:66;;;;-1:-1:-1;;;35690:66:0;;17208:2:1;35690:66:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:34;17266:18;;;17259:62;-1:-1:-1;;;17337:18:1;;;17330:42;17389:19;;35690:66:0;17180:234:1;43100:230:0;43175:22;43183:4;43189:7;43175;:22::i;:::-;43171:152;;;43246:5;43214:12;;;;;;;;;;;-1:-1:-1;;;;;43214:29:0;;;;;;;;;;:37;;-1:-1:-1;;43214:37:0;;;43271:40;16554:10;;43214:12;;43271:40;;43246:5;43271:40;43100:230;;:::o;45635:1544::-;45701:4;45840:19;;;:12;;;:19;;;;;;45876:15;;45872:1300;;46238:21;46262:14;46275:1;46262:10;:14;:::i;:::-;46311:18;;46238:38;;-1:-1:-1;46291:17:0;;46311:22;;46332:1;;46311:22;:::i;:::-;46291:42;;46578:17;46598:3;:11;;46610:9;46598:22;;;;;;-1:-1:-1;;;46598:22:0;;;;;;;;;;;;;;;;;46578:42;;46744:9;46715:3;:11;;46727:13;46715:26;;;;;;-1:-1:-1;;;46715:26:0;;;;;;;;;;;;;;;;;;:38;46847:17;:13;46863:1;46847:17;:::i;:::-;46821:23;;;;:12;;;:23;;;;;:43;46973:17;;46821:3;;46973:17;;;-1:-1:-1;;;46973:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;47068:3;:12;;:19;47081:5;47068:19;;;;;;;;;;;47061:26;;;47111:4;47104:11;;;;;;;;45872:1300;47155:5;47148:12;;;;;47933:204;48028:18;;48000:7;;48028:26;-1:-1:-1;48020:73:0;;;;-1:-1:-1;;;48020:73:0;;14396:2:1;48020:73:0;;;14378:21:1;14435:2;14415:18;;;14408:30;14474:34;14454:18;;;14447:62;-1:-1:-1;;;14525:18:1;;;14518:32;14567:19;;48020:73:0;14368:224:1;48020:73:0;48111:3;:11;;48123:5;48111:18;;;;;;-1:-1:-1;;;48111:18:0;;;;;;;;;;;;;;;;;48104:25;;47933:204;;;;:::o;39374:217::-;39459:4;-1:-1:-1;;;;;;39483:47:0;;-1:-1:-1;;;39483:47:0;;:100;;-1:-1:-1;;;;;;;;;;17715:40:0;;;39547:36;17606:157::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:2;;;369:1;366;359:12;328:2;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;88:394;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:2;;650:1;647;640:12;665:755;;772:3;765:4;757:6;753:17;749:27;739:2;;794:5;787;780:20;739:2;834:6;821:20;860:4;883:43;923:2;883:43;:::i;:::-;955:2;949:9;967:31;995:2;987:6;967:31;:::i;:::-;1033:18;;;1067:15;;;;-1:-1:-1;1102:15:1;;;1152:1;1148:10;;;1136:23;;1132:32;;1129:41;-1:-1:-1;1126:2:1;;;1187:5;1180;1173:20;1126:2;1213:5;1227:163;1241:2;1238:1;1235:9;1227:163;;;1298:17;;1286:30;;1336:12;;;;1368;;;;1259:1;1252:9;1227:163;;;-1:-1:-1;1408:6:1;;729:691;-1:-1:-1;;;;;;;729:691:1:o;1425:228::-;;1520:3;1513:4;1505:6;1501:17;1497:27;1487:2;;1542:5;1535;1528:20;1487:2;1568:79;1643:3;1634:6;1621:20;1614:4;1606:6;1602:17;1568:79;:::i;1658:270::-;;;1787:2;1775:9;1766:7;1762:23;1758:32;1755:2;;;1808:6;1800;1793:22;1755:2;1836:29;1855:9;1836:29;:::i;:::-;1826:39;;1884:38;1918:2;1907:9;1903:18;1884:38;:::i;:::-;1874:48;;1745:183;;;;;:::o;1933:983::-;;;;;;2172:3;2160:9;2151:7;2147:23;2143:33;2140:2;;;2194:6;2186;2179:22;2140:2;2222:29;2241:9;2222:29;:::i;:::-;2212:39;;2270:38;2304:2;2293:9;2289:18;2270:38;:::i;:::-;2260:48;;2359:2;2348:9;2344:18;2331:32;2382:18;2423:2;2415:6;2412:14;2409:2;;;2444:6;2436;2429:22;2409:2;2472:61;2525:7;2516:6;2505:9;2501:22;2472:61;:::i;:::-;2462:71;;2586:2;2575:9;2571:18;2558:32;2542:48;;2615:2;2605:8;2602:16;2599:2;;;2636:6;2628;2621:22;2599:2;2664:63;2719:7;2708:8;2697:9;2693:24;2664:63;:::i;:::-;2654:73;;2780:3;2769:9;2765:19;2752:33;2736:49;;2810:2;2800:8;2797:16;2794:2;;;2831:6;2823;2816:22;2794:2;;2859:51;2902:7;2891:8;2880:9;2876:24;2859:51;:::i;:::-;2849:61;;;2130:786;;;;;;;;:::o;2921:626::-;;;;;;3110:3;3098:9;3089:7;3085:23;3081:33;3078:2;;;3132:6;3124;3117:22;3078:2;3160:29;3179:9;3160:29;:::i;:::-;3150:39;;3208:38;3242:2;3231:9;3227:18;3208:38;:::i;:::-;3198:48;;3293:2;3282:9;3278:18;3265:32;3255:42;;3344:2;3333:9;3329:18;3316:32;3306:42;;3399:3;3388:9;3384:19;3371:33;3427:18;3419:6;3416:30;3413:2;;;3464:6;3456;3449:22;3413:2;3492:49;3533:7;3524:6;3513:9;3509:22;3492:49;:::i;3552:699::-;;;;3748:2;3736:9;3727:7;3723:23;3719:32;3716:2;;;3769:6;3761;3754:22;3716:2;3797:29;3816:9;3797:29;:::i;:::-;3787:39;;3877:2;3866:9;3862:18;3849:32;3900:18;3941:2;3933:6;3930:14;3927:2;;;3962:6;3954;3947:22;3927:2;3990:61;4043:7;4034:6;4023:9;4019:22;3990:61;:::i;:::-;3980:71;;4104:2;4093:9;4089:18;4076:32;4060:48;;4133:2;4123:8;4120:16;4117:2;;;4154:6;4146;4139:22;4117:2;;4182:63;4237:7;4226:8;4215:9;4211:24;4182:63;:::i;:::-;4172:73;;;3706:545;;;;;:::o;4256:908::-;;;;;4478:3;4466:9;4457:7;4453:23;4449:33;4446:2;;;4500:6;4492;4485:22;4446:2;4528:29;4547:9;4528:29;:::i;:::-;4518:39;;4608:2;4597:9;4593:18;4580:32;4631:18;4672:2;4664:6;4661:14;4658:2;;;4693:6;4685;4678:22;4658:2;4721:61;4774:7;4765:6;4754:9;4750:22;4721:61;:::i;:::-;4711:71;;4835:2;4824:9;4820:18;4807:32;4791:48;;4864:2;4854:8;4851:16;4848:2;;;4885:6;4877;4870:22;4848:2;4913:63;4968:7;4957:8;4946:9;4942:24;4913:63;:::i;:::-;4903:73;;5029:2;5018:9;5014:18;5001:32;4985:48;;5058:2;5048:8;5045:16;5042:2;;;5079:6;5071;5064:22;5042:2;;5107:51;5150:7;5139:8;5128:9;5124:24;5107:51;:::i;:::-;5097:61;;;4436:728;;;;;;;:::o;5169:367::-;;;5295:2;5283:9;5274:7;5270:23;5266:32;5263:2;;;5316:6;5308;5301:22;5263:2;5344:29;5363:9;5344:29;:::i;:::-;5334:39;;5423:2;5412:9;5408:18;5395:32;5470:5;5463:13;5456:21;5449:5;5446:32;5436:2;;5497:6;5489;5482:22;5436:2;5525:5;5515:15;;;5253:283;;;;;:::o;5541:264::-;;;5670:2;5658:9;5649:7;5645:23;5641:32;5638:2;;;5691:6;5683;5676:22;5638:2;5719:29;5738:9;5719:29;:::i;:::-;5709:39;5795:2;5780:18;;;;5767:32;;-1:-1:-1;;;5628:177:1:o;5810:332::-;;;;5956:2;5944:9;5935:7;5931:23;5927:32;5924:2;;;5977:6;5969;5962:22;5924:2;6005:29;6024:9;6005:29;:::i;:::-;5995:39;6081:2;6066:18;;6053:32;;-1:-1:-1;6132:2:1;6117:18;;;6104:32;;5914:228;-1:-1:-1;;;5914:228:1:o;6147:551::-;;;;;6319:3;6307:9;6298:7;6294:23;6290:33;6287:2;;;6341:6;6333;6326:22;6287:2;6369:29;6388:9;6369:29;:::i;:::-;6359:39;;6445:2;6434:9;6430:18;6417:32;6407:42;;6496:2;6485:9;6481:18;6468:32;6458:42;;6551:2;6540:9;6536:18;6523:32;6578:18;6570:6;6567:30;6564:2;;;6615:6;6607;6600:22;6564:2;6643:49;6684:7;6675:6;6664:9;6660:22;6643:49;:::i;6703:1274::-;;;6882:2;6870:9;6861:7;6857:23;6853:32;6850:2;;;6903:6;6895;6888:22;6850:2;6948:9;6935:23;6977:18;7018:2;7010:6;7007:14;7004:2;;;7039:6;7031;7024:22;7004:2;7082:6;7071:9;7067:22;7057:32;;7127:7;7120:4;7116:2;7112:13;7108:27;7098:2;;7154:6;7146;7139:22;7098:2;7195;7182:16;7217:4;7240:43;7280:2;7240:43;:::i;:::-;7312:2;7306:9;7324:31;7352:2;7344:6;7324:31;:::i;:::-;7390:18;;;7424:15;;;;-1:-1:-1;7459:11:1;;;7501:1;7497:10;;;7489:19;;7485:28;;7482:41;-1:-1:-1;7479:2:1;;;7541:6;7533;7526:22;7479:2;7568:6;7559:15;;7583:169;7597:2;7594:1;7591:9;7583:169;;;7654:23;7673:3;7654:23;:::i;:::-;7642:36;;7615:1;7608:9;;;;;7698:12;;;;7730;;7583:169;;;-1:-1:-1;7771:6:1;-1:-1:-1;;7815:18:1;;7802:32;;-1:-1:-1;;7846:16:1;;;7843:2;;;7880:6;7872;7865:22;7843:2;;7908:63;7963:7;7952:8;7941:9;7937:24;7908:63;:::i;:::-;7898:73;;;6840:1137;;;;;:::o;7982:190::-;;8094:2;8082:9;8073:7;8069:23;8065:32;8062:2;;;8115:6;8107;8100:22;8062:2;-1:-1:-1;8143:23:1;;8052:120;-1:-1:-1;8052:120:1:o;8177:264::-;;;8306:2;8294:9;8285:7;8281:23;8277:32;8274:2;;;8327:6;8319;8312:22;8274:2;8368:9;8355:23;8345:33;;8397:38;8431:2;8420:9;8416:18;8397:38;:::i;8446:258::-;;;8575:2;8563:9;8554:7;8550:23;8546:32;8543:2;;;8596:6;8588;8581:22;8543:2;-1:-1:-1;;8624:23:1;;;8694:2;8679:18;;;8666:32;;-1:-1:-1;8533:171:1:o;8709:255::-;;8820:2;8808:9;8799:7;8795:23;8791:32;8788:2;;;8841:6;8833;8826:22;8788:2;8885:9;8872:23;8904:30;8928:5;8904:30;:::i;8969:259::-;;9091:2;9079:9;9070:7;9066:23;9062:32;9059:2;;;9112:6;9104;9097:22;9059:2;9149:9;9143:16;9168:30;9192:5;9168:30;:::i;9233:480::-;;9355:2;9343:9;9334:7;9330:23;9326:32;9323:2;;;9376:6;9368;9361:22;9323:2;9421:9;9408:23;9454:18;9446:6;9443:30;9440:2;;;9491:6;9483;9476:22;9440:2;9519:22;;9572:4;9564:13;;9560:27;-1:-1:-1;9550:2:1;;9606:6;9598;9591:22;9550:2;9634:73;9699:7;9694:2;9681:16;9676:2;9672;9668:11;9634:73;:::i;:::-;9624:83;9313:400;-1:-1:-1;;;;9313:400:1:o;9913:437::-;;10004:5;9998:12;10031:6;10026:3;10019:19;10057:4;10086:2;10081:3;10077:12;10070:19;;10123:2;10116:5;10112:14;10144:3;10156:169;10170:6;10167:1;10164:13;10156:169;;;10231:13;;10219:26;;10265:12;;;;10300:15;;;;10192:1;10185:9;10156:169;;;-1:-1:-1;10341:3:1;;9974:376;-1:-1:-1;;;;;9974:376:1:o;10355:475::-;;10434:5;10428:12;10461:6;10456:3;10449:19;10486:3;10498:162;10512:6;10509:1;10506:13;10498:162;;;10574:4;10630:13;;;10626:22;;10620:29;10602:11;;;10598:20;;10591:59;10527:12;10498:162;;;10678:6;10675:1;10672:13;10669:2;;;10744:3;10737:4;10728:6;10723:3;10719:16;10715:27;10708:40;10669:2;-1:-1:-1;10812:2:1;10791:15;-1:-1:-1;;10787:29:1;10778:39;;;;10819:4;10774:50;;10404:426;-1:-1:-1;;10404:426:1:o;11043:826::-;-1:-1:-1;;;;;11440:15:1;;;11422:34;;11492:15;;11487:2;11472:18;;11465:43;11402:3;11539:2;11524:18;;11517:31;;;11043:826;;11571:57;;11608:19;;11600:6;11571:57;:::i;:::-;11676:9;11668:6;11664:22;11659:2;11648:9;11644:18;11637:50;11710:44;11747:6;11739;11710:44;:::i;:::-;11696:58;;11803:9;11795:6;11791:22;11785:3;11774:9;11770:19;11763:51;11831:32;11856:6;11848;11831:32;:::i;:::-;11823:40;11374:495;-1:-1:-1;;;;;;;;11374:495:1:o;11874:560::-;-1:-1:-1;;;;;12171:15:1;;;12153:34;;12223:15;;12218:2;12203:18;;12196:43;12270:2;12255:18;;12248:34;;;12313:2;12298:18;;12291:34;;;12133:3;12356;12341:19;;12334:32;;;11874:560;;12383:45;;12408:19;;12400:6;12383:45;:::i;:::-;12375:53;12105:329;-1:-1:-1;;;;;;;12105:329:1:o;12439:261::-;;12618:2;12607:9;12600:21;12638:56;12690:2;12679:9;12675:18;12667:6;12638:56;:::i;12705:465::-;;12962:2;12951:9;12944:21;12988:56;13040:2;13029:9;13025:18;13017:6;12988:56;:::i;:::-;13092:9;13084:6;13080:22;13075:2;13064:9;13060:18;13053:50;13120:44;13157:6;13149;13120:44;:::i;:::-;13112:52;12934:236;-1:-1:-1;;;;;12934:236:1:o;13549:219::-;;13698:2;13687:9;13680:21;13718:44;13758:2;13747:9;13743:18;13735:6;13718:44;:::i;14597:404::-;14799:2;14781:21;;;14838:2;14818:18;;;14811:30;14877:34;14872:2;14857:18;;14850:62;-1:-1:-1;;;14943:2:1;14928:18;;14921:38;14991:3;14976:19;;14771:230::o;16601:400::-;16803:2;16785:21;;;16842:2;16822:18;;;16815:30;16881:34;16876:2;16861:18;;16854:62;-1:-1:-1;;;16947:2:1;16932:18;;16925:34;16991:3;16976:19;;16775:226::o;17419:405::-;17621:2;17603:21;;;17660:2;17640:18;;;17633:30;17699:34;17694:2;17679:18;;17672:62;-1:-1:-1;;;17765:2:1;17750:18;;17743:39;17814:3;17799:19;;17593:231::o;18591:401::-;18793:2;18775:21;;;18832:2;18812:18;;;18805:30;18871:34;18866:2;18851:18;;18844:62;-1:-1:-1;;;18937:2:1;18922:18;;18915:35;18982:3;18967:19;;18765:227::o;19416:399::-;19618:2;19600:21;;;19657:2;19637:18;;;19630:30;19696:34;19691:2;19676:18;;19669:62;-1:-1:-1;;;19762:2:1;19747:18;;19740:33;19805:3;19790:19;;19590:225::o;19820:406::-;20022:2;20004:21;;;20061:2;20041:18;;;20034:30;20100:34;20095:2;20080:18;;20073:62;-1:-1:-1;;;20166:2:1;20151:18;;20144:40;20216:3;20201:19;;19994:232::o;20647:410::-;20849:2;20831:21;;;20888:2;20868:18;;;20861:30;20927:34;20922:2;20907:18;;20900:62;-1:-1:-1;;;20993:2:1;20978:18;;20971:44;21047:3;21032:19;;20821:236::o;21882:404::-;22084:2;22066:21;;;22123:2;22103:18;;;22096:30;22162:34;22157:2;22142:18;;22135:62;-1:-1:-1;;;22228:2:1;22213:18;;22206:38;22276:3;22261:19;;22056:230::o;22707:397::-;22909:2;22891:21;;;22948:2;22928:18;;;22921:30;22987:34;22982:2;22967:18;;22960:62;-1:-1:-1;;;23053:2:1;23038:18;;23031:31;23094:3;23079:19;;22881:223::o;23960:183::-;;24053:18;24045:6;24042:30;24039:2;;;24075:18;;:::i;:::-;-1:-1:-1;24120:1:1;24116:14;24132:4;24112:25;;24029:114::o;24148:128::-;;24219:1;24215:6;24212:1;24209:13;24206:2;;;24225:18;;:::i;:::-;-1:-1:-1;24261:9:1;;24196:80::o;24281:125::-;;24349:1;24346;24343:8;24340:2;;;24354:18;;:::i;:::-;-1:-1:-1;24391:9:1;;24330:76::o;24411:380::-;24490:1;24486:12;;;;24533;;;24554:2;;24608:4;24600:6;24596:17;24586:27;;24554:2;24661;24653:6;24650:14;24630:18;24627:38;24624:2;;;24707:10;24702:3;24698:20;24695:1;24688:31;24742:4;24739:1;24732:15;24770:4;24767:1;24760:15;24624:2;;24466:325;;;:::o;24796:249::-;24906:2;24887:13;;-1:-1:-1;;24883:27:1;24871:40;;24941:18;24926:34;;24962:22;;;24923:62;24920:2;;;24988:18;;:::i;:::-;25024:2;25017:22;-1:-1:-1;;24843:202:1:o;25050:135::-;;-1:-1:-1;;25110:17:1;;25107:2;;;25130:18;;:::i;:::-;-1:-1:-1;25177:1:1;25166:13;;25097:88::o;25190:127::-;25251:10;25246:3;25242:20;25239:1;25232:31;25282:4;25279:1;25272:15;25306:4;25303:1;25296:15;25322:127;25383:10;25378:3;25374:20;25371:1;25364:31;25414:4;25411:1;25404:15;25438:4;25435:1;25428:15;25454:185;;25531:1;25513:16;25510:23;25507:2;;;25581:1;25576:3;25571;25556:27;25612:10;25607:3;25603:20;25497:142;:::o;25644:671::-;;25725:4;25707:16;25704:26;25701:2;;;25733:5;;25701:2;25767;25761:9;-1:-1:-1;;25832:16:1;25828:25;;25825:1;25761:9;25804:50;25883:4;25877:11;25907:16;25942:18;26013:2;26006:4;25998:6;25994:17;25991:25;25986:2;25978:6;25975:14;25972:45;25969:2;;;26020:5;;;;;;;25969:2;26057:6;26051:4;26047:17;26036:28;;26093:3;26087:10;26120:2;26112:6;26109:14;26106:2;;;26126:5;;;;;;;;26106:2;26210;26191:16;26185:4;26181:27;26177:36;26170:4;26161:6;26156:3;26152:16;26148:27;26145:69;26142:2;;;26217:5;;;;;;;;26142:2;26233:57;26284:4;26275:6;26267;26263:19;26259:30;26253:4;26233:57;:::i;:::-;-1:-1:-1;26306:3:1;;-1:-1:-1;;;;;25691:624:1;:::o;26320:131::-;-1:-1:-1;;;;;;26394:32:1;;26384:43;;26374:2;;26441:1;26438;26431:12

Swarm Source

ipfs://c83a48e65425db4118ea76687fc4c2b91e2b58050a72217914533b9f018ab2bf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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