POL Price: $0.386761 (+2.14%)
Gas: 60 GWei
 

Overview

TokenID

38

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoIlluminati is a card game that puts players in control of the world as an Illuminati member competing with other Illuminati members.

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoIlluminati

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-02-25
*/

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;






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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

        _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();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// File contracts/CryptoIlluminati.sol

pragma solidity ^0.8.4;



contract CryptoIlluminati is ERC1155, Ownable, ERC1155Supply {
    constructor()
        ERC1155("https://api.cryptoilluminati.net/api/v1/cards/metadata-1/{id}")
    {}

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

    function mint(address account, uint256 id, uint256 amount, bytes memory data)
        public
        onlyOwner
    {
        _mint(account, id, amount, data);
    }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyOwner
    {
        _mintBatch(to, ids, amounts, data);
    }

    // The following functions are overrides required by Solidity.

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060600160405280603d815260200162003967603d91396200003d816200006460201b60201c565b506200005e620000526200008060201b60201c565b6200008860201b60201c565b62000263565b80600290805190602001906200007c9291906200014e565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200015c90620001fe565b90600052602060002090601f016020900481019282620001805760008555620001cc565b82601f106200019b57805160ff1916838001178555620001cc565b82800160010185558215620001cc579182015b82811115620001cb578251825591602001919060010190620001ae565b5b509050620001db9190620001df565b5090565b5b80821115620001fa576000816000905550600101620001e0565b5090565b600060028204905060018216806200021757607f821691505b602082108114156200022e576200022d62000234565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6136f480620002736000396000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063715018a611610097578063bd85b03911610066578063bd85b039146102a8578063e985e9c5146102d8578063f242432a14610308578063f2fde38b14610324576100ff565b8063715018a614610248578063731133e9146102525780638da5cb5b1461026e578063a22cb4651461028c576100ff565b80631f7fdffa116100d35780631f7fdffa146101b05780632eb2c2d6146101cc5780634e1273f4146101e85780634f558e7914610218576100ff565b8062fdd58e1461010457806301ffc9a71461013457806302fe5305146101645780630e89341c14610180575b600080fd5b61011e600480360381019061011991906125c5565b610340565b60405161012b9190612da2565b60405180910390f35b61014e600480360381019061014991906126e8565b610409565b60405161015b9190612bc5565b60405180910390f35b61017e6004803603810190610179919061273a565b6104eb565b005b61019a6004803603810190610195919061277b565b610573565b6040516101a79190612be0565b60405180910390f35b6101ca60048036038101906101c591906124de565b610607565b005b6101e660048036038101906101e19190612390565b610695565b005b61020260048036038101906101fd919061267c565b610736565b60405161020f9190612b6c565b60405180910390f35b610232600480360381019061022d919061277b565b6108e7565b60405161023f9190612bc5565b60405180910390f35b6102506108fb565b005b61026c60048036038101906102679190612601565b610983565b005b610276610a11565b6040516102839190612a8f565b60405180910390f35b6102a660048036038101906102a19190612589565b610a3b565b005b6102c260048036038101906102bd919061277b565b610a51565b6040516102cf9190612da2565b60405180910390f35b6102f260048036038101906102ed9190612354565b610a6e565b6040516102ff9190612bc5565b60405180910390f35b610322600480360381019061031d919061244f565b610b02565b005b61033e6004803603810190610339919061232b565b610ba3565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a890612c42565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104d457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104e457506104e382610c9b565b5b9050919050565b6104f3610d05565b73ffffffffffffffffffffffffffffffffffffffff16610511610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055e90612d02565b60405180910390fd5b61057081610d0d565b50565b60606002805461058290613076565b80601f01602080910402602001604051908101604052809291908181526020018280546105ae90613076565b80156105fb5780601f106105d0576101008083540402835291602001916105fb565b820191906000526020600020905b8154815290600101906020018083116105de57829003601f168201915b50505050509050919050565b61060f610d05565b73ffffffffffffffffffffffffffffffffffffffff1661062d610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a90612d02565b60405180910390fd5b61068f84848484610d27565b50505050565b61069d610d05565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106e357506106e2856106dd610d05565b610a6e565b5b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612cc2565b60405180910390fd5b61072f8585858585610f91565b5050505050565b6060815183511461077c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077390612d42565b60405180910390fd5b6000835167ffffffffffffffff8111156107bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156107ed5781602001602082028036833780820191505090505b50905060005b84518110156108dc57610886858281518110610838577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610879577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610340565b8282815181106108bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806108d5906130d9565b90506107f3565b508091505092915050565b6000806108f383610a51565b119050919050565b610903610d05565b73ffffffffffffffffffffffffffffffffffffffff16610921610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e90612d02565b60405180910390fd5b61098160006112f1565b565b61098b610d05565b73ffffffffffffffffffffffffffffffffffffffff166109a9610a11565b73ffffffffffffffffffffffffffffffffffffffff16146109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f690612d02565b60405180910390fd5b610a0b848484846113b7565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a4d610a46610d05565b838361154d565b5050565b600060046000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b0a610d05565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f85610b4a610d05565b610a6e565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690612c82565b60405180910390fd5b610b9c85858585856116ba565b5050505050565b610bab610d05565b73ffffffffffffffffffffffffffffffffffffffff16610bc9610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690612d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8690612c62565b60405180910390fd5b610c98816112f1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190610d23929190612023565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90612d82565b60405180910390fd5b8151835114610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612d62565b60405180910390fd5b6000610de5610d05565b9050610df68160008787878761193c565b60005b8451811015610efb57838181518110610e3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ee19190612f36565b925050819055508080610ef3906130d9565b915050610df9565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f73929190612b8e565b60405180910390a4610f8a81600087878787611952565b5050505050565b8151835114610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90612d62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90612ca2565b60405180910390fd5b600061104f610d05565b905061105f81878787878761193c565b60005b845181101561125c5760008582815181106110a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106110eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390612ce2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112419190612f36565b9250508190555050505080611255906130d9565b9050611062565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112d3929190612b8e565b60405180910390a46112e9818787878787611952565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90612d82565b60405180910390fd5b6000611431610d05565b90506114528160008761144388611b39565b61144c88611b39565b8761193c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b19190612f36565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161152f929190612dbd565b60405180910390a461154681600087878787611bff565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390612d22565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ad9190612bc5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190612ca2565b60405180910390fd5b6000611734610d05565b905061175481878761174588611b39565b61174e88611b39565b8761193c565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290612ce2565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118a09190612f36565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161191d929190612dbd565b60405180910390a4611933828888888888611bff565b50505050505050565b61194a868686868686611de6565b505050505050565b6119718473ffffffffffffffffffffffffffffffffffffffff16611ff8565b15611b31578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016119b7959493929190612aaa565b602060405180830381600087803b1580156119d157600080fd5b505af1925050508015611a0257506040513d601f19601f820116820180604052508101906119ff9190612711565b60015b611aa857611a0e6131af565b806308c379a01415611a6b5750611a236135cc565b80611a2e5750611a6d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a629190612be0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612c02565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690612c22565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115611b7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611bac5781602001602082028036833780820191505090505b5090508281600081518110611bea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b611c1e8473ffffffffffffffffffffffffffffffffffffffff16611ff8565b15611dde578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611c64959493929190612b12565b602060405180830381600087803b158015611c7e57600080fd5b505af1925050508015611caf57506040513d601f19601f82011682018060405250810190611cac9190612711565b60015b611d5557611cbb6131af565b806308c379a01415611d185750611cd06135cc565b80611cdb5750611d1a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f9190612be0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90612c02565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390612c22565b60405180910390fd5b505b505050505050565b611df486868686868661201b565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ef25760005b8351811015611ef057828181518110611e6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160046000868481518110611eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611ed89190612f36565b9250508190555080611ee9906130d9565b9050611e2c565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ff05760005b8351811015611fee57828181518110611f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160046000868481518110611fb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611fd69190612f8c565b9250508190555080611fe7906130d9565b9050611f2a565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b82805461202f90613076565b90600052602060002090601f0160209004810192826120515760008555612098565b82601f1061206a57805160ff1916838001178555612098565b82800160010185558215612098579182015b8281111561209757825182559160200191906001019061207c565b5b5090506120a591906120a9565b5090565b5b808211156120c25760008160009055506001016120aa565b5090565b60006120d96120d484612e0b565b612de6565b905080838252602082019050828560208602820111156120f857600080fd5b60005b85811015612128578161210e888261221a565b8452602084019350602083019250506001810190506120fb565b5050509392505050565b600061214561214084612e37565b612de6565b9050808382526020820190508285602086028201111561216457600080fd5b60005b85811015612194578161217a8882612316565b845260208401935060208301925050600181019050612167565b5050509392505050565b60006121b16121ac84612e63565b612de6565b9050828152602081018484840111156121c957600080fd5b6121d4848285613034565b509392505050565b60006121ef6121ea84612e94565b612de6565b90508281526020810184848401111561220757600080fd5b612212848285613034565b509392505050565b60008135905061222981613662565b92915050565b600082601f83011261224057600080fd5b81356122508482602086016120c6565b91505092915050565b600082601f83011261226a57600080fd5b813561227a848260208601612132565b91505092915050565b60008135905061229281613679565b92915050565b6000813590506122a781613690565b92915050565b6000815190506122bc81613690565b92915050565b600082601f8301126122d357600080fd5b81356122e384826020860161219e565b91505092915050565b600082601f8301126122fd57600080fd5b813561230d8482602086016121dc565b91505092915050565b600081359050612325816136a7565b92915050565b60006020828403121561233d57600080fd5b600061234b8482850161221a565b91505092915050565b6000806040838503121561236757600080fd5b60006123758582860161221a565b92505060206123868582860161221a565b9150509250929050565b600080600080600060a086880312156123a857600080fd5b60006123b68882890161221a565b95505060206123c78882890161221a565b945050604086013567ffffffffffffffff8111156123e457600080fd5b6123f088828901612259565b935050606086013567ffffffffffffffff81111561240d57600080fd5b61241988828901612259565b925050608086013567ffffffffffffffff81111561243657600080fd5b612442888289016122c2565b9150509295509295909350565b600080600080600060a0868803121561246757600080fd5b60006124758882890161221a565b95505060206124868882890161221a565b945050604061249788828901612316565b93505060606124a888828901612316565b925050608086013567ffffffffffffffff8111156124c557600080fd5b6124d1888289016122c2565b9150509295509295909350565b600080600080608085870312156124f457600080fd5b60006125028782880161221a565b945050602085013567ffffffffffffffff81111561251f57600080fd5b61252b87828801612259565b935050604085013567ffffffffffffffff81111561254857600080fd5b61255487828801612259565b925050606085013567ffffffffffffffff81111561257157600080fd5b61257d878288016122c2565b91505092959194509250565b6000806040838503121561259c57600080fd5b60006125aa8582860161221a565b92505060206125bb85828601612283565b9150509250929050565b600080604083850312156125d857600080fd5b60006125e68582860161221a565b92505060206125f785828601612316565b9150509250929050565b6000806000806080858703121561261757600080fd5b60006126258782880161221a565b945050602061263687828801612316565b935050604061264787828801612316565b925050606085013567ffffffffffffffff81111561266457600080fd5b612670878288016122c2565b91505092959194509250565b6000806040838503121561268f57600080fd5b600083013567ffffffffffffffff8111156126a957600080fd5b6126b58582860161222f565b925050602083013567ffffffffffffffff8111156126d257600080fd5b6126de85828601612259565b9150509250929050565b6000602082840312156126fa57600080fd5b600061270884828501612298565b91505092915050565b60006020828403121561272357600080fd5b6000612731848285016122ad565b91505092915050565b60006020828403121561274c57600080fd5b600082013567ffffffffffffffff81111561276657600080fd5b612772848285016122ec565b91505092915050565b60006020828403121561278d57600080fd5b600061279b84828501612316565b91505092915050565b60006127b08383612a71565b60208301905092915050565b6127c581612fc0565b82525050565b60006127d682612ed5565b6127e08185612f03565b93506127eb83612ec5565b8060005b8381101561281c57815161280388826127a4565b975061280e83612ef6565b9250506001810190506127ef565b5085935050505092915050565b61283281612fd2565b82525050565b600061284382612ee0565b61284d8185612f14565b935061285d818560208601613043565b612866816131d1565b840191505092915050565b600061287c82612eeb565b6128868185612f25565b9350612896818560208601613043565b61289f816131d1565b840191505092915050565b60006128b7603483612f25565b91506128c2826131ef565b604082019050919050565b60006128da602883612f25565b91506128e58261323e565b604082019050919050565b60006128fd602b83612f25565b91506129088261328d565b604082019050919050565b6000612920602683612f25565b915061292b826132dc565b604082019050919050565b6000612943602983612f25565b915061294e8261332b565b604082019050919050565b6000612966602583612f25565b91506129718261337a565b604082019050919050565b6000612989603283612f25565b9150612994826133c9565b604082019050919050565b60006129ac602a83612f25565b91506129b782613418565b604082019050919050565b60006129cf602083612f25565b91506129da82613467565b602082019050919050565b60006129f2602983612f25565b91506129fd82613490565b604082019050919050565b6000612a15602983612f25565b9150612a20826134df565b604082019050919050565b6000612a38602883612f25565b9150612a438261352e565b604082019050919050565b6000612a5b602183612f25565b9150612a668261357d565b604082019050919050565b612a7a8161302a565b82525050565b612a898161302a565b82525050565b6000602082019050612aa460008301846127bc565b92915050565b600060a082019050612abf60008301886127bc565b612acc60208301876127bc565b8181036040830152612ade81866127cb565b90508181036060830152612af281856127cb565b90508181036080830152612b068184612838565b90509695505050505050565b600060a082019050612b2760008301886127bc565b612b3460208301876127bc565b612b416040830186612a80565b612b4e6060830185612a80565b8181036080830152612b608184612838565b90509695505050505050565b60006020820190508181036000830152612b8681846127cb565b905092915050565b60006040820190508181036000830152612ba881856127cb565b90508181036020830152612bbc81846127cb565b90509392505050565b6000602082019050612bda6000830184612829565b92915050565b60006020820190508181036000830152612bfa8184612871565b905092915050565b60006020820190508181036000830152612c1b816128aa565b9050919050565b60006020820190508181036000830152612c3b816128cd565b9050919050565b60006020820190508181036000830152612c5b816128f0565b9050919050565b60006020820190508181036000830152612c7b81612913565b9050919050565b60006020820190508181036000830152612c9b81612936565b9050919050565b60006020820190508181036000830152612cbb81612959565b9050919050565b60006020820190508181036000830152612cdb8161297c565b9050919050565b60006020820190508181036000830152612cfb8161299f565b9050919050565b60006020820190508181036000830152612d1b816129c2565b9050919050565b60006020820190508181036000830152612d3b816129e5565b9050919050565b60006020820190508181036000830152612d5b81612a08565b9050919050565b60006020820190508181036000830152612d7b81612a2b565b9050919050565b60006020820190508181036000830152612d9b81612a4e565b9050919050565b6000602082019050612db76000830184612a80565b92915050565b6000604082019050612dd26000830185612a80565b612ddf6020830184612a80565b9392505050565b6000612df0612e01565b9050612dfc82826130a8565b919050565b6000604051905090565b600067ffffffffffffffff821115612e2657612e25613180565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e5257612e51613180565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e7e57612e7d613180565b5b612e87826131d1565b9050602081019050919050565b600067ffffffffffffffff821115612eaf57612eae613180565b5b612eb8826131d1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612f418261302a565b9150612f4c8361302a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f8157612f80613122565b5b828201905092915050565b6000612f978261302a565b9150612fa28361302a565b925082821015612fb557612fb4613122565b5b828203905092915050565b6000612fcb8261300a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613061578082015181840152602081019050613046565b83811115613070576000848401525b50505050565b6000600282049050600182168061308e57607f821691505b602082108114156130a2576130a1613151565b5b50919050565b6130b1826131d1565b810181811067ffffffffffffffff821117156130d0576130cf613180565b5b80604052505050565b60006130e48261302a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561311757613116613122565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156131ce5760046000803e6131cb6000516131e2565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156135dc5761365f565b6135e4612e01565b60043d036004823e80513d602482011167ffffffffffffffff8211171561360c57505061365f565b808201805167ffffffffffffffff81111561362a575050505061365f565b80602083010160043d03850181111561364757505050505061365f565b613656826020018501866130a8565b82955050505050505b90565b61366b81612fc0565b811461367657600080fd5b50565b61368281612fd2565b811461368d57600080fd5b50565b61369981612fde565b81146136a457600080fd5b50565b6136b08161302a565b81146136bb57600080fd5b5056fea2646970667358221220b03700d74c62190fd7b4135415a8a2e0e698edd25521b7e8066dda2830d1e9d564736f6c6343000804003368747470733a2f2f6170692e63727970746f696c6c756d696e6174692e6e65742f6170692f76312f63617264732f6d657461646174612d312f7b69647d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063715018a611610097578063bd85b03911610066578063bd85b039146102a8578063e985e9c5146102d8578063f242432a14610308578063f2fde38b14610324576100ff565b8063715018a614610248578063731133e9146102525780638da5cb5b1461026e578063a22cb4651461028c576100ff565b80631f7fdffa116100d35780631f7fdffa146101b05780632eb2c2d6146101cc5780634e1273f4146101e85780634f558e7914610218576100ff565b8062fdd58e1461010457806301ffc9a71461013457806302fe5305146101645780630e89341c14610180575b600080fd5b61011e600480360381019061011991906125c5565b610340565b60405161012b9190612da2565b60405180910390f35b61014e600480360381019061014991906126e8565b610409565b60405161015b9190612bc5565b60405180910390f35b61017e6004803603810190610179919061273a565b6104eb565b005b61019a6004803603810190610195919061277b565b610573565b6040516101a79190612be0565b60405180910390f35b6101ca60048036038101906101c591906124de565b610607565b005b6101e660048036038101906101e19190612390565b610695565b005b61020260048036038101906101fd919061267c565b610736565b60405161020f9190612b6c565b60405180910390f35b610232600480360381019061022d919061277b565b6108e7565b60405161023f9190612bc5565b60405180910390f35b6102506108fb565b005b61026c60048036038101906102679190612601565b610983565b005b610276610a11565b6040516102839190612a8f565b60405180910390f35b6102a660048036038101906102a19190612589565b610a3b565b005b6102c260048036038101906102bd919061277b565b610a51565b6040516102cf9190612da2565b60405180910390f35b6102f260048036038101906102ed9190612354565b610a6e565b6040516102ff9190612bc5565b60405180910390f35b610322600480360381019061031d919061244f565b610b02565b005b61033e6004803603810190610339919061232b565b610ba3565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a890612c42565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104d457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104e457506104e382610c9b565b5b9050919050565b6104f3610d05565b73ffffffffffffffffffffffffffffffffffffffff16610511610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055e90612d02565b60405180910390fd5b61057081610d0d565b50565b60606002805461058290613076565b80601f01602080910402602001604051908101604052809291908181526020018280546105ae90613076565b80156105fb5780601f106105d0576101008083540402835291602001916105fb565b820191906000526020600020905b8154815290600101906020018083116105de57829003601f168201915b50505050509050919050565b61060f610d05565b73ffffffffffffffffffffffffffffffffffffffff1661062d610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a90612d02565b60405180910390fd5b61068f84848484610d27565b50505050565b61069d610d05565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106e357506106e2856106dd610d05565b610a6e565b5b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612cc2565b60405180910390fd5b61072f8585858585610f91565b5050505050565b6060815183511461077c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077390612d42565b60405180910390fd5b6000835167ffffffffffffffff8111156107bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156107ed5781602001602082028036833780820191505090505b50905060005b84518110156108dc57610886858281518110610838577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610879577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610340565b8282815181106108bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806108d5906130d9565b90506107f3565b508091505092915050565b6000806108f383610a51565b119050919050565b610903610d05565b73ffffffffffffffffffffffffffffffffffffffff16610921610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e90612d02565b60405180910390fd5b61098160006112f1565b565b61098b610d05565b73ffffffffffffffffffffffffffffffffffffffff166109a9610a11565b73ffffffffffffffffffffffffffffffffffffffff16146109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f690612d02565b60405180910390fd5b610a0b848484846113b7565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a4d610a46610d05565b838361154d565b5050565b600060046000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b0a610d05565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f85610b4a610d05565b610a6e565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690612c82565b60405180910390fd5b610b9c85858585856116ba565b5050505050565b610bab610d05565b73ffffffffffffffffffffffffffffffffffffffff16610bc9610a11565b73ffffffffffffffffffffffffffffffffffffffff1614610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690612d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8690612c62565b60405180910390fd5b610c98816112f1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190610d23929190612023565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90612d82565b60405180910390fd5b8151835114610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612d62565b60405180910390fd5b6000610de5610d05565b9050610df68160008787878761193c565b60005b8451811015610efb57838181518110610e3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110610e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ee19190612f36565b925050819055508080610ef3906130d9565b915050610df9565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f73929190612b8e565b60405180910390a4610f8a81600087878787611952565b5050505050565b8151835114610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90612d62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90612ca2565b60405180910390fd5b600061104f610d05565b905061105f81878787878761193c565b60005b845181101561125c5760008582815181106110a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106110eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390612ce2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112419190612f36565b9250508190555050505080611255906130d9565b9050611062565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112d3929190612b8e565b60405180910390a46112e9818787878787611952565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90612d82565b60405180910390fd5b6000611431610d05565b90506114528160008761144388611b39565b61144c88611b39565b8761193c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b19190612f36565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161152f929190612dbd565b60405180910390a461154681600087878787611bff565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390612d22565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ad9190612bc5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190612ca2565b60405180910390fd5b6000611734610d05565b905061175481878761174588611b39565b61174e88611b39565b8761193c565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290612ce2565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118a09190612f36565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161191d929190612dbd565b60405180910390a4611933828888888888611bff565b50505050505050565b61194a868686868686611de6565b505050505050565b6119718473ffffffffffffffffffffffffffffffffffffffff16611ff8565b15611b31578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016119b7959493929190612aaa565b602060405180830381600087803b1580156119d157600080fd5b505af1925050508015611a0257506040513d601f19601f820116820180604052508101906119ff9190612711565b60015b611aa857611a0e6131af565b806308c379a01415611a6b5750611a236135cc565b80611a2e5750611a6d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a629190612be0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612c02565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690612c22565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115611b7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611bac5781602001602082028036833780820191505090505b5090508281600081518110611bea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b611c1e8473ffffffffffffffffffffffffffffffffffffffff16611ff8565b15611dde578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611c64959493929190612b12565b602060405180830381600087803b158015611c7e57600080fd5b505af1925050508015611caf57506040513d601f19601f82011682018060405250810190611cac9190612711565b60015b611d5557611cbb6131af565b806308c379a01415611d185750611cd06135cc565b80611cdb5750611d1a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f9190612be0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90612c02565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390612c22565b60405180910390fd5b505b505050505050565b611df486868686868661201b565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ef25760005b8351811015611ef057828181518110611e6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160046000868481518110611eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611ed89190612f36565b9250508190555080611ee9906130d9565b9050611e2c565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ff05760005b8351811015611fee57828181518110611f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160046000868481518110611fb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611fd69190612f8c565b9250508190555080611fe7906130d9565b9050611f2a565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b82805461202f90613076565b90600052602060002090601f0160209004810192826120515760008555612098565b82601f1061206a57805160ff1916838001178555612098565b82800160010185558215612098579182015b8281111561209757825182559160200191906001019061207c565b5b5090506120a591906120a9565b5090565b5b808211156120c25760008160009055506001016120aa565b5090565b60006120d96120d484612e0b565b612de6565b905080838252602082019050828560208602820111156120f857600080fd5b60005b85811015612128578161210e888261221a565b8452602084019350602083019250506001810190506120fb565b5050509392505050565b600061214561214084612e37565b612de6565b9050808382526020820190508285602086028201111561216457600080fd5b60005b85811015612194578161217a8882612316565b845260208401935060208301925050600181019050612167565b5050509392505050565b60006121b16121ac84612e63565b612de6565b9050828152602081018484840111156121c957600080fd5b6121d4848285613034565b509392505050565b60006121ef6121ea84612e94565b612de6565b90508281526020810184848401111561220757600080fd5b612212848285613034565b509392505050565b60008135905061222981613662565b92915050565b600082601f83011261224057600080fd5b81356122508482602086016120c6565b91505092915050565b600082601f83011261226a57600080fd5b813561227a848260208601612132565b91505092915050565b60008135905061229281613679565b92915050565b6000813590506122a781613690565b92915050565b6000815190506122bc81613690565b92915050565b600082601f8301126122d357600080fd5b81356122e384826020860161219e565b91505092915050565b600082601f8301126122fd57600080fd5b813561230d8482602086016121dc565b91505092915050565b600081359050612325816136a7565b92915050565b60006020828403121561233d57600080fd5b600061234b8482850161221a565b91505092915050565b6000806040838503121561236757600080fd5b60006123758582860161221a565b92505060206123868582860161221a565b9150509250929050565b600080600080600060a086880312156123a857600080fd5b60006123b68882890161221a565b95505060206123c78882890161221a565b945050604086013567ffffffffffffffff8111156123e457600080fd5b6123f088828901612259565b935050606086013567ffffffffffffffff81111561240d57600080fd5b61241988828901612259565b925050608086013567ffffffffffffffff81111561243657600080fd5b612442888289016122c2565b9150509295509295909350565b600080600080600060a0868803121561246757600080fd5b60006124758882890161221a565b95505060206124868882890161221a565b945050604061249788828901612316565b93505060606124a888828901612316565b925050608086013567ffffffffffffffff8111156124c557600080fd5b6124d1888289016122c2565b9150509295509295909350565b600080600080608085870312156124f457600080fd5b60006125028782880161221a565b945050602085013567ffffffffffffffff81111561251f57600080fd5b61252b87828801612259565b935050604085013567ffffffffffffffff81111561254857600080fd5b61255487828801612259565b925050606085013567ffffffffffffffff81111561257157600080fd5b61257d878288016122c2565b91505092959194509250565b6000806040838503121561259c57600080fd5b60006125aa8582860161221a565b92505060206125bb85828601612283565b9150509250929050565b600080604083850312156125d857600080fd5b60006125e68582860161221a565b92505060206125f785828601612316565b9150509250929050565b6000806000806080858703121561261757600080fd5b60006126258782880161221a565b945050602061263687828801612316565b935050604061264787828801612316565b925050606085013567ffffffffffffffff81111561266457600080fd5b612670878288016122c2565b91505092959194509250565b6000806040838503121561268f57600080fd5b600083013567ffffffffffffffff8111156126a957600080fd5b6126b58582860161222f565b925050602083013567ffffffffffffffff8111156126d257600080fd5b6126de85828601612259565b9150509250929050565b6000602082840312156126fa57600080fd5b600061270884828501612298565b91505092915050565b60006020828403121561272357600080fd5b6000612731848285016122ad565b91505092915050565b60006020828403121561274c57600080fd5b600082013567ffffffffffffffff81111561276657600080fd5b612772848285016122ec565b91505092915050565b60006020828403121561278d57600080fd5b600061279b84828501612316565b91505092915050565b60006127b08383612a71565b60208301905092915050565b6127c581612fc0565b82525050565b60006127d682612ed5565b6127e08185612f03565b93506127eb83612ec5565b8060005b8381101561281c57815161280388826127a4565b975061280e83612ef6565b9250506001810190506127ef565b5085935050505092915050565b61283281612fd2565b82525050565b600061284382612ee0565b61284d8185612f14565b935061285d818560208601613043565b612866816131d1565b840191505092915050565b600061287c82612eeb565b6128868185612f25565b9350612896818560208601613043565b61289f816131d1565b840191505092915050565b60006128b7603483612f25565b91506128c2826131ef565b604082019050919050565b60006128da602883612f25565b91506128e58261323e565b604082019050919050565b60006128fd602b83612f25565b91506129088261328d565b604082019050919050565b6000612920602683612f25565b915061292b826132dc565b604082019050919050565b6000612943602983612f25565b915061294e8261332b565b604082019050919050565b6000612966602583612f25565b91506129718261337a565b604082019050919050565b6000612989603283612f25565b9150612994826133c9565b604082019050919050565b60006129ac602a83612f25565b91506129b782613418565b604082019050919050565b60006129cf602083612f25565b91506129da82613467565b602082019050919050565b60006129f2602983612f25565b91506129fd82613490565b604082019050919050565b6000612a15602983612f25565b9150612a20826134df565b604082019050919050565b6000612a38602883612f25565b9150612a438261352e565b604082019050919050565b6000612a5b602183612f25565b9150612a668261357d565b604082019050919050565b612a7a8161302a565b82525050565b612a898161302a565b82525050565b6000602082019050612aa460008301846127bc565b92915050565b600060a082019050612abf60008301886127bc565b612acc60208301876127bc565b8181036040830152612ade81866127cb565b90508181036060830152612af281856127cb565b90508181036080830152612b068184612838565b90509695505050505050565b600060a082019050612b2760008301886127bc565b612b3460208301876127bc565b612b416040830186612a80565b612b4e6060830185612a80565b8181036080830152612b608184612838565b90509695505050505050565b60006020820190508181036000830152612b8681846127cb565b905092915050565b60006040820190508181036000830152612ba881856127cb565b90508181036020830152612bbc81846127cb565b90509392505050565b6000602082019050612bda6000830184612829565b92915050565b60006020820190508181036000830152612bfa8184612871565b905092915050565b60006020820190508181036000830152612c1b816128aa565b9050919050565b60006020820190508181036000830152612c3b816128cd565b9050919050565b60006020820190508181036000830152612c5b816128f0565b9050919050565b60006020820190508181036000830152612c7b81612913565b9050919050565b60006020820190508181036000830152612c9b81612936565b9050919050565b60006020820190508181036000830152612cbb81612959565b9050919050565b60006020820190508181036000830152612cdb8161297c565b9050919050565b60006020820190508181036000830152612cfb8161299f565b9050919050565b60006020820190508181036000830152612d1b816129c2565b9050919050565b60006020820190508181036000830152612d3b816129e5565b9050919050565b60006020820190508181036000830152612d5b81612a08565b9050919050565b60006020820190508181036000830152612d7b81612a2b565b9050919050565b60006020820190508181036000830152612d9b81612a4e565b9050919050565b6000602082019050612db76000830184612a80565b92915050565b6000604082019050612dd26000830185612a80565b612ddf6020830184612a80565b9392505050565b6000612df0612e01565b9050612dfc82826130a8565b919050565b6000604051905090565b600067ffffffffffffffff821115612e2657612e25613180565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e5257612e51613180565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e7e57612e7d613180565b5b612e87826131d1565b9050602081019050919050565b600067ffffffffffffffff821115612eaf57612eae613180565b5b612eb8826131d1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612f418261302a565b9150612f4c8361302a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f8157612f80613122565b5b828201905092915050565b6000612f978261302a565b9150612fa28361302a565b925082821015612fb557612fb4613122565b5b828203905092915050565b6000612fcb8261300a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613061578082015181840152602081019050613046565b83811115613070576000848401525b50505050565b6000600282049050600182168061308e57607f821691505b602082108114156130a2576130a1613151565b5b50919050565b6130b1826131d1565b810181811067ffffffffffffffff821117156130d0576130cf613180565b5b80604052505050565b60006130e48261302a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561311757613116613122565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156131ce5760046000803e6131cb6000516131e2565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156135dc5761365f565b6135e4612e01565b60043d036004823e80513d602482011167ffffffffffffffff8211171561360c57505061365f565b808201805167ffffffffffffffff81111561362a575050505061365f565b80602083010160043d03850181111561364757505050505061365f565b613656826020018501866130a8565b82955050505050505b90565b61366b81612fc0565b811461367657600080fd5b50565b61368281612fd2565b811461368d57600080fd5b50565b61369981612fde565b81146136a457600080fd5b50565b6136b08161302a565b81146136bb57600080fd5b5056fea2646970667358221220b03700d74c62190fd7b4135415a8a2e0e698edd25521b7e8066dda2830d1e9d564736f6c63430008040033

Deployed Bytecode Sourcemap

38891:1016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20980:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20003:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39070:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20724:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39344:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22919:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21377:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37957:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36200:103;;;:::i;:::-;;39167:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35549:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21974:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37746:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22201:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22441:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36458:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20980:231;21066:7;21113:1;21094:21;;:7;:21;;;;21086:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21181:9;:13;21191:2;21181:13;;;;;;;;;;;:22;21195:7;21181:22;;;;;;;;;;;;;;;;21174:29;;20980:231;;;;:::o;20003:310::-;20105:4;20157:26;20142:41;;;:11;:41;;;;:110;;;;20215:37;20200:52;;;:11;:52;;;;20142:110;:163;;;;20269:36;20293:11;20269:23;:36::i;:::-;20142:163;20122:183;;20003:310;;;:::o;39070:89::-;35780:12;:10;:12::i;:::-;35769:23;;:7;:5;:7::i;:::-;:23;;;35761:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39136:15:::1;39144:6;39136:7;:15::i;:::-;39070:89:::0;:::o;20724:105::-;20784:13;20817:4;20810:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20724:105;;;:::o;39344:191::-;35780:12;:10;:12::i;:::-;35769:23;;:7;:5;:7::i;:::-;:23;;;35761:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39493:34:::1;39504:2;39508:3;39513:7;39522:4;39493:10;:34::i;:::-;39344:191:::0;;;;:::o;22919:442::-;23160:12;:10;:12::i;:::-;23152:20;;:4;:20;;;:60;;;;23176:36;23193:4;23199:12;:10;:12::i;:::-;23176:16;:36::i;:::-;23152:60;23130:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;23301:52;23324:4;23330:2;23334:3;23339:7;23348:4;23301:22;:52::i;:::-;22919:442;;;;;:::o;21377:524::-;21533:16;21594:3;:10;21575:8;:15;:29;21567:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;21663:30;21710:8;:15;21696:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21663:63;;21744:9;21739:122;21763:8;:15;21759:1;:19;21739:122;;;21819:30;21829:8;21838:1;21829:11;;;;;;;;;;;;;;;;;;;;;;21842:3;21846:1;21842:6;;;;;;;;;;;;;;;;;;;;;;21819:9;:30::i;:::-;21800:13;21814:1;21800:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;21780:3;;;;:::i;:::-;;;21739:122;;;;21880:13;21873:20;;;21377:524;;;;:::o;37957:122::-;38014:4;38070:1;38038:29;38064:2;38038:25;:29::i;:::-;:33;38031:40;;37957:122;;;:::o;36200:103::-;35780:12;:10;:12::i;:::-;35769:23;;:7;:5;:7::i;:::-;:23;;;35761:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36265:30:::1;36292:1;36265:18;:30::i;:::-;36200:103::o:0;39167:169::-;35780:12;:10;:12::i;:::-;35769:23;;:7;:5;:7::i;:::-;:23;;;35761:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39296:32:::1;39302:7;39311:2;39315:6;39323:4;39296:5;:32::i;:::-;39167:169:::0;;;;:::o;35549:87::-;35595:7;35622:6;;;;;;;;;;;35615:13;;35549:87;:::o;21974:155::-;22069:52;22088:12;:10;:12::i;:::-;22102:8;22112;22069:18;:52::i;:::-;21974:155;;:::o;37746:113::-;37808:7;37835:12;:16;37848:2;37835:16;;;;;;;;;;;;37828:23;;37746:113;;;:::o;22201:168::-;22300:4;22324:18;:27;22343:7;22324:27;;;;;;;;;;;;;;;:37;22352:8;22324:37;;;;;;;;;;;;;;;;;;;;;;;;;22317:44;;22201:168;;;;:::o;22441:401::-;22657:12;:10;:12::i;:::-;22649:20;;:4;:20;;;:60;;;;22673:36;22690:4;22696:12;:10;:12::i;:::-;22673:16;:36::i;:::-;22649:60;22627:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;22789:45;22807:4;22813:2;22817;22821:6;22829:4;22789:17;:45::i;:::-;22441:401;;;;;:::o;36458:201::-;35780:12;:10;:12::i;:::-;35769:23;;:7;:5;:7::i;:::-;:23;;;35761:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36567:1:::1;36547:22;;:8;:22;;;;36539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36623:28;36642:8;36623:18;:28::i;:::-;36458:201:::0;:::o;18758:157::-;18843:4;18882:25;18867:40;;;:11;:40;;;;18860:47;;18758:157;;;:::o;17675:98::-;17728:7;17755:10;17748:17;;17675:98;:::o;26921:88::-;26995:6;26988:4;:13;;;;;;;;;;;;:::i;:::-;;26921:88;:::o;28320:735::-;28512:1;28498:16;;:2;:16;;;;28490:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28585:7;:14;28571:3;:10;:28;28563:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28657:16;28676:12;:10;:12::i;:::-;28657:31;;28701:66;28722:8;28740:1;28744:2;28748:3;28753:7;28762:4;28701:20;:66::i;:::-;28785:9;28780:103;28804:3;:10;28800:1;:14;28780:103;;;28861:7;28869:1;28861:10;;;;;;;;;;;;;;;;;;;;;;28836:9;:17;28846:3;28850:1;28846:6;;;;;;;;;;;;;;;;;;;;;;28836:17;;;;;;;;;;;:21;28854:2;28836:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;28816:3;;;;;:::i;:::-;;;;28780:103;;;;28936:2;28900:53;;28932:1;28900:53;;28914:8;28900:53;;;28940:3;28945:7;28900:53;;;;;;;:::i;:::-;;;;;;;;28966:81;29002:8;29020:1;29024:2;29028:3;29033:7;29042:4;28966:35;:81::i;:::-;28320:735;;;;;:::o;25003:1074::-;25230:7;:14;25216:3;:10;:28;25208:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25322:1;25308:16;;:2;:16;;;;25300:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25379:16;25398:12;:10;:12::i;:::-;25379:31;;25423:60;25444:8;25454:4;25460:2;25464:3;25469:7;25478:4;25423:20;:60::i;:::-;25501:9;25496:421;25520:3;:10;25516:1;:14;25496:421;;;25552:10;25565:3;25569:1;25565:6;;;;;;;;;;;;;;;;;;;;;;25552:19;;25586:14;25603:7;25611:1;25603:10;;;;;;;;;;;;;;;;;;;;;;25586:27;;25630:19;25652:9;:13;25662:2;25652:13;;;;;;;;;;;:19;25666:4;25652:19;;;;;;;;;;;;;;;;25630:41;;25709:6;25694:11;:21;;25686:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25842:6;25828:11;:20;25806:9;:13;25816:2;25806:13;;;;;;;;;;;:19;25820:4;25806:19;;;;;;;;;;;;;;;:42;;;;25899:6;25878:9;:13;25888:2;25878:13;;;;;;;;;;;:17;25892:2;25878:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25496:421;;;25532:3;;;;:::i;:::-;;;25496:421;;;;25964:2;25934:47;;25958:4;25934:47;;25948:8;25934:47;;;25968:3;25973:7;25934:47;;;;;;;:::i;:::-;;;;;;;;25994:75;26030:8;26040:4;26046:2;26050:3;26055:7;26064:4;25994:35;:75::i;:::-;25003:1074;;;;;;:::o;36819:191::-;36893:16;36912:6;;;;;;;;;;;36893:25;;36938:8;36929:6;;:17;;;;;;;;;;;;;;;;;;36993:8;36962:40;;36983:8;36962:40;;;;;;;;;;;;36819:191;;:::o;27395:569::-;27562:1;27548:16;;:2;:16;;;;27540:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27615:16;27634:12;:10;:12::i;:::-;27615:31;;27659:102;27680:8;27698:1;27702:2;27706:21;27724:2;27706:17;:21::i;:::-;27729:25;27747:6;27729:17;:25::i;:::-;27756:4;27659:20;:102::i;:::-;27795:6;27774:9;:13;27784:2;27774:13;;;;;;;;;;;:17;27788:2;27774:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27854:2;27817:52;;27850:1;27817:52;;27832:8;27817:52;;;27858:2;27862:6;27817:52;;;;;;;:::i;:::-;;;;;;;;27882:74;27913:8;27931:1;27935:2;27939;27943:6;27951:4;27882:30;:74::i;:::-;27395:569;;;;;:::o;31189:331::-;31344:8;31335:17;;:5;:17;;;;31327:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31447:8;31409:18;:25;31428:5;31409:25;;;;;;;;;;;;;;;:35;31435:8;31409:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31493:8;31471:41;;31486:5;31471:41;;;31503:8;31471:41;;;;;;:::i;:::-;;;;;;;;31189:331;;;:::o;23825:820::-;24027:1;24013:16;;:2;:16;;;;24005:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24084:16;24103:12;:10;:12::i;:::-;24084:31;;24128:96;24149:8;24159:4;24165:2;24169:21;24187:2;24169:17;:21::i;:::-;24192:25;24210:6;24192:17;:25::i;:::-;24219:4;24128:20;:96::i;:::-;24237:19;24259:9;:13;24269:2;24259:13;;;;;;;;;;;:19;24273:4;24259:19;;;;;;;;;;;;;;;;24237:41;;24312:6;24297:11;:21;;24289:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24437:6;24423:11;:20;24401:9;:13;24411:2;24401:13;;;;;;;;;;;:19;24415:4;24401:19;;;;;;;;;;;;;;;:42;;;;24486:6;24465:9;:13;24475:2;24465:13;;;;;;;;;;;:17;24479:2;24465:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24541:2;24510:46;;24535:4;24510:46;;24525:8;24510:46;;;24545:2;24549:6;24510:46;;;;;;;:::i;:::-;;;;;;;;24569:68;24600:8;24610:4;24616:2;24620;24624:6;24632:4;24569:30;:68::i;:::-;23825:820;;;;;;;:::o;39613:291::-;39830:66;39857:8;39867:4;39873:2;39877:3;39882:7;39891:4;39830:26;:66::i;:::-;39613:291;;;;;;:::o;33457:813::-;33697:15;:2;:13;;;:15::i;:::-;33693:570;;;33750:2;33733:43;;;33777:8;33787:4;33793:3;33798:7;33807:4;33733:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33729:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;34125:6;34118:14;;;;;;;;;;;:::i;:::-;;;;;;;;33729:523;;;34174:62;;;;;;;;;;:::i;:::-;;;;;;;;33729:523;33906:48;;;33894:60;;;:8;:60;;;;33890:159;;33979:50;;;;;;;;;;:::i;:::-;;;;;;;;33890:159;33813:251;33693:570;33457:813;;;;;;:::o;34278:198::-;34344:16;34373:22;34412:1;34398:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34373:41;;34436:7;34425:5;34431:1;34425:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;34463:5;34456:12;;;34278:198;;;:::o;32705:744::-;32920:15;:2;:13;;;:15::i;:::-;32916:526;;;32973:2;32956:38;;;32995:8;33005:4;33011:2;33015:6;33023:4;32956:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32952:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33304:6;33297:14;;;;;;;;;;;:::i;:::-;;;;;;;;32952:479;;;33353:62;;;;;;;;;;:::i;:::-;;;;;;;;32952:479;33090:43;;;33078:55;;;:8;:55;;;;33074:154;;33158:50;;;;;;;;;;:::i;:::-;;;;;;;;33074:154;33029:214;32916:526;32705:744;;;;;;:::o;38154:655::-;38393:66;38420:8;38430:4;38436:2;38440:3;38445:7;38454:4;38393:26;:66::i;:::-;38492:1;38476:18;;:4;:18;;;38472:160;;;38516:9;38511:110;38535:3;:10;38531:1;:14;38511:110;;;38595:7;38603:1;38595:10;;;;;;;;;;;;;;;;;;;;;;38571:12;:20;38584:3;38588:1;38584:6;;;;;;;;;;;;;;;;;;;;;;38571:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;38547:3;;;;:::i;:::-;;;38511:110;;;;38472:160;38662:1;38648:16;;:2;:16;;;38644:158;;;38686:9;38681:110;38705:3;:10;38701:1;:14;38681:110;;;38765:7;38773:1;38765:10;;;;;;;;;;;;;;;;;;;;;;38741:12;:20;38754:3;38758:1;38754:6;;;;;;;;;;;;;;;;;;;;;;38741:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;38717:3;;;;:::i;:::-;;;38681:110;;;;38644:158;38154:655;;;;;;:::o;9720:326::-;9780:4;10037:1;10015:7;:19;;;:23;10008:30;;9720:326;;;:::o;32476:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;3050:86;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3204:79;;;;:::o;3302:271::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:2;;3424:1;3421;3414:12;3373:2;3464:6;3451:20;3489:78;3563:3;3555:6;3548:4;3540:6;3536:17;3489:78;:::i;:::-;3480:87;;3363:210;;;;;:::o;3593:273::-;3649:5;3698:3;3691:4;3683:6;3679:17;3675:27;3665:2;;3716:1;3713;3706:12;3665:2;3756:6;3743:20;3781:79;3856:3;3848:6;3841:4;3833:6;3829:17;3781:79;:::i;:::-;3772:88;;3655:211;;;;;:::o;3872:139::-;3918:5;3956:6;3943:20;3934:29;;3972:33;3999:5;3972:33;:::i;:::-;3924:87;;;;:::o;4017:262::-;4076:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:2;;;4141:1;4138;4131:12;4093:2;4184:1;4209:53;4254:7;4245:6;4234:9;4230:22;4209:53;:::i;:::-;4199:63;;4155:117;4083:196;;;;:::o;4285:407::-;4353:6;4361;4410:2;4398:9;4389:7;4385:23;4381:32;4378:2;;;4426:1;4423;4416:12;4378:2;4469:1;4494:53;4539:7;4530:6;4519:9;4515:22;4494:53;:::i;:::-;4484:63;;4440:117;4596:2;4622:53;4667:7;4658:6;4647:9;4643:22;4622:53;:::i;:::-;4612:63;;4567:118;4368:324;;;;;:::o;4698:1241::-;4852:6;4860;4868;4876;4884;4933:3;4921:9;4912:7;4908:23;4904:33;4901:2;;;4950:1;4947;4940:12;4901:2;4993:1;5018:53;5063:7;5054:6;5043:9;5039:22;5018:53;:::i;:::-;5008:63;;4964:117;5120:2;5146:53;5191:7;5182:6;5171:9;5167:22;5146:53;:::i;:::-;5136:63;;5091:118;5276:2;5265:9;5261:18;5248:32;5307:18;5299:6;5296:30;5293:2;;;5339:1;5336;5329:12;5293:2;5367:78;5437:7;5428:6;5417:9;5413:22;5367:78;:::i;:::-;5357:88;;5219:236;5522:2;5511:9;5507:18;5494:32;5553:18;5545:6;5542:30;5539:2;;;5585:1;5582;5575:12;5539:2;5613:78;5683:7;5674:6;5663:9;5659:22;5613:78;:::i;:::-;5603:88;;5465:236;5768:3;5757:9;5753:19;5740:33;5800:18;5792:6;5789:30;5786:2;;;5832:1;5829;5822:12;5786:2;5860:62;5914:7;5905:6;5894:9;5890:22;5860:62;:::i;:::-;5850:72;;5711:221;4891:1048;;;;;;;;:::o;5945:955::-;6049:6;6057;6065;6073;6081;6130:3;6118:9;6109:7;6105:23;6101:33;6098:2;;;6147:1;6144;6137:12;6098:2;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:53;6388:7;6379:6;6368:9;6364:22;6343:53;:::i;:::-;6333:63;;6288:118;6445:2;6471:53;6516:7;6507:6;6496:9;6492:22;6471:53;:::i;:::-;6461:63;;6416:118;6573:2;6599:53;6644:7;6635:6;6624:9;6620:22;6599:53;:::i;:::-;6589:63;;6544:118;6729:3;6718:9;6714:19;6701:33;6761:18;6753:6;6750:30;6747:2;;;6793:1;6790;6783:12;6747:2;6821:62;6875:7;6866:6;6855:9;6851:22;6821:62;:::i;:::-;6811:72;;6672:221;6088:812;;;;;;;;:::o;6906:1095::-;7051:6;7059;7067;7075;7124:3;7112:9;7103:7;7099:23;7095:33;7092:2;;;7141:1;7138;7131:12;7092:2;7184:1;7209:53;7254:7;7245:6;7234:9;7230:22;7209:53;:::i;:::-;7199:63;;7155:117;7339:2;7328:9;7324:18;7311:32;7370:18;7362:6;7359:30;7356:2;;;7402:1;7399;7392:12;7356:2;7430:78;7500:7;7491:6;7480:9;7476:22;7430:78;:::i;:::-;7420:88;;7282:236;7585:2;7574:9;7570:18;7557:32;7616:18;7608:6;7605:30;7602:2;;;7648:1;7645;7638:12;7602:2;7676:78;7746:7;7737:6;7726:9;7722:22;7676:78;:::i;:::-;7666:88;;7528:236;7831:2;7820:9;7816:18;7803:32;7862:18;7854:6;7851:30;7848:2;;;7894:1;7891;7884:12;7848:2;7922:62;7976:7;7967:6;7956:9;7952:22;7922:62;:::i;:::-;7912:72;;7774:220;7082:919;;;;;;;:::o;8007:401::-;8072:6;8080;8129:2;8117:9;8108:7;8104:23;8100:32;8097:2;;;8145:1;8142;8135:12;8097:2;8188:1;8213:53;8258:7;8249:6;8238:9;8234:22;8213:53;:::i;:::-;8203:63;;8159:117;8315:2;8341:50;8383:7;8374:6;8363:9;8359:22;8341:50;:::i;:::-;8331:60;;8286:115;8087:321;;;;;:::o;8414:407::-;8482:6;8490;8539:2;8527:9;8518:7;8514:23;8510:32;8507:2;;;8555:1;8552;8545:12;8507:2;8598:1;8623:53;8668:7;8659:6;8648:9;8644:22;8623:53;:::i;:::-;8613:63;;8569:117;8725:2;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8696:118;8497:324;;;;;:::o;8827:809::-;8922:6;8930;8938;8946;8995:3;8983:9;8974:7;8970:23;8966:33;8963:2;;;9012:1;9009;9002:12;8963:2;9055:1;9080:53;9125:7;9116:6;9105:9;9101:22;9080:53;:::i;:::-;9070:63;;9026:117;9182:2;9208:53;9253:7;9244:6;9233:9;9229:22;9208:53;:::i;:::-;9198:63;;9153:118;9310:2;9336:53;9381:7;9372:6;9361:9;9357:22;9336:53;:::i;:::-;9326:63;;9281:118;9466:2;9455:9;9451:18;9438:32;9497:18;9489:6;9486:30;9483:2;;;9529:1;9526;9519:12;9483:2;9557:62;9611:7;9602:6;9591:9;9587:22;9557:62;:::i;:::-;9547:72;;9409:220;8953:683;;;;;;;:::o;9642:693::-;9760:6;9768;9817:2;9805:9;9796:7;9792:23;9788:32;9785:2;;;9833:1;9830;9823:12;9785:2;9904:1;9893:9;9889:17;9876:31;9934:18;9926:6;9923:30;9920:2;;;9966:1;9963;9956:12;9920:2;9994:78;10064:7;10055:6;10044:9;10040:22;9994:78;:::i;:::-;9984:88;;9847:235;10149:2;10138:9;10134:18;10121:32;10180:18;10172:6;10169:30;10166:2;;;10212:1;10209;10202:12;10166:2;10240:78;10310:7;10301:6;10290:9;10286:22;10240:78;:::i;:::-;10230:88;;10092:236;9775:560;;;;;:::o;10341:260::-;10399:6;10448:2;10436:9;10427:7;10423:23;10419:32;10416:2;;;10464:1;10461;10454:12;10416:2;10507:1;10532:52;10576:7;10567:6;10556:9;10552:22;10532:52;:::i;:::-;10522:62;;10478:116;10406:195;;;;:::o;10607:282::-;10676:6;10725:2;10713:9;10704:7;10700:23;10696:32;10693:2;;;10741:1;10738;10731:12;10693:2;10784:1;10809:63;10864:7;10855:6;10844:9;10840:22;10809:63;:::i;:::-;10799:73;;10755:127;10683:206;;;;:::o;10895:375::-;10964:6;11013:2;11001:9;10992:7;10988:23;10984:32;10981:2;;;11029:1;11026;11019:12;10981:2;11100:1;11089:9;11085:17;11072:31;11130:18;11122:6;11119:30;11116:2;;;11162:1;11159;11152:12;11116:2;11190:63;11245:7;11236:6;11225:9;11221:22;11190:63;:::i;:::-;11180:73;;11043:220;10971:299;;;;:::o;11276:262::-;11335:6;11384:2;11372:9;11363:7;11359:23;11355:32;11352:2;;;11400:1;11397;11390:12;11352:2;11443:1;11468:53;11513:7;11504:6;11493:9;11489:22;11468:53;:::i;:::-;11458:63;;11414:117;11342:196;;;;:::o;11544:179::-;11613:10;11634:46;11676:3;11668:6;11634:46;:::i;:::-;11712:4;11707:3;11703:14;11689:28;;11624:99;;;;:::o;11729:118::-;11816:24;11834:5;11816:24;:::i;:::-;11811:3;11804:37;11794:53;;:::o;11883:732::-;12002:3;12031:54;12079:5;12031:54;:::i;:::-;12101:86;12180:6;12175:3;12101:86;:::i;:::-;12094:93;;12211:56;12261:5;12211:56;:::i;:::-;12290:7;12321:1;12306:284;12331:6;12328:1;12325:13;12306:284;;;12407:6;12401:13;12434:63;12493:3;12478:13;12434:63;:::i;:::-;12427:70;;12520:60;12573:6;12520:60;:::i;:::-;12510:70;;12366:224;12353:1;12350;12346:9;12341:14;;12306:284;;;12310:14;12606:3;12599:10;;12007:608;;;;;;;:::o;12621:109::-;12702:21;12717:5;12702:21;:::i;:::-;12697:3;12690:34;12680:50;;:::o;12736:360::-;12822:3;12850:38;12882:5;12850:38;:::i;:::-;12904:70;12967:6;12962:3;12904:70;:::i;:::-;12897:77;;12983:52;13028:6;13023:3;13016:4;13009:5;13005:16;12983:52;:::i;:::-;13060:29;13082:6;13060:29;:::i;:::-;13055:3;13051:39;13044:46;;12826:270;;;;;:::o;13102:364::-;13190:3;13218:39;13251:5;13218:39;:::i;:::-;13273:71;13337:6;13332:3;13273:71;:::i;:::-;13266:78;;13353:52;13398:6;13393:3;13386:4;13379:5;13375:16;13353:52;:::i;:::-;13430:29;13452:6;13430:29;:::i;:::-;13425:3;13421:39;13414:46;;13194:272;;;;;:::o;13472:366::-;13614:3;13635:67;13699:2;13694:3;13635:67;:::i;:::-;13628:74;;13711:93;13800:3;13711:93;:::i;:::-;13829:2;13824:3;13820:12;13813:19;;13618:220;;;:::o;13844:366::-;13986:3;14007:67;14071:2;14066:3;14007:67;:::i;:::-;14000:74;;14083:93;14172:3;14083:93;:::i;:::-;14201:2;14196:3;14192:12;14185:19;;13990:220;;;:::o;14216:366::-;14358:3;14379:67;14443:2;14438:3;14379:67;:::i;:::-;14372:74;;14455:93;14544:3;14455:93;:::i;:::-;14573:2;14568:3;14564:12;14557:19;;14362:220;;;:::o;14588:366::-;14730:3;14751:67;14815:2;14810:3;14751:67;:::i;:::-;14744:74;;14827:93;14916:3;14827:93;:::i;:::-;14945:2;14940:3;14936:12;14929:19;;14734:220;;;:::o;14960:366::-;15102:3;15123:67;15187:2;15182:3;15123:67;:::i;:::-;15116:74;;15199:93;15288:3;15199:93;:::i;:::-;15317:2;15312:3;15308:12;15301:19;;15106:220;;;:::o;15332:366::-;15474:3;15495:67;15559:2;15554:3;15495:67;:::i;:::-;15488:74;;15571:93;15660:3;15571:93;:::i;:::-;15689:2;15684:3;15680:12;15673:19;;15478:220;;;:::o;15704:366::-;15846:3;15867:67;15931:2;15926:3;15867:67;:::i;:::-;15860:74;;15943:93;16032:3;15943:93;:::i;:::-;16061:2;16056:3;16052:12;16045:19;;15850:220;;;:::o;16076:366::-;16218:3;16239:67;16303:2;16298:3;16239:67;:::i;:::-;16232:74;;16315:93;16404:3;16315:93;:::i;:::-;16433:2;16428:3;16424:12;16417:19;;16222:220;;;:::o;16448:366::-;16590:3;16611:67;16675:2;16670:3;16611:67;:::i;:::-;16604:74;;16687:93;16776:3;16687:93;:::i;:::-;16805:2;16800:3;16796:12;16789:19;;16594:220;;;:::o;16820:366::-;16962:3;16983:67;17047:2;17042:3;16983:67;:::i;:::-;16976:74;;17059:93;17148:3;17059:93;:::i;:::-;17177:2;17172:3;17168:12;17161:19;;16966:220;;;:::o;17192:366::-;17334:3;17355:67;17419:2;17414:3;17355:67;:::i;:::-;17348:74;;17431:93;17520:3;17431:93;:::i;:::-;17549:2;17544:3;17540:12;17533:19;;17338:220;;;:::o;17564:366::-;17706:3;17727:67;17791:2;17786:3;17727:67;:::i;:::-;17720:74;;17803:93;17892:3;17803:93;:::i;:::-;17921:2;17916:3;17912:12;17905:19;;17710:220;;;:::o;17936:366::-;18078:3;18099:67;18163:2;18158:3;18099:67;:::i;:::-;18092:74;;18175:93;18264:3;18175:93;:::i;:::-;18293:2;18288:3;18284:12;18277:19;;18082:220;;;:::o;18308:108::-;18385:24;18403:5;18385:24;:::i;:::-;18380:3;18373:37;18363:53;;:::o;18422:118::-;18509:24;18527:5;18509:24;:::i;:::-;18504:3;18497:37;18487:53;;:::o;18546:222::-;18639:4;18677:2;18666:9;18662:18;18654:26;;18690:71;18758:1;18747:9;18743:17;18734:6;18690:71;:::i;:::-;18644:124;;;;:::o;18774:1053::-;19097:4;19135:3;19124:9;19120:19;19112:27;;19149:71;19217:1;19206:9;19202:17;19193:6;19149:71;:::i;:::-;19230:72;19298:2;19287:9;19283:18;19274:6;19230:72;:::i;:::-;19349:9;19343:4;19339:20;19334:2;19323:9;19319:18;19312:48;19377:108;19480:4;19471:6;19377:108;:::i;:::-;19369:116;;19532:9;19526:4;19522:20;19517:2;19506:9;19502:18;19495:48;19560:108;19663:4;19654:6;19560:108;:::i;:::-;19552:116;;19716:9;19710:4;19706:20;19700:3;19689:9;19685:19;19678:49;19744:76;19815:4;19806:6;19744:76;:::i;:::-;19736:84;;19102:725;;;;;;;;:::o;19833:751::-;20056:4;20094:3;20083:9;20079:19;20071:27;;20108:71;20176:1;20165:9;20161:17;20152:6;20108:71;:::i;:::-;20189:72;20257:2;20246:9;20242:18;20233:6;20189:72;:::i;:::-;20271;20339:2;20328:9;20324:18;20315:6;20271:72;:::i;:::-;20353;20421:2;20410:9;20406:18;20397:6;20353:72;:::i;:::-;20473:9;20467:4;20463:20;20457:3;20446:9;20442:19;20435:49;20501:76;20572:4;20563:6;20501:76;:::i;:::-;20493:84;;20061:523;;;;;;;;:::o;20590:373::-;20733:4;20771:2;20760:9;20756:18;20748:26;;20820:9;20814:4;20810:20;20806:1;20795:9;20791:17;20784:47;20848:108;20951:4;20942:6;20848:108;:::i;:::-;20840:116;;20738:225;;;;:::o;20969:634::-;21190:4;21228:2;21217:9;21213:18;21205:26;;21277:9;21271:4;21267:20;21263:1;21252:9;21248:17;21241:47;21305:108;21408:4;21399:6;21305:108;:::i;:::-;21297:116;;21460:9;21454:4;21450:20;21445:2;21434:9;21430:18;21423:48;21488:108;21591:4;21582:6;21488:108;:::i;:::-;21480:116;;21195:408;;;;;:::o;21609:210::-;21696:4;21734:2;21723:9;21719:18;21711:26;;21747:65;21809:1;21798:9;21794:17;21785:6;21747:65;:::i;:::-;21701:118;;;;:::o;21825:313::-;21938:4;21976:2;21965:9;21961:18;21953:26;;22025:9;22019:4;22015:20;22011:1;22000:9;21996:17;21989:47;22053:78;22126:4;22117:6;22053:78;:::i;:::-;22045:86;;21943:195;;;;:::o;22144:419::-;22310:4;22348:2;22337:9;22333:18;22325:26;;22397:9;22391:4;22387:20;22383:1;22372:9;22368:17;22361:47;22425:131;22551:4;22425:131;:::i;:::-;22417:139;;22315:248;;;:::o;22569:419::-;22735:4;22773:2;22762:9;22758:18;22750:26;;22822:9;22816:4;22812:20;22808:1;22797:9;22793:17;22786:47;22850:131;22976:4;22850:131;:::i;:::-;22842:139;;22740:248;;;:::o;22994:419::-;23160:4;23198:2;23187:9;23183:18;23175:26;;23247:9;23241:4;23237:20;23233:1;23222:9;23218:17;23211:47;23275:131;23401:4;23275:131;:::i;:::-;23267:139;;23165:248;;;:::o;23419:419::-;23585:4;23623:2;23612:9;23608:18;23600:26;;23672:9;23666:4;23662:20;23658:1;23647:9;23643:17;23636:47;23700:131;23826:4;23700:131;:::i;:::-;23692:139;;23590:248;;;:::o;23844:419::-;24010:4;24048:2;24037:9;24033:18;24025:26;;24097:9;24091:4;24087:20;24083:1;24072:9;24068:17;24061:47;24125:131;24251:4;24125:131;:::i;:::-;24117:139;;24015:248;;;:::o;24269:419::-;24435:4;24473:2;24462:9;24458:18;24450:26;;24522:9;24516:4;24512:20;24508:1;24497:9;24493:17;24486:47;24550:131;24676:4;24550:131;:::i;:::-;24542:139;;24440:248;;;:::o;24694:419::-;24860:4;24898:2;24887:9;24883:18;24875:26;;24947:9;24941:4;24937:20;24933:1;24922:9;24918:17;24911:47;24975:131;25101:4;24975:131;:::i;:::-;24967:139;;24865:248;;;:::o;25119:419::-;25285:4;25323:2;25312:9;25308:18;25300:26;;25372:9;25366:4;25362:20;25358:1;25347:9;25343:17;25336:47;25400:131;25526:4;25400:131;:::i;:::-;25392:139;;25290:248;;;:::o;25544:419::-;25710:4;25748:2;25737:9;25733:18;25725:26;;25797:9;25791:4;25787:20;25783:1;25772:9;25768:17;25761:47;25825:131;25951:4;25825:131;:::i;:::-;25817:139;;25715:248;;;:::o;25969:419::-;26135:4;26173:2;26162:9;26158:18;26150:26;;26222:9;26216:4;26212:20;26208:1;26197:9;26193:17;26186:47;26250:131;26376:4;26250:131;:::i;:::-;26242:139;;26140:248;;;:::o;26394:419::-;26560:4;26598:2;26587:9;26583:18;26575:26;;26647:9;26641:4;26637:20;26633:1;26622:9;26618:17;26611:47;26675:131;26801:4;26675:131;:::i;:::-;26667:139;;26565:248;;;:::o;26819:419::-;26985:4;27023:2;27012:9;27008:18;27000:26;;27072:9;27066:4;27062:20;27058:1;27047:9;27043:17;27036:47;27100:131;27226:4;27100:131;:::i;:::-;27092:139;;26990:248;;;:::o;27244:419::-;27410:4;27448:2;27437:9;27433:18;27425:26;;27497:9;27491:4;27487:20;27483:1;27472:9;27468:17;27461:47;27525:131;27651:4;27525:131;:::i;:::-;27517:139;;27415:248;;;:::o;27669:222::-;27762:4;27800:2;27789:9;27785:18;27777:26;;27813:71;27881:1;27870:9;27866:17;27857:6;27813:71;:::i;:::-;27767:124;;;;:::o;27897:332::-;28018:4;28056:2;28045:9;28041:18;28033:26;;28069:71;28137:1;28126:9;28122:17;28113:6;28069:71;:::i;:::-;28150:72;28218:2;28207:9;28203:18;28194:6;28150:72;:::i;:::-;28023:206;;;;;:::o;28235:129::-;28269:6;28296:20;;:::i;:::-;28286:30;;28325:33;28353:4;28345:6;28325:33;:::i;:::-;28276:88;;;:::o;28370:75::-;28403:6;28436:2;28430:9;28420:19;;28410:35;:::o;28451:311::-;28528:4;28618:18;28610:6;28607:30;28604:2;;;28640:18;;:::i;:::-;28604:2;28690:4;28682:6;28678:17;28670:25;;28750:4;28744;28740:15;28732:23;;28533:229;;;:::o;28768:311::-;28845:4;28935:18;28927:6;28924:30;28921:2;;;28957:18;;:::i;:::-;28921:2;29007:4;28999:6;28995:17;28987:25;;29067:4;29061;29057:15;29049:23;;28850:229;;;:::o;29085:307::-;29146:4;29236:18;29228:6;29225:30;29222:2;;;29258:18;;:::i;:::-;29222:2;29296:29;29318:6;29296:29;:::i;:::-;29288:37;;29380:4;29374;29370:15;29362:23;;29151:241;;;:::o;29398:308::-;29460:4;29550:18;29542:6;29539:30;29536:2;;;29572:18;;:::i;:::-;29536:2;29610:29;29632:6;29610:29;:::i;:::-;29602:37;;29694:4;29688;29684:15;29676:23;;29465:241;;;:::o;29712:132::-;29779:4;29802:3;29794:11;;29832:4;29827:3;29823:14;29815:22;;29784:60;;;:::o;29850:114::-;29917:6;29951:5;29945:12;29935:22;;29924:40;;;:::o;29970:98::-;30021:6;30055:5;30049:12;30039:22;;30028:40;;;:::o;30074:99::-;30126:6;30160:5;30154:12;30144:22;;30133:40;;;:::o;30179:113::-;30249:4;30281;30276:3;30272:14;30264:22;;30254:38;;;:::o;30298:184::-;30397:11;30431:6;30426:3;30419:19;30471:4;30466:3;30462:14;30447:29;;30409:73;;;;:::o;30488:168::-;30571:11;30605:6;30600:3;30593:19;30645:4;30640:3;30636:14;30621:29;;30583:73;;;;:::o;30662:169::-;30746:11;30780:6;30775:3;30768:19;30820:4;30815:3;30811:14;30796:29;;30758:73;;;;:::o;30837:305::-;30877:3;30896:20;30914:1;30896:20;:::i;:::-;30891:25;;30930:20;30948:1;30930:20;:::i;:::-;30925:25;;31084:1;31016:66;31012:74;31009:1;31006:81;31003:2;;;31090:18;;:::i;:::-;31003:2;31134:1;31131;31127:9;31120:16;;30881:261;;;;:::o;31148:191::-;31188:4;31208:20;31226:1;31208:20;:::i;:::-;31203:25;;31242:20;31260:1;31242:20;:::i;:::-;31237:25;;31281:1;31278;31275:8;31272:2;;;31286:18;;:::i;:::-;31272:2;31331:1;31328;31324:9;31316:17;;31193:146;;;;:::o;31345:96::-;31382:7;31411:24;31429:5;31411:24;:::i;:::-;31400:35;;31390:51;;;:::o;31447:90::-;31481:7;31524:5;31517:13;31510:21;31499:32;;31489:48;;;:::o;31543:149::-;31579:7;31619:66;31612:5;31608:78;31597:89;;31587:105;;;:::o;31698:126::-;31735:7;31775:42;31768:5;31764:54;31753:65;;31743:81;;;:::o;31830:77::-;31867:7;31896:5;31885:16;;31875:32;;;:::o;31913:154::-;31997:6;31992:3;31987;31974:30;32059:1;32050:6;32045:3;32041:16;32034:27;31964:103;;;:::o;32073:307::-;32141:1;32151:113;32165:6;32162:1;32159:13;32151:113;;;32250:1;32245:3;32241:11;32235:18;32231:1;32226:3;32222:11;32215:39;32187:2;32184:1;32180:10;32175:15;;32151:113;;;32282:6;32279:1;32276:13;32273:2;;;32362:1;32353:6;32348:3;32344:16;32337:27;32273:2;32122:258;;;;:::o;32386:320::-;32430:6;32467:1;32461:4;32457:12;32447:22;;32514:1;32508:4;32504:12;32535:18;32525:2;;32591:4;32583:6;32579:17;32569:27;;32525:2;32653;32645:6;32642:14;32622:18;32619:38;32616:2;;;32672:18;;:::i;:::-;32616:2;32437:269;;;;:::o;32712:281::-;32795:27;32817:4;32795:27;:::i;:::-;32787:6;32783:40;32925:6;32913:10;32910:22;32889:18;32877:10;32874:34;32871:62;32868:2;;;32936:18;;:::i;:::-;32868:2;32976:10;32972:2;32965:22;32755:238;;;:::o;32999:233::-;33038:3;33061:24;33079:5;33061:24;:::i;:::-;33052:33;;33107:66;33100:5;33097:77;33094:2;;;33177:18;;:::i;:::-;33094:2;33224:1;33217:5;33213:13;33206:20;;33042:190;;;:::o;33238:180::-;33286:77;33283:1;33276:88;33383:4;33380:1;33373:15;33407:4;33404:1;33397:15;33424:180;33472:77;33469:1;33462:88;33569:4;33566:1;33559:15;33593:4;33590:1;33583:15;33610:180;33658:77;33655:1;33648:88;33755:4;33752:1;33745:15;33779:4;33776:1;33769:15;33796:183;33831:3;33869:1;33851:16;33848:23;33845:2;;;33907:1;33904;33901;33886:23;33929:34;33960:1;33954:8;33929:34;:::i;:::-;33922:41;;33845:2;33835:144;:::o;33985:102::-;34026:6;34077:2;34073:7;34068:2;34061:5;34057:14;34053:28;34043:38;;34033:54;;;:::o;34093:106::-;34137:8;34186:5;34181:3;34177:15;34156:36;;34146:53;;;:::o;34205:239::-;34345:34;34341:1;34333:6;34329:14;34322:58;34414:22;34409:2;34401:6;34397:15;34390:47;34311:133;:::o;34450:227::-;34590:34;34586:1;34578:6;34574:14;34567:58;34659:10;34654:2;34646:6;34642:15;34635:35;34556:121;:::o;34683:230::-;34823:34;34819:1;34811:6;34807:14;34800:58;34892:13;34887:2;34879:6;34875:15;34868:38;34789:124;:::o;34919:225::-;35059:34;35055:1;35047:6;35043:14;35036:58;35128:8;35123:2;35115:6;35111:15;35104:33;35025:119;:::o;35150:228::-;35290:34;35286:1;35278:6;35274:14;35267:58;35359:11;35354:2;35346:6;35342:15;35335:36;35256:122;:::o;35384:224::-;35524:34;35520:1;35512:6;35508:14;35501:58;35593:7;35588:2;35580:6;35576:15;35569:32;35490:118;:::o;35614:237::-;35754:34;35750:1;35742:6;35738:14;35731:58;35823:20;35818:2;35810:6;35806:15;35799:45;35720:131;:::o;35857:229::-;35997:34;35993:1;35985:6;35981:14;35974:58;36066:12;36061:2;36053:6;36049:15;36042:37;35963:123;:::o;36092:182::-;36232:34;36228:1;36220:6;36216:14;36209:58;36198:76;:::o;36280:228::-;36420:34;36416:1;36408:6;36404:14;36397:58;36489:11;36484:2;36476:6;36472:15;36465:36;36386:122;:::o;36514:228::-;36654:34;36650:1;36642:6;36638:14;36631:58;36723:11;36718:2;36710:6;36706:15;36699:36;36620:122;:::o;36748:227::-;36888:34;36884:1;36876:6;36872:14;36865:58;36957:10;36952:2;36944:6;36940:15;36933:35;36854:121;:::o;36981:220::-;37121:34;37117:1;37109:6;37105:14;37098:58;37190:3;37185:2;37177:6;37173:15;37166:28;37087:114;:::o;37207:711::-;37246:3;37284:4;37266:16;37263:26;37260:2;;;37292:5;;37260:2;37321:20;;:::i;:::-;37396:1;37378:16;37374:24;37371:1;37365:4;37350:49;37429:4;37423:11;37528:16;37521:4;37513:6;37509:17;37506:39;37473:18;37465:6;37462:30;37446:113;37443:2;;;37574:5;;;;37443:2;37620:6;37614:4;37610:17;37656:3;37650:10;37683:18;37675:6;37672:30;37669:2;;;37705:5;;;;;;37669:2;37753:6;37746:4;37741:3;37737:14;37733:27;37812:1;37794:16;37790:24;37784:4;37780:35;37775:3;37772:44;37769:2;;;37819:5;;;;;;;37769:2;37836:57;37884:6;37878:4;37874:17;37866:6;37862:30;37856:4;37836:57;:::i;:::-;37909:3;37902:10;;37250:668;;;;;;;:::o;37924:122::-;37997:24;38015:5;37997:24;:::i;:::-;37990:5;37987:35;37977:2;;38036:1;38033;38026:12;37977:2;37967:79;:::o;38052:116::-;38122:21;38137:5;38122:21;:::i;:::-;38115:5;38112:32;38102:2;;38158:1;38155;38148:12;38102:2;38092:76;:::o;38174:120::-;38246:23;38263:5;38246:23;:::i;:::-;38239:5;38236:34;38226:2;;38284:1;38281;38274:12;38226:2;38216:78;:::o;38300:122::-;38373:24;38391:5;38373:24;:::i;:::-;38366:5;38363:35;38353:2;;38412:1;38409;38402:12;38353:2;38343:79;:::o

Swarm Source

ipfs://b03700d74c62190fd7b4135415a8a2e0e698edd25521b7e8066dda2830d1e9d5
Loading...
Loading
[ 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.