ETH Price: $3,298.55 (-0.95%)

Token

Onitama Summon (ONIS)
 

Overview

Max Total Supply

3,333 ONIS

Holders

1,740

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x16c14b8ff909a891aec6c3af4453e0e7314cbb43
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:
OnitamaSummon

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : OnitamaSummon.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

import "openzeppelin-contracts/contracts/utils/Strings.sol";
import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import "./AbstractERC1155Factory.sol";

/*
 * @title ERC1155 token for OnitamaSummon
 * @author WayneHong @ Norika
 */

abstract contract OnitamaNFT is IERC721 {

}

contract OnitamaSummon is AbstractERC1155Factory {
    using Strings for uint256;

    uint256 public COMBINE_TOKEN_0_REQUIRED = 10;
    mapping(uint256 => bool) isNFTCombined;
    OnitamaNFT nft;

    event UpgradeOnitama(uint256 tokenId, uint256 id);

    constructor(address onitamaAddr)
        ERC1155Oni("ipfs://QmUSUcPuK5HCydyKt3gbE3ceqkHz1SwFrJNAgw5eWkFhoW/")
    {
        name_ = "Onitama Summon";
        symbol_ = "ONIS";
        nft = OnitamaNFT(onitamaAddr);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function uri(uint256 id) public view override returns (string memory) {
        require(exists(id), "URI: nonexistent token");
        return string(abi.encodePacked(super.uri(id), id.toString()));
    }

    function mintForAirdrop(
        address[] memory addresses,
        uint256 id,
        uint256[] memory amounts
    ) external onlyOwner {
        _airdrop(addresses, id, amounts);
    }

    function isAbleToCombineTokens(address addr, uint256 generateAmount)
        public
        view
        returns (bool)
    {
        uint256 tokenBalance = balanceOf(addr, 0);
        return
            generateAmount > 0 &&
            tokenBalance >= (COMBINE_TOKEN_0_REQUIRED * generateAmount);
    }

    function combineTokens(uint256 generateAmount) external callerIsUser {
        require(generateAmount > 0, "Require at least 1");
        require(
            isAbleToCombineTokens(msg.sender, generateAmount),
            "Cannot combine tokens"
        );

        _burn(msg.sender, 0, generateAmount * COMBINE_TOKEN_0_REQUIRED);
        _mint(msg.sender, 1, generateAmount, "");
    }

    function burnForCombineNFT(uint256 id, uint256 tokenId)
        external
        callerIsUser
    {
        require(balanceOf(msg.sender, id) > 0, "Require at least 1");
        require(nft.ownerOf(tokenId) == msg.sender, "Not the Onitama owner");
        require(isNFTCombined[tokenId] == false, "This Onitama is upgraded");

        _burn(msg.sender, id, 1);
        isNFTCombined[tokenId] = true;
        emit UpgradeOnitama(tokenId, id);
    }
}

File 2 of 14 : AbstractERC1155Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

import "openzeppelin-contracts/contracts/access/Ownable.sol";
import "openzeppelin-contracts/contracts/security/Pausable.sol";
import "./ERC1155Oni.sol";

abstract contract AbstractERC1155Factory is Pausable, ERC1155Oni, Ownable {
    string public name_;
    string public symbol_;

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

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

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

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

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

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

File 3 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 5 of 14 : ERC1155Oni.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol";
import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol";
import "openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
import "openzeppelin-contracts/contracts/utils/Address.sol";
import "openzeppelin-contracts/contracts/utils/Context.sol";
import "openzeppelin-contracts/contracts/utils/introspection/ERC165.sol";

abstract contract ERC1155Oni 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;

    mapping(uint256 => uint256) private _totalSupply;

    // 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 Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

    function _airdrop(
        address[] memory toAddresses,
        uint256 id,
        uint256[] memory amounts
    ) internal virtual {
        address operator = _msgSender();

        for (uint256 i = 0; i < toAddresses.length; i++) {
            address to = toAddresses[i];
            uint256 amount = amounts[i];
            if (to == address(0)) revert("ERC1155: mint to the zero address");

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

File 6 of 14 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

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

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

File 7 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 8 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 10 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 11 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 12 of 14 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @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 13 of 14 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

File 14 of 14 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "ERC721A/=lib/ERC721A/contracts/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ]
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"onitamaAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UpgradeOnitama","type":"event"},{"inputs":[],"name":"COMBINE_TOKEN_0_REQUIRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnForCombineNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"generateAmount","type":"uint256"}],"name":"combineTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"generateAmount","type":"uint256"}],"name":"isAbleToCombineTokens","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":"addresses","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintForAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6080604052600a6008553480156200001657600080fd5b5060405162002a1e38038062002a1e83398101604081905262000039916200015e565b604051806060016040528060368152602001620029e8603691396000805460ff191690556200006881620000fa565b5062000074336200010c565b60408051808201909152600e81526d27b734ba30b6b09029bab6b6b7b760911b6020820152600690620000a8908262000235565b506040805180820190915260048152634f4e495360e01b6020820152600790620000d3908262000235565b50600a80546001600160a01b0319166001600160a01b039290921691909117905562000301565b600462000108828262000235565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200017157600080fd5b81516001600160a01b03811681146200018957600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001bb57607f821691505b602082108103620001dc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023057600081815260208120601f850160051c810160208610156200020b5750805b601f850160051c820191505b818110156200022c5782815560010162000217565b5050505b505050565b81516001600160401b0381111562000251576200025162000190565b6200026981620002628454620001a6565b84620001e2565b602080601f831160018114620002a15760008415620002885750858301515b600019600386901b1c1916600185901b1785556200022c565b600085815260208120601f198616915b82811015620002d257888601518255948401946001909101908401620002b1565b5085821015620002f15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126d780620003116000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638456cb59116100de578063c1c105dd11610097578063e2b9e18611610071578063e2b9e18614610343578063e985e9c51461034b578063f242432a14610387578063f2fde38b1461039a57600080fd5b8063c1c105dd14610314578063d118c96a14610327578063d9455fe51461033057600080fd5b80638456cb59146102ae5780638da5cb5b146102b657806395d89b41146102d1578063a22cb465146102d9578063af17dea6146102ec578063bd85b039146102f457600080fd5b80632eb2c2d61161014b5780634e1273f4116101255780634e1273f4146102595780634f558e79146102795780635c975abb1461029b578063715018a6146102a657600080fd5b80632eb2c2d61461022b5780633f4ba83a1461023e5780634035d6911461024657600080fd5b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db57806306fdde03146101f05780630d6b5b38146102055780630e89341c14610218575b600080fd5b6101a56101a0366004611b4d565b6103ad565b6040519081526020015b60405180910390f35b6101cb6101c6366004611b8f565b610445565b60405190151581526020016101af565b6101ee6101e9366004611c54565b610497565b005b6101f86104ab565b6040516101af9190611cf9565b6101ee610213366004611e10565b61053d565b6101f8610226366004611e7d565b610555565b6101ee610239366004611eb6565b6105e5565b6101ee610631565b6101ee610254366004611e7d565b610643565b61026c610267366004611f64565b61075a565b6040516101af9190612003565b6101cb610287366004611e7d565b600090815260036020526040902054151590565b60005460ff166101cb565b6101ee610884565b6101ee610896565b6005546040516001600160a01b0390911681526020016101af565b6101f86108a6565b6101ee6102e7366004612016565b6108b5565b6101f86108c4565b6101a5610302366004611e7d565b60009081526003602052604090205490565b6101cb610322366004611b4d565b610952565b6101a560085481565b6101ee61033e366004612054565b610987565b6101f8610baa565b6101cb610359366004612076565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6101ee6103953660046120a4565b610bb7565b6101ee6103a836600461210d565b610bfc565b60006001600160a01b03831661041d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061047657506001600160e01b031982166303a24d0760e21b145b8061049157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61049f610c72565b6104a881610ccc565b50565b6060600680546104ba9061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546104e69061212a565b80156105335780601f1061050857610100808354040283529160200191610533565b820191906000526020600020905b81548152906001019060200180831161051657829003601f168201915b5050505050905090565b610545610c72565b610550838383610cd8565b505050565b6000818152600360205260409020546060906105ac5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610414565b6105b582610dfc565b6105be83610e90565b6040516020016105cf929190612164565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061060157506106018533610359565b61061d5760405162461bcd60e51b815260040161041490612193565b61062a8585858585610f91565b5050505050565b610639610c72565b61064161117f565b565b3233146106925760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610414565b600081116106d75760405162461bcd60e51b815260206004820152601260248201527152657175697265206174206c65617374203160701b6044820152606401610414565b6106e13382610952565b6107255760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420636f6d62696e6520746f6b656e7360581b6044820152606401610414565b61073e3360006008548461073991906121f7565b6111d1565b6104a83360018360405180602001604052806000815250611358565b606081518351146107bf5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610414565b6000835167ffffffffffffffff8111156107db576107db611bb3565b604051908082528060200260200182016040528015610804578160200160208202803683370190505b50905060005b845181101561087c5761084f85828151811061082857610828612216565b602002602001015185838151811061084257610842612216565b60200260200101516103ad565b82828151811061086157610861612216565b60209081029190910101526108758161222c565b905061080a565b509392505050565b61088c610c72565b6106416000611428565b61089e610c72565b61064161147a565b6060600780546104ba9061212a565b6108c03383836114b7565b5050565b600780546108d19061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546108fd9061212a565b801561094a5780601f1061091f5761010080835404028352916020019161094a565b820191906000526020600020905b81548152906001019060200180831161092d57829003601f168201915b505050505081565b6000806109608460006103ad565b905060008311801561097f57508260085461097b91906121f7565b8110155b949350505050565b3233146109d65760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610414565b60006109e233846103ad565b11610a245760405162461bcd60e51b815260206004820152601260248201527152657175697265206174206c65617374203160701b6044820152606401610414565b600a546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190612245565b6001600160a01b031614610adf5760405162461bcd60e51b81526020600482015260156024820152742737ba103a34329027b734ba30b6b09037bbb732b960591b6044820152606401610414565b60008181526009602052604090205460ff1615610b3e5760405162461bcd60e51b815260206004820152601860248201527f54686973204f6e6974616d6120697320757067726164656400000000000000006044820152606401610414565b610b4a338360016111d1565b60008181526009602052604090819020805460ff19166001179055517f314290683d4a782e8925922149e3c5ac05ebe8812d4a6f10ea286b77b889b74490610b9e9083908590918252602082015260400190565b60405180910390a15050565b600680546108d19061212a565b6001600160a01b038516331480610bd35750610bd38533610359565b610bef5760405162461bcd60e51b815260040161041490612193565b61062a8585858585611597565b610c04610c72565b6001600160a01b038116610c695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610414565b6104a881611428565b6005546001600160a01b031633146106415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610414565b60046108c082826122a8565b3360005b845181101561062a576000858281518110610cf957610cf9612216565b602002602001015190506000848381518110610d1757610d17612216565b6020026020010151905060006001600160a01b0316826001600160a01b031603610d535760405162461bcd60e51b815260040161041490612368565b60008681526001602090815260408083206001600160a01b038616845290915281208054839290610d859084906123a9565b909155505060008681526003602052604081208054839290610da89084906123a9565b909155505060408051878152602081018390526001600160a01b038085169260009291881691600080516020612682833981519152910160405180910390a450508080610df49061222c565b915050610cdc565b606060048054610e0b9061212a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e379061212a565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b50505050509050919050565b606081600003610eb75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610ee15780610ecb8161222c565b9150610eda9050600a836123d7565b9150610ebb565b60008167ffffffffffffffff811115610efc57610efc611bb3565b6040519080825280601f01601f191660200182016040528015610f26576020820181803683370190505b5090505b841561097f57610f3b6001836123eb565b9150610f48600a86612402565b610f539060306123a9565b60f81b818381518110610f6857610f68612216565b60200101906001600160f81b031916908160001a905350610f8a600a866123d7565b9450610f2a565b8151835114610ff35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610414565b6001600160a01b0384166110195760405162461bcd60e51b815260040161041490612416565b336110288187878787876116c1565b60005b845181101561111157600085828151811061104857611048612216565b60200260200101519050600085838151811061106657611066612216565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156110b75760405162461bcd60e51b81526004016104149061245b565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110f69084906123a9565b925050819055505050508061110a9061222c565b905061102b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516111619291906124a5565b60405180910390a46111778187878787876116cf565b505050505050565b61118761182a565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166112335760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610414565b33600061123f84611873565b9050600061124c84611873565b905061126c838760008585604051806020016040528060008152506116c1565b60008581526001602090815260408083206001600160a01b038a168452909152902054848110156112eb5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610414565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612682833981519152910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b03841661137e5760405162461bcd60e51b815260040161041490612368565b33600061138a85611873565b9050600061139785611873565b90506113a8836000898585896116c1565b60008681526001602090815260408083206001600160a01b038b168452909152812080548792906113da9084906123a9565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612682833981519152910160405180910390a461134f836000898989896118be565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611482611979565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111b43390565b816001600160a01b0316836001600160a01b03160361152a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610414565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166115bd5760405162461bcd60e51b815260040161041490612416565b3360006115c985611873565b905060006115d685611873565b90506115e68389898585896116c1565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156116295760405162461bcd60e51b81526004016104149061245b565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116689084906123a9565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612682833981519152910160405180910390a46116b6848a8a8a8a8a6118be565b505050505050505050565b6111778686868686866119bf565b6001600160a01b0384163b156111775760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061171390899089908890889088906004016124d3565b6020604051808303816000875af192505050801561174e575060408051601f3d908101601f1916820190925261174b91810190612531565b60015b6117fa5761175a61254e565b806308c379a003611793575061176e61256a565b806117795750611795565b8060405162461bcd60e51b81526004016104149190611cf9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610414565b6001600160e01b0319811663bc197c8160e01b1461134f5760405162461bcd60e51b8152600401610414906125f4565b60005460ff166106415760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610414565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118ad576118ad612216565b602090810291909101015292915050565b6001600160a01b0384163b156111775760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611902908990899088908890889060040161263c565b6020604051808303816000875af192505050801561193d575060408051601f3d908101601f1916820190925261193a91810190612531565b60015b6119495761175a61254e565b6001600160e01b0319811663f23a6e6160e01b1461134f5760405162461bcd60e51b8152600401610414906125f4565b60005460ff16156106415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610414565b6001600160a01b038516611a465760005b8351811015611a44578281815181106119eb576119eb612216565b602002602001015160036000868481518110611a0957611a09612216565b602002602001015181526020019081526020016000206000828254611a2e91906123a9565b90915550611a3d90508161222c565b90506119d0565b505b6001600160a01b0384166111775760005b835181101561134f576000848281518110611a7457611a74612216565b602002602001015190506000848381518110611a9257611a92612216565b6020026020010151905060006003600084815260200190815260200160002054905081811015611b155760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610414565b60009283526003602052604090922091039055611b318161222c565b9050611a57565b6001600160a01b03811681146104a857600080fd5b60008060408385031215611b6057600080fd5b8235611b6b81611b38565b946020939093013593505050565b6001600160e01b0319811681146104a857600080fd5b600060208284031215611ba157600080fd5b8135611bac81611b79565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611bef57611bef611bb3565b6040525050565b600067ffffffffffffffff831115611c1057611c10611bb3565b604051611c27601f8501601f191660200182611bc9565b809150838152848484011115611c3c57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611c6657600080fd5b813567ffffffffffffffff811115611c7d57600080fd5b8201601f81018413611c8e57600080fd5b61097f84823560208401611bf6565b60005b83811015611cb8578181015183820152602001611ca0565b83811115611cc7576000848401525b50505050565b60008151808452611ce5816020860160208601611c9d565b601f01601f19169290920160200192915050565b602081526000611bac6020830184611ccd565b600067ffffffffffffffff821115611d2657611d26611bb3565b5060051b60200190565b600082601f830112611d4157600080fd5b81356020611d4e82611d0c565b604051611d5b8282611bc9565b83815260059390931b8501820192828101915086841115611d7b57600080fd5b8286015b84811015611d9f578035611d9281611b38565b8352918301918301611d7f565b509695505050505050565b600082601f830112611dbb57600080fd5b81356020611dc882611d0c565b604051611dd58282611bc9565b83815260059390931b8501820192828101915086841115611df557600080fd5b8286015b84811015611d9f5780358352918301918301611df9565b600080600060608486031215611e2557600080fd5b833567ffffffffffffffff80821115611e3d57600080fd5b611e4987838801611d30565b9450602086013593506040860135915080821115611e6657600080fd5b50611e7386828701611daa565b9150509250925092565b600060208284031215611e8f57600080fd5b5035919050565b600082601f830112611ea757600080fd5b611bac83833560208501611bf6565b600080600080600060a08688031215611ece57600080fd5b8535611ed981611b38565b94506020860135611ee981611b38565b9350604086013567ffffffffffffffff80821115611f0657600080fd5b611f1289838a01611daa565b94506060880135915080821115611f2857600080fd5b611f3489838a01611daa565b93506080880135915080821115611f4a57600080fd5b50611f5788828901611e96565b9150509295509295909350565b60008060408385031215611f7757600080fd5b823567ffffffffffffffff80821115611f8f57600080fd5b611f9b86838701611d30565b93506020850135915080821115611fb157600080fd5b50611fbe85828601611daa565b9150509250929050565b600081518084526020808501945080840160005b83811015611ff857815187529582019590820190600101611fdc565b509495945050505050565b602081526000611bac6020830184611fc8565b6000806040838503121561202957600080fd5b823561203481611b38565b91506020830135801515811461204957600080fd5b809150509250929050565b6000806040838503121561206757600080fd5b50508035926020909101359150565b6000806040838503121561208957600080fd5b823561209481611b38565b9150602083013561204981611b38565b600080600080600060a086880312156120bc57600080fd5b85356120c781611b38565b945060208601356120d781611b38565b93506040860135925060608601359150608086013567ffffffffffffffff81111561210157600080fd5b611f5788828901611e96565b60006020828403121561211f57600080fd5b8135611bac81611b38565b600181811c9082168061213e57607f821691505b60208210810361215e57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351612176818460208801611c9d565b83519083019061218a818360208801611c9d565b01949350505050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612211576122116121e1565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161223e5761223e6121e1565b5060010190565b60006020828403121561225757600080fd5b8151611bac81611b38565b601f82111561055057600081815260208120601f850160051c810160208610156122895750805b601f850160051c820191505b8181101561117757828155600101612295565b815167ffffffffffffffff8111156122c2576122c2611bb3565b6122d6816122d0845461212a565b84612262565b602080601f83116001811461230b57600084156122f35750858301515b600019600386901b1c1916600185901b178555611177565b600085815260208120601f198616915b8281101561233a5788860151825594840194600190910190840161231b565b50858210156123585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600082198211156123bc576123bc6121e1565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826123e6576123e66123c1565b500490565b6000828210156123fd576123fd6121e1565b500390565b600082612411576124116123c1565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006124b86040830185611fc8565b82810360208401526124ca8185611fc8565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906124ff90830186611fc8565b82810360608401526125118186611fc8565b905082810360808401526125258185611ccd565b98975050505050505050565b60006020828403121561254357600080fd5b8151611bac81611b79565b600060033d11156125675760046000803e5060005160e01c5b90565b600060443d10156125785790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156125a857505050505090565b82850191508151818111156125c05750505050505090565b843d87010160208285010111156125da5750505050505090565b6125e960208286010187611bc9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061267690830184611ccd565b97965050505050505056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a2646970667358221220181a3fb60761374a9cf639fca5f806e517e5f1378003647cd7ff4b9dd3b60c4d64736f6c634300080f0033697066733a2f2f516d5553556350754b3548437964794b7433676245336365716b487a31537746724a4e4167773565576b46686f572f000000000000000000000000436cc556d9a9517d0808ace3ba1f52fe7a15d831

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638456cb59116100de578063c1c105dd11610097578063e2b9e18611610071578063e2b9e18614610343578063e985e9c51461034b578063f242432a14610387578063f2fde38b1461039a57600080fd5b8063c1c105dd14610314578063d118c96a14610327578063d9455fe51461033057600080fd5b80638456cb59146102ae5780638da5cb5b146102b657806395d89b41146102d1578063a22cb465146102d9578063af17dea6146102ec578063bd85b039146102f457600080fd5b80632eb2c2d61161014b5780634e1273f4116101255780634e1273f4146102595780634f558e79146102795780635c975abb1461029b578063715018a6146102a657600080fd5b80632eb2c2d61461022b5780633f4ba83a1461023e5780634035d6911461024657600080fd5b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db57806306fdde03146101f05780630d6b5b38146102055780630e89341c14610218575b600080fd5b6101a56101a0366004611b4d565b6103ad565b6040519081526020015b60405180910390f35b6101cb6101c6366004611b8f565b610445565b60405190151581526020016101af565b6101ee6101e9366004611c54565b610497565b005b6101f86104ab565b6040516101af9190611cf9565b6101ee610213366004611e10565b61053d565b6101f8610226366004611e7d565b610555565b6101ee610239366004611eb6565b6105e5565b6101ee610631565b6101ee610254366004611e7d565b610643565b61026c610267366004611f64565b61075a565b6040516101af9190612003565b6101cb610287366004611e7d565b600090815260036020526040902054151590565b60005460ff166101cb565b6101ee610884565b6101ee610896565b6005546040516001600160a01b0390911681526020016101af565b6101f86108a6565b6101ee6102e7366004612016565b6108b5565b6101f86108c4565b6101a5610302366004611e7d565b60009081526003602052604090205490565b6101cb610322366004611b4d565b610952565b6101a560085481565b6101ee61033e366004612054565b610987565b6101f8610baa565b6101cb610359366004612076565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6101ee6103953660046120a4565b610bb7565b6101ee6103a836600461210d565b610bfc565b60006001600160a01b03831661041d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061047657506001600160e01b031982166303a24d0760e21b145b8061049157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61049f610c72565b6104a881610ccc565b50565b6060600680546104ba9061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546104e69061212a565b80156105335780601f1061050857610100808354040283529160200191610533565b820191906000526020600020905b81548152906001019060200180831161051657829003601f168201915b5050505050905090565b610545610c72565b610550838383610cd8565b505050565b6000818152600360205260409020546060906105ac5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610414565b6105b582610dfc565b6105be83610e90565b6040516020016105cf929190612164565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061060157506106018533610359565b61061d5760405162461bcd60e51b815260040161041490612193565b61062a8585858585610f91565b5050505050565b610639610c72565b61064161117f565b565b3233146106925760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610414565b600081116106d75760405162461bcd60e51b815260206004820152601260248201527152657175697265206174206c65617374203160701b6044820152606401610414565b6106e13382610952565b6107255760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420636f6d62696e6520746f6b656e7360581b6044820152606401610414565b61073e3360006008548461073991906121f7565b6111d1565b6104a83360018360405180602001604052806000815250611358565b606081518351146107bf5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610414565b6000835167ffffffffffffffff8111156107db576107db611bb3565b604051908082528060200260200182016040528015610804578160200160208202803683370190505b50905060005b845181101561087c5761084f85828151811061082857610828612216565b602002602001015185838151811061084257610842612216565b60200260200101516103ad565b82828151811061086157610861612216565b60209081029190910101526108758161222c565b905061080a565b509392505050565b61088c610c72565b6106416000611428565b61089e610c72565b61064161147a565b6060600780546104ba9061212a565b6108c03383836114b7565b5050565b600780546108d19061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546108fd9061212a565b801561094a5780601f1061091f5761010080835404028352916020019161094a565b820191906000526020600020905b81548152906001019060200180831161092d57829003601f168201915b505050505081565b6000806109608460006103ad565b905060008311801561097f57508260085461097b91906121f7565b8110155b949350505050565b3233146109d65760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610414565b60006109e233846103ad565b11610a245760405162461bcd60e51b815260206004820152601260248201527152657175697265206174206c65617374203160701b6044820152606401610414565b600a546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190612245565b6001600160a01b031614610adf5760405162461bcd60e51b81526020600482015260156024820152742737ba103a34329027b734ba30b6b09037bbb732b960591b6044820152606401610414565b60008181526009602052604090205460ff1615610b3e5760405162461bcd60e51b815260206004820152601860248201527f54686973204f6e6974616d6120697320757067726164656400000000000000006044820152606401610414565b610b4a338360016111d1565b60008181526009602052604090819020805460ff19166001179055517f314290683d4a782e8925922149e3c5ac05ebe8812d4a6f10ea286b77b889b74490610b9e9083908590918252602082015260400190565b60405180910390a15050565b600680546108d19061212a565b6001600160a01b038516331480610bd35750610bd38533610359565b610bef5760405162461bcd60e51b815260040161041490612193565b61062a8585858585611597565b610c04610c72565b6001600160a01b038116610c695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610414565b6104a881611428565b6005546001600160a01b031633146106415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610414565b60046108c082826122a8565b3360005b845181101561062a576000858281518110610cf957610cf9612216565b602002602001015190506000848381518110610d1757610d17612216565b6020026020010151905060006001600160a01b0316826001600160a01b031603610d535760405162461bcd60e51b815260040161041490612368565b60008681526001602090815260408083206001600160a01b038616845290915281208054839290610d859084906123a9565b909155505060008681526003602052604081208054839290610da89084906123a9565b909155505060408051878152602081018390526001600160a01b038085169260009291881691600080516020612682833981519152910160405180910390a450508080610df49061222c565b915050610cdc565b606060048054610e0b9061212a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e379061212a565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b50505050509050919050565b606081600003610eb75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610ee15780610ecb8161222c565b9150610eda9050600a836123d7565b9150610ebb565b60008167ffffffffffffffff811115610efc57610efc611bb3565b6040519080825280601f01601f191660200182016040528015610f26576020820181803683370190505b5090505b841561097f57610f3b6001836123eb565b9150610f48600a86612402565b610f539060306123a9565b60f81b818381518110610f6857610f68612216565b60200101906001600160f81b031916908160001a905350610f8a600a866123d7565b9450610f2a565b8151835114610ff35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610414565b6001600160a01b0384166110195760405162461bcd60e51b815260040161041490612416565b336110288187878787876116c1565b60005b845181101561111157600085828151811061104857611048612216565b60200260200101519050600085838151811061106657611066612216565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156110b75760405162461bcd60e51b81526004016104149061245b565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110f69084906123a9565b925050819055505050508061110a9061222c565b905061102b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516111619291906124a5565b60405180910390a46111778187878787876116cf565b505050505050565b61118761182a565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166112335760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610414565b33600061123f84611873565b9050600061124c84611873565b905061126c838760008585604051806020016040528060008152506116c1565b60008581526001602090815260408083206001600160a01b038a168452909152902054848110156112eb5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610414565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612682833981519152910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b03841661137e5760405162461bcd60e51b815260040161041490612368565b33600061138a85611873565b9050600061139785611873565b90506113a8836000898585896116c1565b60008681526001602090815260408083206001600160a01b038b168452909152812080548792906113da9084906123a9565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612682833981519152910160405180910390a461134f836000898989896118be565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611482611979565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111b43390565b816001600160a01b0316836001600160a01b03160361152a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610414565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166115bd5760405162461bcd60e51b815260040161041490612416565b3360006115c985611873565b905060006115d685611873565b90506115e68389898585896116c1565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156116295760405162461bcd60e51b81526004016104149061245b565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116689084906123a9565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612682833981519152910160405180910390a46116b6848a8a8a8a8a6118be565b505050505050505050565b6111778686868686866119bf565b6001600160a01b0384163b156111775760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061171390899089908890889088906004016124d3565b6020604051808303816000875af192505050801561174e575060408051601f3d908101601f1916820190925261174b91810190612531565b60015b6117fa5761175a61254e565b806308c379a003611793575061176e61256a565b806117795750611795565b8060405162461bcd60e51b81526004016104149190611cf9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610414565b6001600160e01b0319811663bc197c8160e01b1461134f5760405162461bcd60e51b8152600401610414906125f4565b60005460ff166106415760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610414565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118ad576118ad612216565b602090810291909101015292915050565b6001600160a01b0384163b156111775760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611902908990899088908890889060040161263c565b6020604051808303816000875af192505050801561193d575060408051601f3d908101601f1916820190925261193a91810190612531565b60015b6119495761175a61254e565b6001600160e01b0319811663f23a6e6160e01b1461134f5760405162461bcd60e51b8152600401610414906125f4565b60005460ff16156106415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610414565b6001600160a01b038516611a465760005b8351811015611a44578281815181106119eb576119eb612216565b602002602001015160036000868481518110611a0957611a09612216565b602002602001015181526020019081526020016000206000828254611a2e91906123a9565b90915550611a3d90508161222c565b90506119d0565b505b6001600160a01b0384166111775760005b835181101561134f576000848281518110611a7457611a74612216565b602002602001015190506000848381518110611a9257611a92612216565b6020026020010151905060006003600084815260200190815260200160002054905081811015611b155760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610414565b60009283526003602052604090922091039055611b318161222c565b9050611a57565b6001600160a01b03811681146104a857600080fd5b60008060408385031215611b6057600080fd5b8235611b6b81611b38565b946020939093013593505050565b6001600160e01b0319811681146104a857600080fd5b600060208284031215611ba157600080fd5b8135611bac81611b79565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611bef57611bef611bb3565b6040525050565b600067ffffffffffffffff831115611c1057611c10611bb3565b604051611c27601f8501601f191660200182611bc9565b809150838152848484011115611c3c57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611c6657600080fd5b813567ffffffffffffffff811115611c7d57600080fd5b8201601f81018413611c8e57600080fd5b61097f84823560208401611bf6565b60005b83811015611cb8578181015183820152602001611ca0565b83811115611cc7576000848401525b50505050565b60008151808452611ce5816020860160208601611c9d565b601f01601f19169290920160200192915050565b602081526000611bac6020830184611ccd565b600067ffffffffffffffff821115611d2657611d26611bb3565b5060051b60200190565b600082601f830112611d4157600080fd5b81356020611d4e82611d0c565b604051611d5b8282611bc9565b83815260059390931b8501820192828101915086841115611d7b57600080fd5b8286015b84811015611d9f578035611d9281611b38565b8352918301918301611d7f565b509695505050505050565b600082601f830112611dbb57600080fd5b81356020611dc882611d0c565b604051611dd58282611bc9565b83815260059390931b8501820192828101915086841115611df557600080fd5b8286015b84811015611d9f5780358352918301918301611df9565b600080600060608486031215611e2557600080fd5b833567ffffffffffffffff80821115611e3d57600080fd5b611e4987838801611d30565b9450602086013593506040860135915080821115611e6657600080fd5b50611e7386828701611daa565b9150509250925092565b600060208284031215611e8f57600080fd5b5035919050565b600082601f830112611ea757600080fd5b611bac83833560208501611bf6565b600080600080600060a08688031215611ece57600080fd5b8535611ed981611b38565b94506020860135611ee981611b38565b9350604086013567ffffffffffffffff80821115611f0657600080fd5b611f1289838a01611daa565b94506060880135915080821115611f2857600080fd5b611f3489838a01611daa565b93506080880135915080821115611f4a57600080fd5b50611f5788828901611e96565b9150509295509295909350565b60008060408385031215611f7757600080fd5b823567ffffffffffffffff80821115611f8f57600080fd5b611f9b86838701611d30565b93506020850135915080821115611fb157600080fd5b50611fbe85828601611daa565b9150509250929050565b600081518084526020808501945080840160005b83811015611ff857815187529582019590820190600101611fdc565b509495945050505050565b602081526000611bac6020830184611fc8565b6000806040838503121561202957600080fd5b823561203481611b38565b91506020830135801515811461204957600080fd5b809150509250929050565b6000806040838503121561206757600080fd5b50508035926020909101359150565b6000806040838503121561208957600080fd5b823561209481611b38565b9150602083013561204981611b38565b600080600080600060a086880312156120bc57600080fd5b85356120c781611b38565b945060208601356120d781611b38565b93506040860135925060608601359150608086013567ffffffffffffffff81111561210157600080fd5b611f5788828901611e96565b60006020828403121561211f57600080fd5b8135611bac81611b38565b600181811c9082168061213e57607f821691505b60208210810361215e57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351612176818460208801611c9d565b83519083019061218a818360208801611c9d565b01949350505050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612211576122116121e1565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161223e5761223e6121e1565b5060010190565b60006020828403121561225757600080fd5b8151611bac81611b38565b601f82111561055057600081815260208120601f850160051c810160208610156122895750805b601f850160051c820191505b8181101561117757828155600101612295565b815167ffffffffffffffff8111156122c2576122c2611bb3565b6122d6816122d0845461212a565b84612262565b602080601f83116001811461230b57600084156122f35750858301515b600019600386901b1c1916600185901b178555611177565b600085815260208120601f198616915b8281101561233a5788860151825594840194600190910190840161231b565b50858210156123585787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600082198211156123bc576123bc6121e1565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826123e6576123e66123c1565b500490565b6000828210156123fd576123fd6121e1565b500390565b600082612411576124116123c1565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006124b86040830185611fc8565b82810360208401526124ca8185611fc8565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906124ff90830186611fc8565b82810360608401526125118186611fc8565b905082810360808401526125258185611ccd565b98975050505050505050565b60006020828403121561254357600080fd5b8151611bac81611b79565b600060033d11156125675760046000803e5060005160e01c5b90565b600060443d10156125785790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156125a857505050505090565b82850191508151818111156125c05750505050505090565b843d87010160208285010111156125da5750505050505090565b6125e960208286010187611bc9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061267690830184611ccd565b97965050505050505056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a2646970667358221220181a3fb60761374a9cf639fca5f806e517e5f1378003647cd7ff4b9dd3b60c4d64736f6c634300080f0033

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

000000000000000000000000436cc556d9a9517d0808ace3ba1f52fe7a15d831

-----Decoded View---------------
Arg [0] : onitamaAddr (address): 0x436cC556d9a9517d0808ACe3ba1F52Fe7A15d831

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000436cc556d9a9517d0808ace3ba1f52fe7a15d831


Deployed Bytecode Sourcemap

352:2162:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2608:305:12;;;;;;:::i;:::-;;:::i;:::-;;;616:25:14;;;604:2;589:18;2608:305:12;;;;;;;;1228:349;;;;;;:::i;:::-;;:::i;:::-;;;1203:14:14;;1196:22;1178:41;;1166:2;1151:18;1228:349:12;1038:187:14;485:91:11;;;;;;:::i;:::-;;:::i;:::-;;582:81;;;:::i;:::-;;;;;;;:::i;1169:188:13:-;;;;;;:::i;:::-;;:::i;960:203::-;;;;;;:::i;:::-;;:::i;4671:426:12:-;;;;;;:::i;:::-;;:::i;414:65:11:-;;;:::i;1673:386:13:-;;;;;;:::i;:::-;;:::i;3070:542:12:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2360:106::-;;;;;;:::i;:::-;2417:4;2244:16;;;:12;:16;;;;;;-1:-1:-1;;;2360:106:12;1615:84:1;1662:4;1685:7;;;1615:84;;1831:101:0;;;:::i;347:61:11:-;;;:::i;1201:85:0:-;1273:6;;1201:85;;-1:-1:-1;;;;;1273:6:0;;;8625:51:14;;8613:2;8598:18;1201:85:0;8479:203:14;669:85:11;;;:::i;3680:181:12:-;;;;;;:::i;:::-;;:::i;319:21:11:-;;;:::i;2156:111:12:-;;;;;;:::i;:::-;2218:7;2244:16;;;:12;:16;;;;;;;2156:111;1363:304:13;;;;;;:::i;:::-;;:::i;439:44::-;;;;;;2065:447;;;;;;:::i;:::-;;:::i;294:19:11:-;;;:::i;3928:210:12:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4094:27:12;;;4067:4;4094:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3928:210;4205:394;;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;:::i;:::-;;:::i;2608:305:12:-;2734:7;-1:-1:-1;;;;;2778:21:12;;2757:110;;;;-1:-1:-1;;;2757:110:12;;10947:2:14;2757:110:12;;;10929:21:14;10986:2;10966:18;;;10959:30;11025:34;11005:18;;;10998:62;-1:-1:-1;;;11076:18:14;;;11069:40;11126:19;;2757:110:12;;;;;;;;;-1:-1:-1;2884:13:12;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2884:22:12;;;;;;;;;;;;2608:305::o;1228:349::-;1370:4;-1:-1:-1;;;;;;1409:41:12;;-1:-1:-1;;;1409:41:12;;:109;;-1:-1:-1;;;;;;;1466:52:12;;-1:-1:-1;;;1466:52:12;1409:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:9;;;1534:36:12;1390:180;1228:349;-1:-1:-1;;1228:349:12:o;485:91:11:-;1094:13:0;:11;:13::i;:::-;553:16:11::1;561:7;553;:16::i;:::-;485:91:::0;:::o;582:81::-;619:13;651:5;644:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;582:81;:::o;1169:188:13:-;1094:13:0;:11;:13::i;:::-;1318:32:13::1;1327:9;1338:2;1342:7;1318:8;:32::i;:::-;1169:188:::0;;;:::o;960:203::-;2417:4:12;2244:16;;;:12;:16;;;;;;1015:13:13;;1040:45;;;;-1:-1:-1;;;1040:45:13;;11743:2:14;1040:45:13;;;11725:21:14;11782:2;11762:18;;;11755:30;-1:-1:-1;;;11801:18:14;;;11794:52;11863:18;;1040:45:13;11541:346:14;1040:45:13;1126:13;1136:2;1126:9;:13::i;:::-;1141;:2;:11;:13::i;:::-;1109:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1095:61;;960:203;;;:::o;4671:426:12:-;-1:-1:-1;;;;;4896:20:12;;719:10:7;4896:20:12;;:60;;-1:-1:-1;4920:36:12;4937:4;719:10:7;3928:210:12;:::i;4920:36::-;4875:153;;;;-1:-1:-1;;;4875:153:12;;;;;;;:::i;:::-;5038:52;5061:4;5067:2;5071:3;5076:7;5085:4;5038:22;:52::i;:::-;4671:426;;;;;:::o;414:65:11:-;1094:13:0;:11;:13::i;:::-;462:10:11::1;:8;:10::i;:::-;414:65::o:0;1673:386:13:-;878:9;891:10;878:23;870:66;;;;-1:-1:-1;;;870:66:13;;12984:2:14;870:66:13;;;12966:21:14;13023:2;13003:18;;;12996:30;13062:32;13042:18;;;13035:60;13112:18;;870:66:13;12782:354:14;870:66:13;1777:1:::1;1760:14;:18;1752:49;;;::::0;-1:-1:-1;;;1752:49:13;;13343:2:14;1752:49:13::1;::::0;::::1;13325:21:14::0;13382:2;13362:18;;;13355:30;-1:-1:-1;;;13401:18:14;;;13394:48;13459:18;;1752:49:13::1;13141:342:14::0;1752:49:13::1;1832;1854:10;1866:14;1832:21;:49::i;:::-;1811:117;;;::::0;-1:-1:-1;;;1811:117:13;;13690:2:14;1811:117:13::1;::::0;::::1;13672:21:14::0;13729:2;13709:18;;;13702:30;-1:-1:-1;;;13748:18:14;;;13741:51;13809:18;;1811:117:13::1;13488:345:14::0;1811:117:13::1;1939:63;1945:10;1957:1;1977:24;;1960:14;:41;;;;:::i;:::-;1939:5;:63::i;:::-;2012:40;2018:10;2030:1;2033:14;2012:40;;;;;;;;;;;::::0;:5:::1;:40::i;3070:542:12:-:0;3221:16;3293:3;:10;3274:8;:15;:29;3253:117;;;;-1:-1:-1;;;3253:117:12;;14345:2:14;3253:117:12;;;14327:21:14;14384:2;14364:18;;;14357:30;14423:34;14403:18;;;14396:62;-1:-1:-1;;;14474:18:14;;;14467:39;14523:19;;3253:117:12;14143:405:14;3253:117:12;3381:30;3428:8;:15;3414:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3414:30:12;;3381:63;;3460:9;3455:120;3479:8;:15;3475:1;:19;3455:120;;;3534:30;3544:8;3553:1;3544:11;;;;;;;;:::i;:::-;;;;;;;3557:3;3561:1;3557:6;;;;;;;;:::i;:::-;;;;;;;3534:9;:30::i;:::-;3515:13;3529:1;3515:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;3496:3;;;:::i;:::-;;;3455:120;;;-1:-1:-1;3592:13:12;3070:542;-1:-1:-1;;;3070:542:12:o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;347:61:11:-:0;1094:13:0;:11;:13::i;:::-;393:8:11::1;:6;:8::i;669:85::-:0;708:13;740:7;733:14;;;;;:::i;3680:181:12:-;3802:52;719:10:7;3835:8:12;3845;3802:18;:52::i;:::-;3680:181;;:::o;319:21:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1363:304:13:-;1477:4;1497:20;1520:18;1530:4;1536:1;1520:9;:18::i;:::-;1497:41;;1584:1;1567:14;:18;:93;;;;;1645:14;1618:24;;:41;;;;:::i;:::-;1601:12;:59;;1567:93;1548:112;1363:304;-1:-1:-1;;;;1363:304:13:o;2065:447::-;878:9;891:10;878:23;870:66;;;;-1:-1:-1;;;870:66:13;;12984:2:14;870:66:13;;;12966:21:14;13023:2;13003:18;;;12996:30;13062:32;13042:18;;;13035:60;13112:18;;870:66:13;12782:354:14;870:66:13;2209:1:::1;2181:25;2191:10;2203:2;2181:9;:25::i;:::-;:29;2173:60;;;::::0;-1:-1:-1;;;2173:60:13;;13343:2:14;2173:60:13::1;::::0;::::1;13325:21:14::0;13382:2;13362:18;;;13355:30;-1:-1:-1;;;13401:18:14;;;13394:48;13459:18;;2173:60:13::1;13141:342:14::0;2173:60:13::1;2251:3;::::0;:20:::1;::::0;-1:-1:-1;;;2251:20:13;;::::1;::::0;::::1;616:25:14::0;;;2275:10:13::1;::::0;-1:-1:-1;;;;;2251:3:13::1;::::0;:11:::1;::::0;589:18:14;;2251:20:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2251:34:13::1;;2243:68;;;::::0;-1:-1:-1;;;2243:68:13;;15283:2:14;2243:68:13::1;::::0;::::1;15265:21:14::0;15322:2;15302:18;;;15295:30;-1:-1:-1;;;15341:18:14;;;15334:51;15402:18;;2243:68:13::1;15081:345:14::0;2243:68:13::1;2329:22;::::0;;;:13:::1;:22;::::0;;;;;::::1;;:31;2321:68;;;::::0;-1:-1:-1;;;2321:68:13;;15633:2:14;2321:68:13::1;::::0;::::1;15615:21:14::0;15672:2;15652:18;;;15645:30;15711:26;15691:18;;;15684:54;15755:18;;2321:68:13::1;15431:348:14::0;2321:68:13::1;2400:24;2406:10;2418:2;2422:1;2400:5;:24::i;:::-;2434:22;::::0;;;:13:::1;:22;::::0;;;;;;:29;;-1:-1:-1;;2434:29:13::1;2459:4;2434:29;::::0;;2478:27;::::1;::::0;::::1;::::0;2448:7;;2502:2;;15958:25:14;;;16014:2;15999:18;;15992:34;15946:2;15931:18;;15784:248;2478:27:13::1;;;;;;;;2065:447:::0;;:::o;294:19:11:-;;;;;;;:::i;4205:394:12:-;-1:-1:-1;;;;;4405:20:12;;719:10:7;4405:20:12;;:60;;-1:-1:-1;4429:36:12;4446:4;719:10:7;3928:210:12;:::i;4429:36::-;4384:153;;;;-1:-1:-1;;;4384:153:12;;;;;;;:::i;:::-;4547:45;4565:4;4571:2;4575;4579:6;4587:4;4547:17;:45::i;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;16239:2:14;2161:73:0::1;::::0;::::1;16221:21:14::0;16278:2;16258:18;;;16251:30;16317:34;16297:18;;;16290:62;-1:-1:-1;;;16368:18:14;;;16361:36;16414:19;;2161:73:0::1;16037:402:14::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;1359:130::-:0;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:7;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16646:2:14;1414:68:0;;;16628:21:14;;;16665:18;;;16658:30;16724:34;16704:18;;;16697:62;16776:18;;1414:68:0;16444:356:14;8974:86:12;9040:4;:13;9047:6;9040:4;:13;:::i;11527:565::-;719:10:7;11670:16:12;11712:374;11736:11;:18;11732:1;:22;11712:374;;;11775:10;11788:11;11800:1;11788:14;;;;;;;;:::i;:::-;;;;;;;11775:27;;11816:14;11833:7;11841:1;11833:10;;;;;;;;:::i;:::-;;;;;;;11816:27;;11875:1;-1:-1:-1;;;;;11861:16:12;:2;-1:-1:-1;;;;;11861:16:12;;11857:65;;11879:43;;-1:-1:-1;;;11879:43:12;;;;;;;:::i;11857:65::-;11937:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11937:17:12;;;;;;;;;:27;;11958:6;;11937:13;:27;;11958:6;;11937:27;:::i;:::-;;;;-1:-1:-1;;11978:16:12;;;;:12;:16;;;;;:26;;11998:6;;11978:16;:26;;11998:6;;11978:26;:::i;:::-;;;;-1:-1:-1;;12023:52:12;;;15958:25:14;;;16014:2;15999:18;;15992:34;;;-1:-1:-1;;;;;12023:52:12;;;;12056:1;;12023:52;;;;-1:-1:-1;;;;;;;;;;;12023:52:12;15931:18:14;12023:52:12;;;;;;;11761:325;;11756:3;;;;;:::i;:::-;;;;11712:374;;1976:103;2036:13;2068:4;2061:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1976:103;;;:::o;392:703:8:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:8;;;;;;;;;;;;-1:-1:-1;;;691:10:8;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:8;;-1:-1:-1;837:2:8;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:8;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:8;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:8;;;;;;;;-1:-1:-1;1036:11:8;1045:2;1036:11;;:::i;:::-;;;908:150;;6874:1277:12;7107:7;:14;7093:3;:10;:28;7072:115;;;;-1:-1:-1;;;7072:115:12;;20250:2:14;7072:115:12;;;20232:21:14;20289:2;20269:18;;;20262:30;20328:34;20308:18;;;20301:62;-1:-1:-1;;;20379:18:14;;;20372:38;20427:19;;7072:115:12;20048:404:14;7072:115:12;-1:-1:-1;;;;;7205:16:12;;7197:66;;;;-1:-1:-1;;;7197:66:12;;;;;;;:::i;:::-;719:10:7;7316:60:12;719:10:7;7347:4:12;7353:2;7357:3;7362:7;7371:4;7316:20;:60::i;:::-;7392:9;7387:457;7411:3;:10;7407:1;:14;7387:457;;;7442:10;7455:3;7459:1;7455:6;;;;;;;;:::i;:::-;;;;;;;7442:19;;7475:14;7492:7;7500:1;7492:10;;;;;;;;:::i;:::-;;;;;;;;;;;;7517:19;7539:13;;;:9;:13;;;;;;-1:-1:-1;;;;;7539:19:12;;;;;;;;;;;;7492:10;;-1:-1:-1;7597:21:12;;;;7572:122;;;;-1:-1:-1;;;7572:122:12;;;;;;;:::i;:::-;7736:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7736:19:12;;;;;;;;;;7758:20;;;7736:42;;7806:17;;;;;;;:27;;7758:20;;7736:13;7806:27;;7758:20;;7806:27;:::i;:::-;;;;;;;;7428:416;;;7423:3;;;;:::i;:::-;;;7387:457;;;;7889:2;-1:-1:-1;;;;;7859:47:12;7883:4;-1:-1:-1;;;;;7859:47:12;7873:8;-1:-1:-1;;;;;7859:47:12;;7893:3;7898:7;7859:47;;;;;;;:::i;:::-;;;;;;;;7987:157;8036:8;8058:4;8076:2;8092:3;8109:7;8130:4;7987:35;:157::i;:::-;7062:1089;6874:1277;;;;;:::o;2433:117:1:-;1486:16;:14;:16::i;:::-;2501:5:::1;2491:15:::0;;-1:-1:-1;;2491:15:1::1;::::0;;2521:22:::1;719:10:7::0;2530:12:1::1;2521:22;::::0;-1:-1:-1;;;;;8643:32:14;;;8625:51;;8613:2;8598:18;2521:22:1::1;;;;;;;2433:117::o:0;12378:786:12:-;-1:-1:-1;;;;;12500:18:12;;12492:66;;;;-1:-1:-1;;;12492:66:12;;21946:2:14;12492:66:12;;;21928:21:14;21985:2;21965:18;;;21958:30;22024:34;22004:18;;;21997:62;-1:-1:-1;;;22075:18:14;;;22068:33;22118:19;;12492:66:12;21744:399:14;12492:66:12;719:10:7;12569:16:12;12633:21;12651:2;12633:17;:21::i;:::-;12610:44;;12664:24;12691:25;12709:6;12691:17;:25::i;:::-;12664:52;;12727:66;12748:8;12758:4;12772:1;12776:3;12781:7;12727:66;;;;;;;;;;;;:20;:66::i;:::-;12804:19;12826:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;12826:19:12;;;;;;;;;;12863:21;;;;12855:70;;;;-1:-1:-1;;;12855:70:12;;22350:2:14;12855:70:12;;;22332:21:14;22389:2;22369:18;;;22362:30;22428:34;22408:18;;;22401:62;-1:-1:-1;;;22479:18:14;;;22472:34;22523:19;;12855:70:12;22148:400:14;12855:70:12;12959:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;12959:19:12;;;;;;;;;;;;12981:20;;;12959:42;;13027:54;;15958:25:14;;;15999:18;;;15992:34;;;12959:19:12;;13027:54;;;;-1:-1:-1;;;;;;;;;;;13027:54:12;15931:18:14;13027:54:12;;;;;;;13092:65;;;;;;;;;13136:1;13092:65;;;12482:682;;;;12378:786;;;:::o;9433:791::-;-1:-1:-1;;;;;9580:16:12;;9572:62;;;;-1:-1:-1;;;9572:62:12;;;;;;;:::i;:::-;719:10:7;9645:16:12;9709:21;9727:2;9709:17;:21::i;:::-;9686:44;;9740:24;9767:25;9785:6;9767:17;:25::i;:::-;9740:52;;9803:66;9824:8;9842:1;9846:2;9850:3;9855:7;9864:4;9803:20;:66::i;:::-;9880:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;9880:17:12;;;;;;;;;:27;;9901:6;;9880:13;:27;;9901:6;;9880:27;:::i;:::-;;;;-1:-1:-1;;9922:52:12;;;15958:25:14;;;16014:2;15999:18;;15992:34;;;-1:-1:-1;;;;;9922:52:12;;;;9955:1;;9922:52;;;;-1:-1:-1;;;;;;;;;;;9922:52:12;15931:18:14;9922:52:12;;;;;;;10061:156;10105:8;10135:1;10151:2;10167;10183:6;10203:4;10061:30;:156::i;2433:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;2186:115:1:-;1239:19;:17;:19::i;:::-;2245:7:::1;:14:::0;;-1:-1:-1;;2245:14:1::1;2255:4;2245:14;::::0;;2274:20:::1;2281:12;719:10:7::0;;640:96;14562:323:12;14712:8;-1:-1:-1;;;;;14703:17:12;:5;-1:-1:-1;;;;;14703:17:12;;14695:71;;;;-1:-1:-1;;;14695:71:12;;22755:2:14;14695:71:12;;;22737:21:14;22794:2;22774:18;;;22767:30;22833:34;22813:18;;;22806:62;-1:-1:-1;;;22884:18:14;;;22877:39;22933:19;;14695:71:12;22553:405:14;14695:71:12;-1:-1:-1;;;;;14776:25:12;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;14776:46:12;;;;;;;;;;14837:41;;1178::14;;;14837::12;;1151:18:14;14837:41:12;;;;;;;14562:323;;;:::o;5547:981::-;-1:-1:-1;;;;;5728:16:12;;5720:66;;;;-1:-1:-1;;;5720:66:12;;;;;;;:::i;:::-;719:10:7;5797:16:12;5861:21;5879:2;5861:17;:21::i;:::-;5838:44;;5892:24;5919:25;5937:6;5919:17;:25::i;:::-;5892:52;;5955:60;5976:8;5986:4;5992:2;5996:3;6001:7;6010:4;5955:20;:60::i;:::-;6026:19;6048:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;6048:19:12;;;;;;;;;;6098:21;;;;6077:110;;;;-1:-1:-1;;;6077:110:12;;;;;;;:::i;:::-;6221:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;6221:19:12;;;;;;;;;;6243:20;;;6221:42;;6283:17;;;;;;;:27;;6243:20;;6221:13;6283:27;;6243:20;;6283:27;:::i;:::-;;;;-1:-1:-1;;6326:46:12;;;15958:25:14;;;16014:2;15999:18;;15992:34;;;-1:-1:-1;;;;;6326:46:12;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6326:46:12;15931:18:14;6326:46:12;;;;;;;6453:68;6484:8;6494:4;6500:2;6504;6508:6;6516:4;6453:30;:68::i;:::-;5710:818;;;;5547:981;;;;;:::o;760:304:11:-;991:66;1018:8;1028:4;1034:2;1038:3;1043:7;1052:4;991:26;:66::i;18726:946:12:-;-1:-1:-1;;;;;18958:13:12;;1465:19:6;:23;18954:712:12;;19009:197;;-1:-1:-1;;;19009:197:12;;-1:-1:-1;;;;;19009:43:12;;;;;:197;;19074:8;;19104:4;;19130:3;;19155:7;;19184:4;;19009:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19009:197:12;;;;;;;;-1:-1:-1;;19009:197:12;;;;;;;;;;;;:::i;:::-;;;18989:667;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;19532:6;19525:14;;-1:-1:-1;;;19525:14:12;;;;;;;;:::i;18989:667::-;;;19579:62;;-1:-1:-1;;;19579:62:12;;25111:2:14;19579:62:12;;;25093:21:14;25150:2;25130:18;;;25123:30;25189:34;25169:18;;;25162:62;-1:-1:-1;;;25240:18:14;;;25233:50;25300:19;;19579:62:12;24909:416:14;18989:667:12;-1:-1:-1;;;;;;19288:60:12;;-1:-1:-1;;;19288:60:12;19263:195;;19389:50;;-1:-1:-1;;;19389:50:12;;;;;;;:::i;1945:106:1:-;1662:4;1685:7;;;2003:41;;;;-1:-1:-1;;;2003:41:1;;25941:2:14;2003:41:1;;;25923:21:14;25980:2;25960:18;;;25953:30;-1:-1:-1;;;25999:18:14;;;25992:50;26059:18;;2003:41:1;25739:344:14;19678:221:12;19825:16;;;19839:1;19825:16;;;;;;;;;19768;;19800:22;;19825:16;;;;;;;;;;;;-1:-1:-1;19825:16:12;19800:41;;19862:7;19851:5;19857:1;19851:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;19887:5;19678:221;-1:-1:-1;;19678:221:12:o;17849:871::-;-1:-1:-1;;;;;18056:13:12;;1465:19:6;:23;18052:662:12;;18107:190;;-1:-1:-1;;;18107:190:12;;-1:-1:-1;;;;;18107:38:12;;;;;:190;;18167:8;;18197:4;;18223:2;;18247:6;;18275:4;;18107:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18107:190:12;;;;;;;;-1:-1:-1;;18107:190:12;;;;;;;;;;;;:::i;:::-;;;18087:617;;;;:::i;:::-;-1:-1:-1;;;;;;18358:55:12;;-1:-1:-1;;;18358:55:12;18354:152;;18437:50;;-1:-1:-1;;;18437:50:12;;;;;;;:::i;1767:106:1:-;1662:4;1685:7;;;1836:9;1828:38;;;;-1:-1:-1;;;1828:38:1;;26856:2:14;1828:38:1;;;26838:21:14;26895:2;26875:18;;;26868:30;-1:-1:-1;;;26914:18:14;;;26907:46;26970:18;;1828:38:1;26654:340:14;15821:876:12;-1:-1:-1;;;;;16047:18:12;;16043:156;;16086:9;16081:108;16105:3;:10;16101:1;:14;16081:108;;;16164:7;16172:1;16164:10;;;;;;;;:::i;:::-;;;;;;;16140:12;:20;16153:3;16157:1;16153:6;;;;;;;;:::i;:::-;;;;;;;16140:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;16117:3:12;;-1:-1:-1;16117:3:12;;:::i;:::-;;;16081:108;;;;16043:156;-1:-1:-1;;;;;16213:16:12;;16209:482;;16250:9;16245:436;16269:3;:10;16265:1;:14;16245:436;;;16304:10;16317:3;16321:1;16317:6;;;;;;;;:::i;:::-;;;;;;;16304:19;;16341:14;16358:7;16366:1;16358:10;;;;;;;;:::i;:::-;;;;;;;16341:27;;16386:14;16403:12;:16;16416:2;16403:16;;;;;;;;;;;;16386:33;;16476:6;16466;:16;;16437:127;;;;-1:-1:-1;;;16437:127:12;;27201:2:14;16437:127:12;;;27183:21:14;27240:2;27220:18;;;27213:30;27279:34;27259:18;;;27252:62;-1:-1:-1;;;27330:18:14;;;27323:38;27378:19;;16437:127:12;26999:404:14;16437:127:12;16614:16;;;;:12;:16;;;;;;16633:15;;16614:34;;16281:3;;;:::i;:::-;;;16245:436;;14:131:14;-1:-1:-1;;;;;89:31:14;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:14:o;652:131::-;-1:-1:-1;;;;;;726:32:14;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:14:o;1230:127::-;1291:10;1286:3;1282:20;1279:1;1272:31;1322:4;1319:1;1312:15;1346:4;1343:1;1336:15;1362:249;1472:2;1453:13;;-1:-1:-1;;1449:27:14;1437:40;;1507:18;1492:34;;1528:22;;;1489:62;1486:88;;;1554:18;;:::i;:::-;1590:2;1583:22;-1:-1:-1;;1362:249:14:o;1616:469::-;1681:5;1715:18;1707:6;1704:30;1701:56;;;1737:18;;:::i;:::-;1786:2;1780:9;1798:69;1855:2;1834:15;;-1:-1:-1;;1830:29:14;1861:4;1826:40;1780:9;1798:69;:::i;:::-;1885:6;1876:15;;1915:6;1907;1900:22;1955:3;1946:6;1941:3;1937:16;1934:25;1931:45;;;1972:1;1969;1962:12;1931:45;2022:6;2017:3;2010:4;2002:6;1998:17;1985:44;2077:1;2070:4;2061:6;2053;2049:19;2045:30;2038:41;;1616:469;;;;;:::o;2090:451::-;2159:6;2212:2;2200:9;2191:7;2187:23;2183:32;2180:52;;;2228:1;2225;2218:12;2180:52;2268:9;2255:23;2301:18;2293:6;2290:30;2287:50;;;2333:1;2330;2323:12;2287:50;2356:22;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:14;;2438:1;2435;2428:12;2387:55;2461:74;2527:7;2522:2;2509:16;2504:2;2500;2496:11;2461:74;:::i;2546:258::-;2618:1;2628:113;2642:6;2639:1;2636:13;2628:113;;;2718:11;;;2712:18;2699:11;;;2692:39;2664:2;2657:10;2628:113;;;2759:6;2756:1;2753:13;2750:48;;;2794:1;2785:6;2780:3;2776:16;2769:27;2750:48;;2546:258;;;:::o;2809:::-;2851:3;2889:5;2883:12;2916:6;2911:3;2904:19;2932:63;2988:6;2981:4;2976:3;2972:14;2965:4;2958:5;2954:16;2932:63;:::i;:::-;3049:2;3028:15;-1:-1:-1;;3024:29:14;3015:39;;;;3056:4;3011:50;;2809:258;-1:-1:-1;;2809:258:14:o;3072:220::-;3221:2;3210:9;3203:21;3184:4;3241:45;3282:2;3271:9;3267:18;3259:6;3241:45;:::i;3297:183::-;3357:4;3390:18;3382:6;3379:30;3376:56;;;3412:18;;:::i;:::-;-1:-1:-1;3457:1:14;3453:14;3469:4;3449:25;;3297:183::o;3485:799::-;3539:5;3592:3;3585:4;3577:6;3573:17;3569:27;3559:55;;3610:1;3607;3600:12;3559:55;3646:6;3633:20;3672:4;3695:43;3735:2;3695:43;:::i;:::-;3767:2;3761:9;3779:31;3807:2;3799:6;3779:31;:::i;:::-;3845:18;;;3937:1;3933:10;;;;3921:23;;3917:32;;;3879:15;;;;-1:-1:-1;3961:15:14;;;3958:35;;;3989:1;3986;3979:12;3958:35;4025:2;4017:6;4013:15;4037:217;4053:6;4048:3;4045:15;4037:217;;;4133:3;4120:17;4150:31;4175:5;4150:31;:::i;:::-;4194:18;;4232:12;;;;4070;;4037:217;;;-1:-1:-1;4272:6:14;3485:799;-1:-1:-1;;;;;;3485:799:14:o;4289:724::-;4343:5;4396:3;4389:4;4381:6;4377:17;4373:27;4363:55;;4414:1;4411;4404:12;4363:55;4450:6;4437:20;4476:4;4499:43;4539:2;4499:43;:::i;:::-;4571:2;4565:9;4583:31;4611:2;4603:6;4583:31;:::i;:::-;4649:18;;;4741:1;4737:10;;;;4725:23;;4721:32;;;4683:15;;;;-1:-1:-1;4765:15:14;;;4762:35;;;4793:1;4790;4783:12;4762:35;4829:2;4821:6;4817:15;4841:142;4857:6;4852:3;4849:15;4841:142;;;4923:17;;4911:30;;4961:12;;;;4874;;4841:142;;5018:663;5145:6;5153;5161;5214:2;5202:9;5193:7;5189:23;5185:32;5182:52;;;5230:1;5227;5220:12;5182:52;5270:9;5257:23;5299:18;5340:2;5332:6;5329:14;5326:34;;;5356:1;5353;5346:12;5326:34;5379:61;5432:7;5423:6;5412:9;5408:22;5379:61;:::i;:::-;5369:71;;5487:2;5476:9;5472:18;5459:32;5449:42;;5544:2;5533:9;5529:18;5516:32;5500:48;;5573:2;5563:8;5560:16;5557:36;;;5589:1;5586;5579:12;5557:36;;5612:63;5667:7;5656:8;5645:9;5641:24;5612:63;:::i;:::-;5602:73;;;5018:663;;;;;:::o;5686:180::-;5745:6;5798:2;5786:9;5777:7;5773:23;5769:32;5766:52;;;5814:1;5811;5804:12;5766:52;-1:-1:-1;5837:23:14;;5686:180;-1:-1:-1;5686:180:14:o;5871:221::-;5913:5;5966:3;5959:4;5951:6;5947:17;5943:27;5933:55;;5984:1;5981;5974:12;5933:55;6006:80;6082:3;6073:6;6060:20;6053:4;6045:6;6041:17;6006:80;:::i;6097:1071::-;6251:6;6259;6267;6275;6283;6336:3;6324:9;6315:7;6311:23;6307:33;6304:53;;;6353:1;6350;6343:12;6304:53;6392:9;6379:23;6411:31;6436:5;6411:31;:::i;:::-;6461:5;-1:-1:-1;6518:2:14;6503:18;;6490:32;6531:33;6490:32;6531:33;:::i;:::-;6583:7;-1:-1:-1;6641:2:14;6626:18;;6613:32;6664:18;6694:14;;;6691:34;;;6721:1;6718;6711:12;6691:34;6744:61;6797:7;6788:6;6777:9;6773:22;6744:61;:::i;:::-;6734:71;;6858:2;6847:9;6843:18;6830:32;6814:48;;6887:2;6877:8;6874:16;6871:36;;;6903:1;6900;6893:12;6871:36;6926:63;6981:7;6970:8;6959:9;6955:24;6926:63;:::i;:::-;6916:73;;7042:3;7031:9;7027:19;7014:33;6998:49;;7072:2;7062:8;7059:16;7056:36;;;7088:1;7085;7078:12;7056:36;;7111:51;7154:7;7143:8;7132:9;7128:24;7111:51;:::i;:::-;7101:61;;;6097:1071;;;;;;;;:::o;7173:595::-;7291:6;7299;7352:2;7340:9;7331:7;7327:23;7323:32;7320:52;;;7368:1;7365;7358:12;7320:52;7408:9;7395:23;7437:18;7478:2;7470:6;7467:14;7464:34;;;7494:1;7491;7484:12;7464:34;7517:61;7570:7;7561:6;7550:9;7546:22;7517:61;:::i;:::-;7507:71;;7631:2;7620:9;7616:18;7603:32;7587:48;;7660:2;7650:8;7647:16;7644:36;;;7676:1;7673;7666:12;7644:36;;7699:63;7754:7;7743:8;7732:9;7728:24;7699:63;:::i;:::-;7689:73;;;7173:595;;;;;:::o;7773:435::-;7826:3;7864:5;7858:12;7891:6;7886:3;7879:19;7917:4;7946:2;7941:3;7937:12;7930:19;;7983:2;7976:5;7972:14;8004:1;8014:169;8028:6;8025:1;8022:13;8014:169;;;8089:13;;8077:26;;8123:12;;;;8158:15;;;;8050:1;8043:9;8014:169;;;-1:-1:-1;8199:3:14;;7773:435;-1:-1:-1;;;;;7773:435:14:o;8213:261::-;8392:2;8381:9;8374:21;8355:4;8412:56;8464:2;8453:9;8449:18;8441:6;8412:56;:::i;8687:416::-;8752:6;8760;8813:2;8801:9;8792:7;8788:23;8784:32;8781:52;;;8829:1;8826;8819:12;8781:52;8868:9;8855:23;8887:31;8912:5;8887:31;:::i;:::-;8937:5;-1:-1:-1;8994:2:14;8979:18;;8966:32;9036:15;;9029:23;9017:36;;9007:64;;9067:1;9064;9057:12;9007:64;9090:7;9080:17;;;8687:416;;;;;:::o;9108:248::-;9176:6;9184;9237:2;9225:9;9216:7;9212:23;9208:32;9205:52;;;9253:1;9250;9243:12;9205:52;-1:-1:-1;;9276:23:14;;;9346:2;9331:18;;;9318:32;;-1:-1:-1;9108:248:14:o;9361:388::-;9429:6;9437;9490:2;9478:9;9469:7;9465:23;9461:32;9458:52;;;9506:1;9503;9496:12;9458:52;9545:9;9532:23;9564:31;9589:5;9564:31;:::i;:::-;9614:5;-1:-1:-1;9671:2:14;9656:18;;9643:32;9684:33;9643:32;9684:33;:::i;9754:734::-;9858:6;9866;9874;9882;9890;9943:3;9931:9;9922:7;9918:23;9914:33;9911:53;;;9960:1;9957;9950:12;9911:53;9999:9;9986:23;10018:31;10043:5;10018:31;:::i;:::-;10068:5;-1:-1:-1;10125:2:14;10110:18;;10097:32;10138:33;10097:32;10138:33;:::i;:::-;10190:7;-1:-1:-1;10244:2:14;10229:18;;10216:32;;-1:-1:-1;10295:2:14;10280:18;;10267:32;;-1:-1:-1;10350:3:14;10335:19;;10322:33;10378:18;10367:30;;10364:50;;;10410:1;10407;10400:12;10364:50;10433:49;10474:7;10465:6;10454:9;10450:22;10433:49;:::i;10493:247::-;10552:6;10605:2;10593:9;10584:7;10580:23;10576:32;10573:52;;;10621:1;10618;10611:12;10573:52;10660:9;10647:23;10679:31;10704:5;10679:31;:::i;11156:380::-;11235:1;11231:12;;;;11278;;;11299:61;;11353:4;11345:6;11341:17;11331:27;;11299:61;11406:2;11398:6;11395:14;11375:18;11372:38;11369:161;;11452:10;11447:3;11443:20;11440:1;11433:31;11487:4;11484:1;11477:15;11515:4;11512:1;11505:15;11369:161;;11156:380;;;:::o;11892:470::-;12071:3;12109:6;12103:13;12125:53;12171:6;12166:3;12159:4;12151:6;12147:17;12125:53;:::i;:::-;12241:13;;12200:16;;;;12263:57;12241:13;12200:16;12297:4;12285:17;;12263:57;:::i;:::-;12336:20;;11892:470;-1:-1:-1;;;;11892:470:14:o;12367:410::-;12569:2;12551:21;;;12608:2;12588:18;;;12581:30;12647:34;12642:2;12627:18;;12620:62;-1:-1:-1;;;12713:2:14;12698:18;;12691:44;12767:3;12752:19;;12367:410::o;13838:127::-;13899:10;13894:3;13890:20;13887:1;13880:31;13930:4;13927:1;13920:15;13954:4;13951:1;13944:15;13970:168;14010:7;14076:1;14072;14068:6;14064:14;14061:1;14058:21;14053:1;14046:9;14039:17;14035:45;14032:71;;;14083:18;;:::i;:::-;-1:-1:-1;14123:9:14;;13970:168::o;14553:127::-;14614:10;14609:3;14605:20;14602:1;14595:31;14645:4;14642:1;14635:15;14669:4;14666:1;14659:15;14685:135;14724:3;14745:17;;;14742:43;;14765:18;;:::i;:::-;-1:-1:-1;14812:1:14;14801:13;;14685:135::o;14825:251::-;14895:6;14948:2;14936:9;14927:7;14923:23;14919:32;14916:52;;;14964:1;14961;14954:12;14916:52;14996:9;14990:16;15015:31;15040:5;15015:31;:::i;16931:545::-;17033:2;17028:3;17025:11;17022:448;;;17069:1;17094:5;17090:2;17083:17;17139:4;17135:2;17125:19;17209:2;17197:10;17193:19;17190:1;17186:27;17180:4;17176:38;17245:4;17233:10;17230:20;17227:47;;;-1:-1:-1;17268:4:14;17227:47;17323:2;17318:3;17314:12;17311:1;17307:20;17301:4;17297:31;17287:41;;17378:82;17396:2;17389:5;17386:13;17378:82;;;17441:17;;;17422:1;17411:13;17378:82;;17652:1352;17778:3;17772:10;17805:18;17797:6;17794:30;17791:56;;;17827:18;;:::i;:::-;17856:97;17946:6;17906:38;17938:4;17932:11;17906:38;:::i;:::-;17900:4;17856:97;:::i;:::-;18008:4;;18072:2;18061:14;;18089:1;18084:663;;;;18791:1;18808:6;18805:89;;;-1:-1:-1;18860:19:14;;;18854:26;18805:89;-1:-1:-1;;17609:1:14;17605:11;;;17601:24;17597:29;17587:40;17633:1;17629:11;;;17584:57;18907:81;;18054:944;;18084:663;16878:1;16871:14;;;16915:4;16902:18;;-1:-1:-1;;18120:20:14;;;18238:236;18252:7;18249:1;18246:14;18238:236;;;18341:19;;;18335:26;18320:42;;18433:27;;;;18401:1;18389:14;;;;18268:19;;18238:236;;;18242:3;18502:6;18493:7;18490:19;18487:201;;;18563:19;;;18557:26;-1:-1:-1;;18646:1:14;18642:14;;;18658:3;18638:24;18634:37;18630:42;18615:58;18600:74;;18487:201;-1:-1:-1;;;;;18734:1:14;18718:14;;;18714:22;18701:36;;-1:-1:-1;17652:1352:14:o;19009:397::-;19211:2;19193:21;;;19250:2;19230:18;;;19223:30;19289:34;19284:2;19269:18;;19262:62;-1:-1:-1;;;19355:2:14;19340:18;;19333:31;19396:3;19381:19;;19009:397::o;19411:128::-;19451:3;19482:1;19478:6;19475:1;19472:13;19469:39;;;19488:18;;:::i;:::-;-1:-1:-1;19524:9:14;;19411:128::o;19544:127::-;19605:10;19600:3;19596:20;19593:1;19586:31;19636:4;19633:1;19626:15;19660:4;19657:1;19650:15;19676:120;19716:1;19742;19732:35;;19747:18;;:::i;:::-;-1:-1:-1;19781:9:14;;19676:120::o;19801:125::-;19841:4;19869:1;19866;19863:8;19860:34;;;19874:18;;:::i;:::-;-1:-1:-1;19911:9:14;;19801:125::o;19931:112::-;19963:1;19989;19979:35;;19994:18;;:::i;:::-;-1:-1:-1;20028:9:14;;19931:112::o;20457:401::-;20659:2;20641:21;;;20698:2;20678:18;;;20671:30;20737:34;20732:2;20717:18;;20710:62;-1:-1:-1;;;20803:2:14;20788:18;;20781:35;20848:3;20833:19;;20457:401::o;20863:406::-;21065:2;21047:21;;;21104:2;21084:18;;;21077:30;21143:34;21138:2;21123:18;;21116:62;-1:-1:-1;;;21209:2:14;21194:18;;21187:40;21259:3;21244:19;;20863:406::o;21274:465::-;21531:2;21520:9;21513:21;21494:4;21557:56;21609:2;21598:9;21594:18;21586:6;21557:56;:::i;:::-;21661:9;21653:6;21649:22;21644:2;21633:9;21629:18;21622:50;21689:44;21726:6;21718;21689:44;:::i;:::-;21681:52;21274:465;-1:-1:-1;;;;;21274:465:14:o;22963:827::-;-1:-1:-1;;;;;23360:15:14;;;23342:34;;23412:15;;23407:2;23392:18;;23385:43;23322:3;23459:2;23444:18;;23437:31;;;23285:4;;23491:57;;23528:19;;23520:6;23491:57;:::i;:::-;23596:9;23588:6;23584:22;23579:2;23568:9;23564:18;23557:50;23630:44;23667:6;23659;23630:44;:::i;:::-;23616:58;;23723:9;23715:6;23711:22;23705:3;23694:9;23690:19;23683:51;23751:33;23777:6;23769;23751:33;:::i;:::-;23743:41;22963:827;-1:-1:-1;;;;;;;;22963:827:14:o;23795:249::-;23864:6;23917:2;23905:9;23896:7;23892:23;23888:32;23885:52;;;23933:1;23930;23923:12;23885:52;23965:9;23959:16;23984:30;24008:5;23984:30;:::i;24049:179::-;24084:3;24126:1;24108:16;24105:23;24102:120;;;24172:1;24169;24166;24151:23;-1:-1:-1;24209:1:14;24203:8;24198:3;24194:18;24102:120;24049:179;:::o;24233:671::-;24272:3;24314:4;24296:16;24293:26;24290:39;;;24233:671;:::o;24290:39::-;24356:2;24350:9;-1:-1:-1;;24421:16:14;24417:25;;24414:1;24350:9;24393:50;24472:4;24466:11;24496:16;24531:18;24602:2;24595:4;24587:6;24583:17;24580:25;24575:2;24567:6;24564:14;24561:45;24558:58;;;24609:5;;;;;24233:671;:::o;24558:58::-;24646:6;24640:4;24636:17;24625:28;;24682:3;24676:10;24709:2;24701:6;24698:14;24695:27;;;24715:5;;;;;;24233:671;:::o;24695:27::-;24799:2;24780:16;24774:4;24770:27;24766:36;24759:4;24750:6;24745:3;24741:16;24737:27;24734:69;24731:82;;;24806:5;;;;;;24233:671;:::o;24731:82::-;24822:57;24873:4;24864:6;24856;24852:19;24848:30;24842:4;24822:57;:::i;:::-;-1:-1:-1;24895:3:14;;24233:671;-1:-1:-1;;;;;24233:671:14:o;25330:404::-;25532:2;25514:21;;;25571:2;25551:18;;;25544:30;25610:34;25605:2;25590:18;;25583:62;-1:-1:-1;;;25676:2:14;25661:18;;25654:38;25724:3;25709:19;;25330:404::o;26088:561::-;-1:-1:-1;;;;;26385:15:14;;;26367:34;;26437:15;;26432:2;26417:18;;26410:43;26484:2;26469:18;;26462:34;;;26527:2;26512:18;;26505:34;;;26347:3;26570;26555:19;;26548:32;;;26310:4;;26597:46;;26623:19;;26615:6;26597:46;:::i;:::-;26589:54;26088:561;-1:-1:-1;;;;;;;26088:561:14:o

Swarm Source

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