ETH Price: $2,488.46 (+2.99%)

Token

SuperHi Basic Income Sponsor (SBI)
 

Overview

Max Total Supply

0 SBI

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Mirror: Gian Ferrer
Balance
1 SBI
0x2bd5d2e3d5852ad9960638083cb7c9f493e7a597
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SuperHiBasicSponsor

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-11
*/

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

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol

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

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (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/Context.sol

// 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/Strings.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// 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/ERC721/ERC721.sol

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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/Sponsor.sol

pragma solidity ^0.8.11;





/// @custom:security-contact [email protected]
contract SuperHiBasicSponsor is ERC721, ERC721URIStorage, ERC721Burnable {
    uint8 public counter;
    uint8 public total = 250;
    address public safeAddress;

    mapping (address => bool) public hasToken;

    constructor(address _safe) ERC721("SuperHi Basic Income Sponsor", "SBI") {
        safeAddress = payable(_safe);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "https://ipfs.io/ipfs/QmNus5bGRECLevxQGSEWSqxRGgPWQuEvcDVmFhG1KjK7nB/";
    }

    function safeMint(address to) public payable {
        require(msg.value >= 0.1 ether, "must be sent 0.1 ether or higher");
        require(counter < total, "all NFTs have been now minted");
        counter += 1;
        hasToken[to] = true;
        _safeMint(to, counter);
        _setTokenURI(
            counter, 
            string(abi.encodePacked(Strings.toString(counter), ".json"))
        );
        (bool sent, ) = safeAddress.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // pass any extra funds onto the gnosis safe
    receive() external payable {
        (bool sent, ) = safeAddress.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_safe","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260fa600760016101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b506040516200389438038062003894833981810160405281019062000053919062000255565b6040518060400160405280601c81526020017f5375706572486920426173696320496e636f6d652053706f6e736f72000000008152506040518060400160405280600381526020017f53424900000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d79291906200013b565b508060019080519060200190620000f09291906200013b565b50505080600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620002ec565b8280546200014990620002b6565b90600052602060002090601f0160209004810192826200016d5760008555620001b9565b82601f106200018857805160ff1916838001178555620001b9565b82800160010185558215620001b9579182015b82811115620001b85782518255916020019190600101906200019b565b5b509050620001c89190620001cc565b5090565b5b80821115620001e7576000816000905550600101620001cd565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200021d82620001f0565b9050919050565b6200022f8162000210565b81146200023b57600080fd5b50565b6000815190506200024f8162000224565b92915050565b6000602082840312156200026e576200026d620001eb565b5b60006200027e848285016200023e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002cf57607f821691505b60208210811415620002e657620002e562000287565b5b50919050565b61359880620002fc6000396000f3fe6080604052600436106101185760003560e01c80635578110c116100a05780639bb0f599116100645780639bb0f5991461047e578063a22cb465146104bb578063b88d4fde146104e4578063c87b56dd1461050d578063e985e9c51461054a576101ee565b80635578110c1461038357806361bc221a146103ae5780636352211e146103d957806370a082311461041657806395d89b4114610453576101ee565b806323b872dd116100e757806323b872dd146102c15780632ddbd13a146102ea57806340d097c31461031557806342842e0e1461033157806342966c681461035a576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298576101ee565b366101ee576000600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161016590612080565b60006040518083038185875af1925050503d80600081146101a2576040519150601f19603f3d011682016040523d82523d6000602084013e6101a7565b606091505b50509050806101eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e2906120f2565b60405180910390fd5b50005b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061217e565b610587565b60405161022791906121c6565b60405180910390f35b34801561023c57600080fd5b50610245610669565b6040516102529190612269565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906122c1565b6106fb565b60405161028f919061232f565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612376565b610780565b005b3480156102cd57600080fd5b506102e860048036038101906102e391906123b6565b610898565b005b3480156102f657600080fd5b506102ff6108f8565b60405161030c9190612425565b60405180910390f35b61032f600480360381019061032a9190612440565b61090b565b005b34801561033d57600080fd5b50610358600480360381019061035391906123b6565b610b8e565b005b34801561036657600080fd5b50610381600480360381019061037c91906122c1565b610bae565b005b34801561038f57600080fd5b50610398610c0a565b6040516103a5919061232f565b60405180910390f35b3480156103ba57600080fd5b506103c3610c30565b6040516103d09190612425565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906122c1565b610c43565b60405161040d919061232f565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190612440565b610cf5565b60405161044a919061247c565b60405180910390f35b34801561045f57600080fd5b50610468610dad565b6040516104759190612269565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612440565b610e3f565b6040516104b291906121c6565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd91906124c3565b610e5f565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612638565b610e75565b005b34801561051957600080fd5b50610534600480360381019061052f91906122c1565b610ed7565b6040516105419190612269565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906126bb565b610ee9565b60405161057e91906121c6565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610662575061066182610f7d565b5b9050919050565b6060600080546106789061272a565b80601f01602080910402602001604051908101604052809291908181526020018280546106a49061272a565b80156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b5050505050905090565b600061070682610fe7565b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c906127ce565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078b82610c43565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390612860565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081b611053565b73ffffffffffffffffffffffffffffffffffffffff16148061084a575061084981610844611053565b610ee9565b5b610889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610880906128f2565b60405180910390fd5b610893838361105b565b505050565b6108a96108a3611053565b82611114565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612984565b60405180910390fd5b6108f38383836111f2565b505050565b600760019054906101000a900460ff1681565b67016345785d8a0000341015610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906129f0565b60405180910390fd5b600760019054906101000a900460ff1660ff16600760009054906101000a900460ff1660ff16106109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390612a5c565b60405180910390fd5b6001600760008282829054906101000a900460ff166109db9190612aab565b92506101000a81548160ff021916908360ff1602179055506001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a6781600760009054906101000a900460ff1660ff1661144e565b610abc600760009054906101000a900460ff1660ff16610a98600760009054906101000a900460ff1660ff1661146c565b604051602001610aa89190612b6a565b6040516020818303038152906040526115cd565b6000600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610b0490612080565b60006040518083038185875af1925050503d8060008114610b41576040519150601f19603f3d011682016040523d82523d6000602084013e610b46565b606091505b5050905080610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906120f2565b60405180910390fd5b5050565b610ba983838360405180602001604052806000815250610e75565b505050565b610bbf610bb9611053565b82611114565b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612bfe565b60405180910390fd5b610c0781611641565b50565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390612c90565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90612d22565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610dbc9061272a565b80601f0160208091040260200160405190810160405280929190818152602001828054610de89061272a565b8015610e355780601f10610e0a57610100808354040283529160200191610e35565b820191906000526020600020905b815481529060010190602001808311610e1857829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610e71610e6a611053565b838361164d565b5050565b610e86610e80611053565b83611114565b610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90612984565b60405180910390fd5b610ed1848484846117ba565b50505050565b6060610ee282611816565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110ce83610c43565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061111f82610fe7565b61115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590612db4565b60405180910390fd5b600061116983610c43565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111d857508373ffffffffffffffffffffffffffffffffffffffff166111c0846106fb565b73ffffffffffffffffffffffffffffffffffffffff16145b806111e957506111e88185610ee9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661121282610c43565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90612e46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90612ed8565b60405180910390fd5b6112e3838383611968565b6112ee60008261105b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133e9190612ef8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113959190612f2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611468828260405180602001604052806000815250611978565b5050565b606060008214156114b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115c8565b600082905060005b600082146114e65780806114cf90612f82565b915050600a826114df9190612ffa565b91506114bc565b60008167ffffffffffffffff8111156115025761150161250d565b5b6040519080825280601f01601f1916602001820160405280156115345781602001600182028036833780820191505090505b5090505b600085146115c15760018261154d9190612ef8565b9150600a8561155c919061302b565b60306115689190612f2c565b60f81b81838151811061157e5761157d61305c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115ba9190612ffa565b9450611538565b8093505050505b919050565b6115d682610fe7565b611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906130fd565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061163c929190611f6c565b505050565b61164a816119d3565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613169565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117ad91906121c6565b60405180910390a3505050565b6117c58484846111f2565b6117d184848484611a26565b611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906131fb565b60405180910390fd5b50505050565b606061182182610fe7565b611860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118579061328d565b60405180910390fd5b60006006600084815260200190815260200160002080546118809061272a565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac9061272a565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b50505050509050600061190a611bae565b9050600081511415611920578192505050611963565b60008251111561195557808260405160200161193d9291906132ad565b60405160208183030381529060405292505050611963565b61195e84611bce565b925050505b919050565b611973838383611c75565b505050565b6119828383611c7a565b61198f6000848484611a26565b6119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c5906131fb565b60405180910390fd5b505050565b6119dc81611e48565b60006006600083815260200190815260200160002080546119fc9061272a565b905014611a2357600660008281526020019081526020016000206000611a229190611ff2565b5b50565b6000611a478473ffffffffffffffffffffffffffffffffffffffff16611f59565b15611ba1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a70611053565b8786866040518563ffffffff1660e01b8152600401611a929493929190613326565b6020604051808303816000875af1925050508015611ace57506040513d601f19601f82011682018060405250810190611acb9190613387565b60015b611b51573d8060008114611afe576040519150601f19603f3d011682016040523d82523d6000602084013e611b03565b606091505b50600081511415611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b40906131fb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ba6565b600190505b949350505050565b606060405180608001604052806044815260200161351f60449139905090565b6060611bd982610fe7565b611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613426565b60405180910390fd5b6000611c22611bae565b90506000815111611c425760405180602001604052806000815250611c6d565b80611c4c8461146c565b604051602001611c5d9291906132ad565b6040516020818303038152906040525b915050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613492565b60405180910390fd5b611cf381610fe7565b15611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a906134fe565b60405180910390fd5b611d3f60008383611968565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d8f9190612f2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611e5382610c43565b9050611e6181600084611968565b611e6c60008361105b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ebc9190612ef8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611f789061272a565b90600052602060002090601f016020900481019282611f9a5760008555611fe1565b82601f10611fb357805160ff1916838001178555611fe1565b82800160010185558215611fe1579182015b82811115611fe0578251825591602001919060010190611fc5565b5b509050611fee9190612032565b5090565b508054611ffe9061272a565b6000825580601f10612010575061202f565b601f01602090049060005260206000209081019061202e9190612032565b5b50565b5b8082111561204b576000816000905550600101612033565b5090565b600081905092915050565b50565b600061206a60008361204f565b91506120758261205a565b600082019050919050565b600061208b8261205d565b9150819050919050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b60006120dc601483612095565b91506120e7826120a6565b602082019050919050565b6000602082019050818103600083015261210b816120cf565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61215b81612126565b811461216657600080fd5b50565b60008135905061217881612152565b92915050565b6000602082840312156121945761219361211c565b5b60006121a284828501612169565b91505092915050565b60008115159050919050565b6121c0816121ab565b82525050565b60006020820190506121db60008301846121b7565b92915050565b600081519050919050565b60005b8381101561220a5780820151818401526020810190506121ef565b83811115612219576000848401525b50505050565b6000601f19601f8301169050919050565b600061223b826121e1565b6122458185612095565b93506122558185602086016121ec565b61225e8161221f565b840191505092915050565b600060208201905081810360008301526122838184612230565b905092915050565b6000819050919050565b61229e8161228b565b81146122a957600080fd5b50565b6000813590506122bb81612295565b92915050565b6000602082840312156122d7576122d661211c565b5b60006122e5848285016122ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612319826122ee565b9050919050565b6123298161230e565b82525050565b60006020820190506123446000830184612320565b92915050565b6123538161230e565b811461235e57600080fd5b50565b6000813590506123708161234a565b92915050565b6000806040838503121561238d5761238c61211c565b5b600061239b85828601612361565b92505060206123ac858286016122ac565b9150509250929050565b6000806000606084860312156123cf576123ce61211c565b5b60006123dd86828701612361565b93505060206123ee86828701612361565b92505060406123ff868287016122ac565b9150509250925092565b600060ff82169050919050565b61241f81612409565b82525050565b600060208201905061243a6000830184612416565b92915050565b6000602082840312156124565761245561211c565b5b600061246484828501612361565b91505092915050565b6124768161228b565b82525050565b6000602082019050612491600083018461246d565b92915050565b6124a0816121ab565b81146124ab57600080fd5b50565b6000813590506124bd81612497565b92915050565b600080604083850312156124da576124d961211c565b5b60006124e885828601612361565b92505060206124f9858286016124ae565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125458261221f565b810181811067ffffffffffffffff821117156125645761256361250d565b5b80604052505050565b6000612577612112565b9050612583828261253c565b919050565b600067ffffffffffffffff8211156125a3576125a261250d565b5b6125ac8261221f565b9050602081019050919050565b82818337600083830152505050565b60006125db6125d684612588565b61256d565b9050828152602081018484840111156125f7576125f6612508565b5b6126028482856125b9565b509392505050565b600082601f83011261261f5761261e612503565b5b813561262f8482602086016125c8565b91505092915050565b600080600080608085870312156126525761265161211c565b5b600061266087828801612361565b945050602061267187828801612361565b9350506040612682878288016122ac565b925050606085013567ffffffffffffffff8111156126a3576126a2612121565b5b6126af8782880161260a565b91505092959194509250565b600080604083850312156126d2576126d161211c565b5b60006126e085828601612361565b92505060206126f185828601612361565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061274257607f821691505b60208210811415612756576127556126fb565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006127b8602c83612095565b91506127c38261275c565b604082019050919050565b600060208201905081810360008301526127e7816127ab565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061284a602183612095565b9150612855826127ee565b604082019050919050565b600060208201905081810360008301526128798161283d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006128dc603883612095565b91506128e782612880565b604082019050919050565b6000602082019050818103600083015261290b816128cf565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061296e603183612095565b915061297982612912565b604082019050919050565b6000602082019050818103600083015261299d81612961565b9050919050565b7f6d7573742062652073656e7420302e31206574686572206f7220686967686572600082015250565b60006129da602083612095565b91506129e5826129a4565b602082019050919050565b60006020820190508181036000830152612a09816129cd565b9050919050565b7f616c6c204e4654732068617665206265656e206e6f77206d696e746564000000600082015250565b6000612a46601d83612095565b9150612a5182612a10565b602082019050919050565b60006020820190508181036000830152612a7581612a39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ab682612409565b9150612ac183612409565b92508260ff03821115612ad757612ad6612a7c565b5b828201905092915050565b600081905092915050565b6000612af8826121e1565b612b028185612ae2565b9350612b128185602086016121ec565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612b54600583612ae2565b9150612b5f82612b1e565b600582019050919050565b6000612b768284612aed565b9150612b8182612b47565b915081905092915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000612be8603083612095565b9150612bf382612b8c565b604082019050919050565b60006020820190508181036000830152612c1781612bdb565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612c7a602983612095565b9150612c8582612c1e565b604082019050919050565b60006020820190508181036000830152612ca981612c6d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612d0c602a83612095565b9150612d1782612cb0565b604082019050919050565b60006020820190508181036000830152612d3b81612cff565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612d9e602c83612095565b9150612da982612d42565b604082019050919050565b60006020820190508181036000830152612dcd81612d91565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000612e30602983612095565b9150612e3b82612dd4565b604082019050919050565b60006020820190508181036000830152612e5f81612e23565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ec2602483612095565b9150612ecd82612e66565b604082019050919050565b60006020820190508181036000830152612ef181612eb5565b9050919050565b6000612f038261228b565b9150612f0e8361228b565b925082821015612f2157612f20612a7c565b5b828203905092915050565b6000612f378261228b565b9150612f428361228b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7757612f76612a7c565b5b828201905092915050565b6000612f8d8261228b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fc057612fbf612a7c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130058261228b565b91506130108361228b565b9250826130205761301f612fcb565b5b828204905092915050565b60006130368261228b565b91506130418361228b565b92508261305157613050612fcb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006130e7602e83612095565b91506130f28261308b565b604082019050919050565b60006020820190508181036000830152613116816130da565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613153601983612095565b915061315e8261311d565b602082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006131e5603283612095565b91506131f082613189565b604082019050919050565b60006020820190508181036000830152613214816131d8565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000613277603183612095565b91506132828261321b565b604082019050919050565b600060208201905081810360008301526132a68161326a565b9050919050565b60006132b98285612aed565b91506132c58284612aed565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006132f8826132d1565b61330281856132dc565b93506133128185602086016121ec565b61331b8161221f565b840191505092915050565b600060808201905061333b6000830187612320565b6133486020830186612320565b613355604083018561246d565b818103606083015261336781846132ed565b905095945050505050565b60008151905061338181612152565b92915050565b60006020828403121561339d5761339c61211c565b5b60006133ab84828501613372565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613410602f83612095565b915061341b826133b4565b604082019050919050565b6000602082019050818103600083015261343f81613403565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061347c602083612095565b915061348782613446565b602082019050919050565b600060208201905081810360008301526134ab8161346f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134e8601c83612095565b91506134f3826134b2565b602082019050919050565b60006020820190508181036000830152613517816134db565b905091905056fe68747470733a2f2f697066732e696f2f697066732f516d4e75733562475245434c65767851475345575371785247675057517545766344566d466847314b6a4b376e422fa2646970667358221220d0c7df6224e5a2eb99619f4968cc1fd91b4e9ff567c07bc72289a2ade647bc3b64736f6c634300080b003300000000000000000000000031dc37eeb6003f9b22a918311ab0c19858d9cad8

Deployed Bytecode

0x6080604052600436106101185760003560e01c80635578110c116100a05780639bb0f599116100645780639bb0f5991461047e578063a22cb465146104bb578063b88d4fde146104e4578063c87b56dd1461050d578063e985e9c51461054a576101ee565b80635578110c1461038357806361bc221a146103ae5780636352211e146103d957806370a082311461041657806395d89b4114610453576101ee565b806323b872dd116100e757806323b872dd146102c15780632ddbd13a146102ea57806340d097c31461031557806342842e0e1461033157806342966c681461035a576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298576101ee565b366101ee576000600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161016590612080565b60006040518083038185875af1925050503d80600081146101a2576040519150601f19603f3d011682016040523d82523d6000602084013e6101a7565b606091505b50509050806101eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e2906120f2565b60405180910390fd5b50005b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061217e565b610587565b60405161022791906121c6565b60405180910390f35b34801561023c57600080fd5b50610245610669565b6040516102529190612269565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906122c1565b6106fb565b60405161028f919061232f565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612376565b610780565b005b3480156102cd57600080fd5b506102e860048036038101906102e391906123b6565b610898565b005b3480156102f657600080fd5b506102ff6108f8565b60405161030c9190612425565b60405180910390f35b61032f600480360381019061032a9190612440565b61090b565b005b34801561033d57600080fd5b50610358600480360381019061035391906123b6565b610b8e565b005b34801561036657600080fd5b50610381600480360381019061037c91906122c1565b610bae565b005b34801561038f57600080fd5b50610398610c0a565b6040516103a5919061232f565b60405180910390f35b3480156103ba57600080fd5b506103c3610c30565b6040516103d09190612425565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906122c1565b610c43565b60405161040d919061232f565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190612440565b610cf5565b60405161044a919061247c565b60405180910390f35b34801561045f57600080fd5b50610468610dad565b6040516104759190612269565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612440565b610e3f565b6040516104b291906121c6565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd91906124c3565b610e5f565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612638565b610e75565b005b34801561051957600080fd5b50610534600480360381019061052f91906122c1565b610ed7565b6040516105419190612269565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906126bb565b610ee9565b60405161057e91906121c6565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610662575061066182610f7d565b5b9050919050565b6060600080546106789061272a565b80601f01602080910402602001604051908101604052809291908181526020018280546106a49061272a565b80156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b5050505050905090565b600061070682610fe7565b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c906127ce565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078b82610c43565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390612860565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081b611053565b73ffffffffffffffffffffffffffffffffffffffff16148061084a575061084981610844611053565b610ee9565b5b610889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610880906128f2565b60405180910390fd5b610893838361105b565b505050565b6108a96108a3611053565b82611114565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612984565b60405180910390fd5b6108f38383836111f2565b505050565b600760019054906101000a900460ff1681565b67016345785d8a0000341015610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906129f0565b60405180910390fd5b600760019054906101000a900460ff1660ff16600760009054906101000a900460ff1660ff16106109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390612a5c565b60405180910390fd5b6001600760008282829054906101000a900460ff166109db9190612aab565b92506101000a81548160ff021916908360ff1602179055506001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a6781600760009054906101000a900460ff1660ff1661144e565b610abc600760009054906101000a900460ff1660ff16610a98600760009054906101000a900460ff1660ff1661146c565b604051602001610aa89190612b6a565b6040516020818303038152906040526115cd565b6000600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610b0490612080565b60006040518083038185875af1925050503d8060008114610b41576040519150601f19603f3d011682016040523d82523d6000602084013e610b46565b606091505b5050905080610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906120f2565b60405180910390fd5b5050565b610ba983838360405180602001604052806000815250610e75565b505050565b610bbf610bb9611053565b82611114565b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612bfe565b60405180910390fd5b610c0781611641565b50565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390612c90565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90612d22565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610dbc9061272a565b80601f0160208091040260200160405190810160405280929190818152602001828054610de89061272a565b8015610e355780601f10610e0a57610100808354040283529160200191610e35565b820191906000526020600020905b815481529060010190602001808311610e1857829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610e71610e6a611053565b838361164d565b5050565b610e86610e80611053565b83611114565b610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90612984565b60405180910390fd5b610ed1848484846117ba565b50505050565b6060610ee282611816565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110ce83610c43565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061111f82610fe7565b61115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590612db4565b60405180910390fd5b600061116983610c43565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111d857508373ffffffffffffffffffffffffffffffffffffffff166111c0846106fb565b73ffffffffffffffffffffffffffffffffffffffff16145b806111e957506111e88185610ee9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661121282610c43565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90612e46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90612ed8565b60405180910390fd5b6112e3838383611968565b6112ee60008261105b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133e9190612ef8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113959190612f2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611468828260405180602001604052806000815250611978565b5050565b606060008214156114b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115c8565b600082905060005b600082146114e65780806114cf90612f82565b915050600a826114df9190612ffa565b91506114bc565b60008167ffffffffffffffff8111156115025761150161250d565b5b6040519080825280601f01601f1916602001820160405280156115345781602001600182028036833780820191505090505b5090505b600085146115c15760018261154d9190612ef8565b9150600a8561155c919061302b565b60306115689190612f2c565b60f81b81838151811061157e5761157d61305c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115ba9190612ffa565b9450611538565b8093505050505b919050565b6115d682610fe7565b611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906130fd565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061163c929190611f6c565b505050565b61164a816119d3565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613169565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117ad91906121c6565b60405180910390a3505050565b6117c58484846111f2565b6117d184848484611a26565b611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906131fb565b60405180910390fd5b50505050565b606061182182610fe7565b611860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118579061328d565b60405180910390fd5b60006006600084815260200190815260200160002080546118809061272a565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac9061272a565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b50505050509050600061190a611bae565b9050600081511415611920578192505050611963565b60008251111561195557808260405160200161193d9291906132ad565b60405160208183030381529060405292505050611963565b61195e84611bce565b925050505b919050565b611973838383611c75565b505050565b6119828383611c7a565b61198f6000848484611a26565b6119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c5906131fb565b60405180910390fd5b505050565b6119dc81611e48565b60006006600083815260200190815260200160002080546119fc9061272a565b905014611a2357600660008281526020019081526020016000206000611a229190611ff2565b5b50565b6000611a478473ffffffffffffffffffffffffffffffffffffffff16611f59565b15611ba1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a70611053565b8786866040518563ffffffff1660e01b8152600401611a929493929190613326565b6020604051808303816000875af1925050508015611ace57506040513d601f19601f82011682018060405250810190611acb9190613387565b60015b611b51573d8060008114611afe576040519150601f19603f3d011682016040523d82523d6000602084013e611b03565b606091505b50600081511415611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b40906131fb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ba6565b600190505b949350505050565b606060405180608001604052806044815260200161351f60449139905090565b6060611bd982610fe7565b611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613426565b60405180910390fd5b6000611c22611bae565b90506000815111611c425760405180602001604052806000815250611c6d565b80611c4c8461146c565b604051602001611c5d9291906132ad565b6040516020818303038152906040525b915050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613492565b60405180910390fd5b611cf381610fe7565b15611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a906134fe565b60405180910390fd5b611d3f60008383611968565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d8f9190612f2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611e5382610c43565b9050611e6181600084611968565b611e6c60008361105b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ebc9190612ef8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611f789061272a565b90600052602060002090601f016020900481019282611f9a5760008555611fe1565b82601f10611fb357805160ff1916838001178555611fe1565b82800160010185558215611fe1579182015b82811115611fe0578251825591602001919060010190611fc5565b5b509050611fee9190612032565b5090565b508054611ffe9061272a565b6000825580601f10612010575061202f565b601f01602090049060005260206000209081019061202e9190612032565b5b50565b5b8082111561204b576000816000905550600101612033565b5090565b600081905092915050565b50565b600061206a60008361204f565b91506120758261205a565b600082019050919050565b600061208b8261205d565b9150819050919050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b60006120dc601483612095565b91506120e7826120a6565b602082019050919050565b6000602082019050818103600083015261210b816120cf565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61215b81612126565b811461216657600080fd5b50565b60008135905061217881612152565b92915050565b6000602082840312156121945761219361211c565b5b60006121a284828501612169565b91505092915050565b60008115159050919050565b6121c0816121ab565b82525050565b60006020820190506121db60008301846121b7565b92915050565b600081519050919050565b60005b8381101561220a5780820151818401526020810190506121ef565b83811115612219576000848401525b50505050565b6000601f19601f8301169050919050565b600061223b826121e1565b6122458185612095565b93506122558185602086016121ec565b61225e8161221f565b840191505092915050565b600060208201905081810360008301526122838184612230565b905092915050565b6000819050919050565b61229e8161228b565b81146122a957600080fd5b50565b6000813590506122bb81612295565b92915050565b6000602082840312156122d7576122d661211c565b5b60006122e5848285016122ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612319826122ee565b9050919050565b6123298161230e565b82525050565b60006020820190506123446000830184612320565b92915050565b6123538161230e565b811461235e57600080fd5b50565b6000813590506123708161234a565b92915050565b6000806040838503121561238d5761238c61211c565b5b600061239b85828601612361565b92505060206123ac858286016122ac565b9150509250929050565b6000806000606084860312156123cf576123ce61211c565b5b60006123dd86828701612361565b93505060206123ee86828701612361565b92505060406123ff868287016122ac565b9150509250925092565b600060ff82169050919050565b61241f81612409565b82525050565b600060208201905061243a6000830184612416565b92915050565b6000602082840312156124565761245561211c565b5b600061246484828501612361565b91505092915050565b6124768161228b565b82525050565b6000602082019050612491600083018461246d565b92915050565b6124a0816121ab565b81146124ab57600080fd5b50565b6000813590506124bd81612497565b92915050565b600080604083850312156124da576124d961211c565b5b60006124e885828601612361565b92505060206124f9858286016124ae565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125458261221f565b810181811067ffffffffffffffff821117156125645761256361250d565b5b80604052505050565b6000612577612112565b9050612583828261253c565b919050565b600067ffffffffffffffff8211156125a3576125a261250d565b5b6125ac8261221f565b9050602081019050919050565b82818337600083830152505050565b60006125db6125d684612588565b61256d565b9050828152602081018484840111156125f7576125f6612508565b5b6126028482856125b9565b509392505050565b600082601f83011261261f5761261e612503565b5b813561262f8482602086016125c8565b91505092915050565b600080600080608085870312156126525761265161211c565b5b600061266087828801612361565b945050602061267187828801612361565b9350506040612682878288016122ac565b925050606085013567ffffffffffffffff8111156126a3576126a2612121565b5b6126af8782880161260a565b91505092959194509250565b600080604083850312156126d2576126d161211c565b5b60006126e085828601612361565b92505060206126f185828601612361565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061274257607f821691505b60208210811415612756576127556126fb565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006127b8602c83612095565b91506127c38261275c565b604082019050919050565b600060208201905081810360008301526127e7816127ab565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061284a602183612095565b9150612855826127ee565b604082019050919050565b600060208201905081810360008301526128798161283d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006128dc603883612095565b91506128e782612880565b604082019050919050565b6000602082019050818103600083015261290b816128cf565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061296e603183612095565b915061297982612912565b604082019050919050565b6000602082019050818103600083015261299d81612961565b9050919050565b7f6d7573742062652073656e7420302e31206574686572206f7220686967686572600082015250565b60006129da602083612095565b91506129e5826129a4565b602082019050919050565b60006020820190508181036000830152612a09816129cd565b9050919050565b7f616c6c204e4654732068617665206265656e206e6f77206d696e746564000000600082015250565b6000612a46601d83612095565b9150612a5182612a10565b602082019050919050565b60006020820190508181036000830152612a7581612a39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ab682612409565b9150612ac183612409565b92508260ff03821115612ad757612ad6612a7c565b5b828201905092915050565b600081905092915050565b6000612af8826121e1565b612b028185612ae2565b9350612b128185602086016121ec565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612b54600583612ae2565b9150612b5f82612b1e565b600582019050919050565b6000612b768284612aed565b9150612b8182612b47565b915081905092915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000612be8603083612095565b9150612bf382612b8c565b604082019050919050565b60006020820190508181036000830152612c1781612bdb565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612c7a602983612095565b9150612c8582612c1e565b604082019050919050565b60006020820190508181036000830152612ca981612c6d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612d0c602a83612095565b9150612d1782612cb0565b604082019050919050565b60006020820190508181036000830152612d3b81612cff565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612d9e602c83612095565b9150612da982612d42565b604082019050919050565b60006020820190508181036000830152612dcd81612d91565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000612e30602983612095565b9150612e3b82612dd4565b604082019050919050565b60006020820190508181036000830152612e5f81612e23565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ec2602483612095565b9150612ecd82612e66565b604082019050919050565b60006020820190508181036000830152612ef181612eb5565b9050919050565b6000612f038261228b565b9150612f0e8361228b565b925082821015612f2157612f20612a7c565b5b828203905092915050565b6000612f378261228b565b9150612f428361228b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7757612f76612a7c565b5b828201905092915050565b6000612f8d8261228b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fc057612fbf612a7c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130058261228b565b91506130108361228b565b9250826130205761301f612fcb565b5b828204905092915050565b60006130368261228b565b91506130418361228b565b92508261305157613050612fcb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006130e7602e83612095565b91506130f28261308b565b604082019050919050565b60006020820190508181036000830152613116816130da565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613153601983612095565b915061315e8261311d565b602082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006131e5603283612095565b91506131f082613189565b604082019050919050565b60006020820190508181036000830152613214816131d8565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000613277603183612095565b91506132828261321b565b604082019050919050565b600060208201905081810360008301526132a68161326a565b9050919050565b60006132b98285612aed565b91506132c58284612aed565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006132f8826132d1565b61330281856132dc565b93506133128185602086016121ec565b61331b8161221f565b840191505092915050565b600060808201905061333b6000830187612320565b6133486020830186612320565b613355604083018561246d565b818103606083015261336781846132ed565b905095945050505050565b60008151905061338181612152565b92915050565b60006020828403121561339d5761339c61211c565b5b60006133ab84828501613372565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613410602f83612095565b915061341b826133b4565b604082019050919050565b6000602082019050818103600083015261343f81613403565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061347c602083612095565b915061348782613446565b602082019050919050565b600060208201905081810360008301526134ab8161346f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134e8601c83612095565b91506134f3826134b2565b602082019050919050565b60006020820190508181036000830152613517816134db565b905091905056fe68747470733a2f2f697066732e696f2f697066732f516d4e75733562475245434c65767851475345575371785247675057517545766344566d466847314b6a4b376e422fa2646970667358221220d0c7df6224e5a2eb99619f4968cc1fd91b4e9ff567c07bc72289a2ade647bc3b64736f6c634300080b0033

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

00000000000000000000000031dc37eeb6003f9b22a918311ab0c19858d9cad8

-----Decoded View---------------
Arg [0] : _safe (address): 0x31dC37eEb6003f9B22A918311ab0C19858d9Cad8

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000031dc37eeb6003f9b22a918311ab0c19858d9cad8


Deployed Bytecode Sourcemap

36571:1850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38309:9;38324:11;;;;;;;;;;;:16;;38348:9;38324:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38308:54;;;38381:4;38373:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;38297:121;36571:1850;;;;;21227:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22172:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23731:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23254:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24481:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36678:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37093:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24891:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36204:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36709:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36651:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21866:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21596:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22341:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36744:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24024:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25147:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38016:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24250:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21227:305;21329:4;21381:25;21366:40;;;:11;:40;;;;:105;;;;21438:33;21423:48;;;:11;:48;;;;21366:105;:158;;;;21488:36;21512:11;21488:23;:36::i;:::-;21366:158;21346:178;;21227:305;;;:::o;22172:100::-;22226:13;22259:5;22252:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22172:100;:::o;23731:221::-;23807:7;23835:16;23843:7;23835;:16::i;:::-;23827:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23920:15;:24;23936:7;23920:24;;;;;;;;;;;;;;;;;;;;;23913:31;;23731:221;;;:::o;23254:411::-;23335:13;23351:23;23366:7;23351:14;:23::i;:::-;23335:39;;23399:5;23393:11;;:2;:11;;;;23385:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23493:5;23477:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23502:37;23519:5;23526:12;:10;:12::i;:::-;23502:16;:37::i;:::-;23477:62;23455:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23636:21;23645:2;23649:7;23636:8;:21::i;:::-;23324:341;23254:411;;:::o;24481:339::-;24676:41;24695:12;:10;:12::i;:::-;24709:7;24676:18;:41::i;:::-;24668:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24784:28;24794:4;24800:2;24804:7;24784:9;:28::i;:::-;24481:339;;;:::o;36678:24::-;;;;;;;;;;;;;:::o;37093:530::-;37170:9;37157;:22;;37149:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37245:5;;;;;;;;;;;37235:15;;:7;;;;;;;;;;;:15;;;37227:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37306:1;37295:7;;:12;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37333:4;37318:8;:12;37327:2;37318:12;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;37348:22;37358:2;37362:7;;;;;;;;;;;37348:22;;:9;:22::i;:::-;37381:121;37408:7;;;;;;;;;;;37381:121;;37455:25;37472:7;;;;;;;;;;;37455:25;;:16;:25::i;:::-;37438:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;37381:12;:121::i;:::-;37514:9;37529:11;;;;;;;;;;;:16;;37553:9;37529:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37513:54;;;37586:4;37578:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;37138:485;37093:530;:::o;24891:185::-;25029:39;25046:4;25052:2;25056:7;25029:39;;;;;;;;;;;;:16;:39::i;:::-;24891:185;;;:::o;36204:245::-;36322:41;36341:12;:10;:12::i;:::-;36355:7;36322:18;:41::i;:::-;36314:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;36427:14;36433:7;36427:5;:14::i;:::-;36204:245;:::o;36709:26::-;;;;;;;;;;;;;:::o;36651:20::-;;;;;;;;;;;;;:::o;21866:239::-;21938:7;21958:13;21974:7;:16;21982:7;21974:16;;;;;;;;;;;;;;;;;;;;;21958:32;;22026:1;22009:19;;:5;:19;;;;22001:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22092:5;22085:12;;;21866:239;;;:::o;21596:208::-;21668:7;21713:1;21696:19;;:5;:19;;;;21688:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21780:9;:16;21790:5;21780:16;;;;;;;;;;;;;;;;21773:23;;21596:208;;;:::o;22341:104::-;22397:13;22430:7;22423:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22341:104;:::o;36744:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;24024:155::-;24119:52;24138:12;:10;:12::i;:::-;24152:8;24162;24119:18;:52::i;:::-;24024:155;;:::o;25147:328::-;25322:41;25341:12;:10;:12::i;:::-;25355:7;25322:18;:41::i;:::-;25314:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25428:39;25442:4;25448:2;25452:7;25461:5;25428:13;:39::i;:::-;25147:328;;;;:::o;38016:196::-;38143:13;38181:23;38196:7;38181:14;:23::i;:::-;38174:30;;38016:196;;;:::o;24250:164::-;24347:4;24371:18;:25;24390:5;24371:25;;;;;;;;;;;;;;;:35;24397:8;24371:35;;;;;;;;;;;;;;;;;;;;;;;;;24364:42;;24250:164;;;;:::o;19673:157::-;19758:4;19797:25;19782:40;;;:11;:40;;;;19775:47;;19673:157;;;:::o;26985:127::-;27050:4;27102:1;27074:30;;:7;:16;27082:7;27074:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27067:37;;26985:127;;;:::o;16474:98::-;16527:7;16554:10;16547:17;;16474:98;:::o;30967:174::-;31069:2;31042:15;:24;31058:7;31042:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31125:7;31121:2;31087:46;;31096:23;31111:7;31096:14;:23::i;:::-;31087:46;;;;;;;;;;;;30967:174;;:::o;27279:348::-;27372:4;27397:16;27405:7;27397;:16::i;:::-;27389:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27473:13;27489:23;27504:7;27489:14;:23::i;:::-;27473:39;;27542:5;27531:16;;:7;:16;;;:51;;;;27575:7;27551:31;;:20;27563:7;27551:11;:20::i;:::-;:31;;;27531:51;:87;;;;27586:32;27603:5;27610:7;27586:16;:32::i;:::-;27531:87;27523:96;;;27279:348;;;;:::o;30271:578::-;30430:4;30403:31;;:23;30418:7;30403:14;:23::i;:::-;:31;;;30395:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30513:1;30499:16;;:2;:16;;;;30491:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30569:39;30590:4;30596:2;30600:7;30569:20;:39::i;:::-;30673:29;30690:1;30694:7;30673:8;:29::i;:::-;30734:1;30715:9;:15;30725:4;30715:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30763:1;30746:9;:13;30756:2;30746:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30794:2;30775:7;:16;30783:7;30775:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30833:7;30829:2;30814:27;;30823:4;30814:27;;;;;;;;;;;;30271:578;;;:::o;27969:110::-;28045:26;28055:2;28059:7;28045:26;;;;;;;;;;;;:9;:26::i;:::-;27969:110;;:::o;17051:723::-;17107:13;17337:1;17328:5;:10;17324:53;;;17355:10;;;;;;;;;;;;;;;;;;;;;17324:53;17387:12;17402:5;17387:20;;17418:14;17443:78;17458:1;17450:4;:9;17443:78;;17476:8;;;;;:::i;:::-;;;;17507:2;17499:10;;;;;:::i;:::-;;;17443:78;;;17531:19;17563:6;17553:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17531:39;;17581:154;17597:1;17588:5;:10;17581:154;;17625:1;17615:11;;;;;:::i;:::-;;;17692:2;17684:5;:10;;;;:::i;:::-;17671:2;:24;;;;:::i;:::-;17658:39;;17641:6;17648;17641:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17721:2;17712:11;;;;;:::i;:::-;;;17581:154;;;17759:6;17745:21;;;;;17051:723;;;;:::o;35011:217::-;35111:16;35119:7;35111;:16::i;:::-;35103:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35211:9;35189:10;:19;35200:7;35189:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;35011:217;;:::o;37893:115::-;37980:20;37992:7;37980:11;:20::i;:::-;37893:115;:::o;31283:315::-;31438:8;31429:17;;:5;:17;;;;31421:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31525:8;31487:18;:25;31506:5;31487:25;;;;;;;;;;;;;;;:35;31513:8;31487:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31571:8;31549:41;;31564:5;31549:41;;;31581:8;31549:41;;;;;;:::i;:::-;;;;;;;;31283:315;;;:::o;26357:::-;26514:28;26524:4;26530:2;26534:7;26514:9;:28::i;:::-;26561:48;26584:4;26590:2;26594:7;26603:5;26561:22;:48::i;:::-;26553:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26357:315;;;;:::o;34176:679::-;34249:13;34283:16;34291:7;34283;:16::i;:::-;34275:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;34366:23;34392:10;:19;34403:7;34392:19;;;;;;;;;;;34366:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34422:18;34443:10;:8;:10::i;:::-;34422:31;;34551:1;34535:4;34529:18;:23;34525:72;;;34576:9;34569:16;;;;;;34525:72;34727:1;34707:9;34701:23;:27;34697:108;;;34776:4;34782:9;34759:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34745:48;;;;;;34697:108;34824:23;34839:7;34824:14;:23::i;:::-;34817:30;;;;34176:679;;;;:::o;37699:186::-;37832:45;37859:4;37865:2;37869:7;37832:26;:45::i;:::-;37699:186;;;:::o;28306:321::-;28436:18;28442:2;28446:7;28436:5;:18::i;:::-;28487:54;28518:1;28522:2;28526:7;28535:5;28487:22;:54::i;:::-;28465:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28306:321;;;:::o;35457:206::-;35526:20;35538:7;35526:11;:20::i;:::-;35600:1;35569:10;:19;35580:7;35569:19;;;;;;;;;;;35563:33;;;;;:::i;:::-;;;:38;35559:97;;35625:10;:19;35636:7;35625:19;;;;;;;;;;;;35618:26;;;;:::i;:::-;35559:97;35457:206;:::o;32163:799::-;32318:4;32339:15;:2;:13;;;:15::i;:::-;32335:620;;;32391:2;32375:36;;;32412:12;:10;:12::i;:::-;32426:4;32432:7;32441:5;32375:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32371:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32634:1;32617:6;:13;:18;32613:272;;;32660:60;;;;;;;;;;:::i;:::-;;;;;;;;32613:272;32835:6;32829:13;32820:6;32816:2;32812:15;32805:38;32371:529;32508:41;;;32498:51;;;:6;:51;;;;32491:58;;;;;32335:620;32939:4;32932:11;;32163:799;;;;;;;:::o;36922:163::-;36974:13;37000:77;;;;;;;;;;;;;;;;;;;36922:163;:::o;22516:334::-;22589:13;22623:16;22631:7;22623;:16::i;:::-;22615:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22704:21;22728:10;:8;:10::i;:::-;22704:34;;22780:1;22762:7;22756:21;:25;:86;;;;;;;;;;;;;;;;;22808:7;22817:18;:7;:16;:18::i;:::-;22791:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22756:86;22749:93;;;22516:334;;;:::o;33534:126::-;;;;:::o;28963:382::-;29057:1;29043:16;;:2;:16;;;;29035:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29116:16;29124:7;29116;:16::i;:::-;29115:17;29107:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29178:45;29207:1;29211:2;29215:7;29178:20;:45::i;:::-;29253:1;29236:9;:13;29246:2;29236:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29284:2;29265:7;:16;29273:7;29265:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29329:7;29325:2;29304:33;;29321:1;29304:33;;;;;;;;;;;;28963:382;;:::o;29574:360::-;29634:13;29650:23;29665:7;29650:14;:23::i;:::-;29634:39;;29686:48;29707:5;29722:1;29726:7;29686:20;:48::i;:::-;29775:29;29792:1;29796:7;29775:8;:29::i;:::-;29837:1;29817:9;:16;29827:5;29817:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29856:7;:16;29864:7;29856:16;;;;;;;;;;;;29849:23;;;;;;;;;;;29918:7;29914:1;29890:36;;29899:5;29890:36;;;;;;;;;;;;29623:311;29574:360;:::o;8466:387::-;8526:4;8734:12;8801:7;8789:20;8781:28;;8844:1;8837:4;:8;8830:15;;;8466:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:147:1:-;108:11;145:3;130:18;;7:147;;;;:::o;160:114::-;;:::o;280:398::-;439:3;460:83;541:1;536:3;460:83;:::i;:::-;453:90;;552:93;641:3;552:93;:::i;:::-;670:1;665:3;661:11;654:18;;280:398;;;:::o;684:379::-;868:3;890:147;1033:3;890:147;:::i;:::-;883:154;;1054:3;1047:10;;684:379;;;:::o;1069:169::-;1153:11;1187:6;1182:3;1175:19;1227:4;1222:3;1218:14;1203:29;;1069:169;;;;:::o;1244:170::-;1384:22;1380:1;1372:6;1368:14;1361:46;1244:170;:::o;1420:366::-;1562:3;1583:67;1647:2;1642:3;1583:67;:::i;:::-;1576:74;;1659:93;1748:3;1659:93;:::i;:::-;1777:2;1772:3;1768:12;1761:19;;1420:366;;;:::o;1792:419::-;1958:4;1996:2;1985:9;1981:18;1973:26;;2045:9;2039:4;2035:20;2031:1;2020:9;2016:17;2009:47;2073:131;2199:4;2073:131;:::i;:::-;2065:139;;1792:419;;;:::o;2217:75::-;2250:6;2283:2;2277:9;2267:19;;2217:75;:::o;2298:117::-;2407:1;2404;2397:12;2421:117;2530:1;2527;2520:12;2544:149;2580:7;2620:66;2613:5;2609:78;2598:89;;2544:149;;;:::o;2699:120::-;2771:23;2788:5;2771:23;:::i;:::-;2764:5;2761:34;2751:62;;2809:1;2806;2799:12;2751:62;2699:120;:::o;2825:137::-;2870:5;2908:6;2895:20;2886:29;;2924:32;2950:5;2924:32;:::i;:::-;2825:137;;;;:::o;2968:327::-;3026:6;3075:2;3063:9;3054:7;3050:23;3046:32;3043:119;;;3081:79;;:::i;:::-;3043:119;3201:1;3226:52;3270:7;3261:6;3250:9;3246:22;3226:52;:::i;:::-;3216:62;;3172:116;2968:327;;;;:::o;3301:90::-;3335:7;3378:5;3371:13;3364:21;3353:32;;3301:90;;;:::o;3397:109::-;3478:21;3493:5;3478:21;:::i;:::-;3473:3;3466:34;3397:109;;:::o;3512:210::-;3599:4;3637:2;3626:9;3622:18;3614:26;;3650:65;3712:1;3701:9;3697:17;3688:6;3650:65;:::i;:::-;3512:210;;;;:::o;3728:99::-;3780:6;3814:5;3808:12;3798:22;;3728:99;;;:::o;3833:307::-;3901:1;3911:113;3925:6;3922:1;3919:13;3911:113;;;4010:1;4005:3;4001:11;3995:18;3991:1;3986:3;3982:11;3975:39;3947:2;3944:1;3940:10;3935:15;;3911:113;;;4042:6;4039:1;4036:13;4033:101;;;4122:1;4113:6;4108:3;4104:16;4097:27;4033:101;3882:258;3833:307;;;:::o;4146:102::-;4187:6;4238:2;4234:7;4229:2;4222:5;4218:14;4214:28;4204:38;;4146:102;;;:::o;4254:364::-;4342:3;4370:39;4403:5;4370:39;:::i;:::-;4425:71;4489:6;4484:3;4425:71;:::i;:::-;4418:78;;4505:52;4550:6;4545:3;4538:4;4531:5;4527:16;4505:52;:::i;:::-;4582:29;4604:6;4582:29;:::i;:::-;4577:3;4573:39;4566:46;;4346:272;4254:364;;;;:::o;4624:313::-;4737:4;4775:2;4764:9;4760:18;4752:26;;4824:9;4818:4;4814:20;4810:1;4799:9;4795:17;4788:47;4852:78;4925:4;4916:6;4852:78;:::i;:::-;4844:86;;4624:313;;;;:::o;4943:77::-;4980:7;5009:5;4998:16;;4943:77;;;:::o;5026:122::-;5099:24;5117:5;5099:24;:::i;:::-;5092:5;5089:35;5079:63;;5138:1;5135;5128:12;5079:63;5026:122;:::o;5154:139::-;5200:5;5238:6;5225:20;5216:29;;5254:33;5281:5;5254:33;:::i;:::-;5154:139;;;;:::o;5299:329::-;5358:6;5407:2;5395:9;5386:7;5382:23;5378:32;5375:119;;;5413:79;;:::i;:::-;5375:119;5533:1;5558:53;5603:7;5594:6;5583:9;5579:22;5558:53;:::i;:::-;5548:63;;5504:117;5299:329;;;;:::o;5634:126::-;5671:7;5711:42;5704:5;5700:54;5689:65;;5634:126;;;:::o;5766:96::-;5803:7;5832:24;5850:5;5832:24;:::i;:::-;5821:35;;5766:96;;;:::o;5868:118::-;5955:24;5973:5;5955:24;:::i;:::-;5950:3;5943:37;5868:118;;:::o;5992:222::-;6085:4;6123:2;6112:9;6108:18;6100:26;;6136:71;6204:1;6193:9;6189:17;6180:6;6136:71;:::i;:::-;5992:222;;;;:::o;6220:122::-;6293:24;6311:5;6293:24;:::i;:::-;6286:5;6283:35;6273:63;;6332:1;6329;6322:12;6273:63;6220:122;:::o;6348:139::-;6394:5;6432:6;6419:20;6410:29;;6448:33;6475:5;6448:33;:::i;:::-;6348:139;;;;:::o;6493:474::-;6561:6;6569;6618:2;6606:9;6597:7;6593:23;6589:32;6586:119;;;6624:79;;:::i;:::-;6586:119;6744:1;6769:53;6814:7;6805:6;6794:9;6790:22;6769:53;:::i;:::-;6759:63;;6715:117;6871:2;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6842:118;6493:474;;;;;:::o;6973:619::-;7050:6;7058;7066;7115:2;7103:9;7094:7;7090:23;7086:32;7083:119;;;7121:79;;:::i;:::-;7083:119;7241:1;7266:53;7311:7;7302:6;7291:9;7287:22;7266:53;:::i;:::-;7256:63;;7212:117;7368:2;7394:53;7439:7;7430:6;7419:9;7415:22;7394:53;:::i;:::-;7384:63;;7339:118;7496:2;7522:53;7567:7;7558:6;7547:9;7543:22;7522:53;:::i;:::-;7512:63;;7467:118;6973:619;;;;;:::o;7598:86::-;7633:7;7673:4;7666:5;7662:16;7651:27;;7598:86;;;:::o;7690:112::-;7773:22;7789:5;7773:22;:::i;:::-;7768:3;7761:35;7690:112;;:::o;7808:214::-;7897:4;7935:2;7924:9;7920:18;7912:26;;7948:67;8012:1;8001:9;7997:17;7988:6;7948:67;:::i;:::-;7808:214;;;;:::o;8028:329::-;8087:6;8136:2;8124:9;8115:7;8111:23;8107:32;8104:119;;;8142:79;;:::i;:::-;8104:119;8262:1;8287:53;8332:7;8323:6;8312:9;8308:22;8287:53;:::i;:::-;8277:63;;8233:117;8028:329;;;;:::o;8363:118::-;8450:24;8468:5;8450:24;:::i;:::-;8445:3;8438:37;8363:118;;:::o;8487:222::-;8580:4;8618:2;8607:9;8603:18;8595:26;;8631:71;8699:1;8688:9;8684:17;8675:6;8631:71;:::i;:::-;8487:222;;;;:::o;8715:116::-;8785:21;8800:5;8785:21;:::i;:::-;8778:5;8775:32;8765:60;;8821:1;8818;8811:12;8765:60;8715:116;:::o;8837:133::-;8880:5;8918:6;8905:20;8896:29;;8934:30;8958:5;8934:30;:::i;:::-;8837:133;;;;:::o;8976:468::-;9041:6;9049;9098:2;9086:9;9077:7;9073:23;9069:32;9066:119;;;9104:79;;:::i;:::-;9066:119;9224:1;9249:53;9294:7;9285:6;9274:9;9270:22;9249:53;:::i;:::-;9239:63;;9195:117;9351:2;9377:50;9419:7;9410:6;9399:9;9395:22;9377:50;:::i;:::-;9367:60;;9322:115;8976:468;;;;;:::o;9450:117::-;9559:1;9556;9549:12;9573:117;9682:1;9679;9672:12;9696:180;9744:77;9741:1;9734:88;9841:4;9838:1;9831:15;9865:4;9862:1;9855:15;9882:281;9965:27;9987:4;9965:27;:::i;:::-;9957:6;9953:40;10095:6;10083:10;10080:22;10059:18;10047:10;10044:34;10041:62;10038:88;;;10106:18;;:::i;:::-;10038:88;10146:10;10142:2;10135:22;9925:238;9882:281;;:::o;10169:129::-;10203:6;10230:20;;:::i;:::-;10220:30;;10259:33;10287:4;10279:6;10259:33;:::i;:::-;10169:129;;;:::o;10304:307::-;10365:4;10455:18;10447:6;10444:30;10441:56;;;10477:18;;:::i;:::-;10441:56;10515:29;10537:6;10515:29;:::i;:::-;10507:37;;10599:4;10593;10589:15;10581:23;;10304:307;;;:::o;10617:154::-;10701:6;10696:3;10691;10678:30;10763:1;10754:6;10749:3;10745:16;10738:27;10617:154;;;:::o;10777:410::-;10854:5;10879:65;10895:48;10936:6;10895:48;:::i;:::-;10879:65;:::i;:::-;10870:74;;10967:6;10960:5;10953:21;11005:4;10998:5;10994:16;11043:3;11034:6;11029:3;11025:16;11022:25;11019:112;;;11050:79;;:::i;:::-;11019:112;11140:41;11174:6;11169:3;11164;11140:41;:::i;:::-;10860:327;10777:410;;;;;:::o;11206:338::-;11261:5;11310:3;11303:4;11295:6;11291:17;11287:27;11277:122;;11318:79;;:::i;:::-;11277:122;11435:6;11422:20;11460:78;11534:3;11526:6;11519:4;11511:6;11507:17;11460:78;:::i;:::-;11451:87;;11267:277;11206:338;;;;:::o;11550:943::-;11645:6;11653;11661;11669;11718:3;11706:9;11697:7;11693:23;11689:33;11686:120;;;11725:79;;:::i;:::-;11686:120;11845:1;11870:53;11915:7;11906:6;11895:9;11891:22;11870:53;:::i;:::-;11860:63;;11816:117;11972:2;11998:53;12043:7;12034:6;12023:9;12019:22;11998:53;:::i;:::-;11988:63;;11943:118;12100:2;12126:53;12171:7;12162:6;12151:9;12147:22;12126:53;:::i;:::-;12116:63;;12071:118;12256:2;12245:9;12241:18;12228:32;12287:18;12279:6;12276:30;12273:117;;;12309:79;;:::i;:::-;12273:117;12414:62;12468:7;12459:6;12448:9;12444:22;12414:62;:::i;:::-;12404:72;;12199:287;11550:943;;;;;;;:::o;12499:474::-;12567:6;12575;12624:2;12612:9;12603:7;12599:23;12595:32;12592:119;;;12630:79;;:::i;:::-;12592:119;12750:1;12775:53;12820:7;12811:6;12800:9;12796:22;12775:53;:::i;:::-;12765:63;;12721:117;12877:2;12903:53;12948:7;12939:6;12928:9;12924:22;12903:53;:::i;:::-;12893:63;;12848:118;12499:474;;;;;:::o;12979:180::-;13027:77;13024:1;13017:88;13124:4;13121:1;13114:15;13148:4;13145:1;13138:15;13165:320;13209:6;13246:1;13240:4;13236:12;13226:22;;13293:1;13287:4;13283:12;13314:18;13304:81;;13370:4;13362:6;13358:17;13348:27;;13304:81;13432:2;13424:6;13421:14;13401:18;13398:38;13395:84;;;13451:18;;:::i;:::-;13395:84;13216:269;13165:320;;;:::o;13491:231::-;13631:34;13627:1;13619:6;13615:14;13608:58;13700:14;13695:2;13687:6;13683:15;13676:39;13491:231;:::o;13728:366::-;13870:3;13891:67;13955:2;13950:3;13891:67;:::i;:::-;13884:74;;13967:93;14056:3;13967:93;:::i;:::-;14085:2;14080:3;14076:12;14069:19;;13728:366;;;:::o;14100:419::-;14266:4;14304:2;14293:9;14289:18;14281:26;;14353:9;14347:4;14343:20;14339:1;14328:9;14324:17;14317:47;14381:131;14507:4;14381:131;:::i;:::-;14373:139;;14100:419;;;:::o;14525:220::-;14665:34;14661:1;14653:6;14649:14;14642:58;14734:3;14729:2;14721:6;14717:15;14710:28;14525:220;:::o;14751:366::-;14893:3;14914:67;14978:2;14973:3;14914:67;:::i;:::-;14907:74;;14990:93;15079:3;14990:93;:::i;:::-;15108:2;15103:3;15099:12;15092:19;;14751:366;;;:::o;15123:419::-;15289:4;15327:2;15316:9;15312:18;15304:26;;15376:9;15370:4;15366:20;15362:1;15351:9;15347:17;15340:47;15404:131;15530:4;15404:131;:::i;:::-;15396:139;;15123:419;;;:::o;15548:243::-;15688:34;15684:1;15676:6;15672:14;15665:58;15757:26;15752:2;15744:6;15740:15;15733:51;15548:243;:::o;15797:366::-;15939:3;15960:67;16024:2;16019:3;15960:67;:::i;:::-;15953:74;;16036:93;16125:3;16036:93;:::i;:::-;16154:2;16149:3;16145:12;16138:19;;15797:366;;;:::o;16169:419::-;16335:4;16373:2;16362:9;16358:18;16350:26;;16422:9;16416:4;16412:20;16408:1;16397:9;16393:17;16386:47;16450:131;16576:4;16450:131;:::i;:::-;16442:139;;16169:419;;;:::o;16594:236::-;16734:34;16730:1;16722:6;16718:14;16711:58;16803:19;16798:2;16790:6;16786:15;16779:44;16594:236;:::o;16836:366::-;16978:3;16999:67;17063:2;17058:3;16999:67;:::i;:::-;16992:74;;17075:93;17164:3;17075:93;:::i;:::-;17193:2;17188:3;17184:12;17177:19;;16836:366;;;:::o;17208:419::-;17374:4;17412:2;17401:9;17397:18;17389:26;;17461:9;17455:4;17451:20;17447:1;17436:9;17432:17;17425:47;17489:131;17615:4;17489:131;:::i;:::-;17481:139;;17208:419;;;:::o;17633:182::-;17773:34;17769:1;17761:6;17757:14;17750:58;17633:182;:::o;17821:366::-;17963:3;17984:67;18048:2;18043:3;17984:67;:::i;:::-;17977:74;;18060:93;18149:3;18060:93;:::i;:::-;18178:2;18173:3;18169:12;18162:19;;17821:366;;;:::o;18193:419::-;18359:4;18397:2;18386:9;18382:18;18374:26;;18446:9;18440:4;18436:20;18432:1;18421:9;18417:17;18410:47;18474:131;18600:4;18474:131;:::i;:::-;18466:139;;18193:419;;;:::o;18618:179::-;18758:31;18754:1;18746:6;18742:14;18735:55;18618:179;:::o;18803:366::-;18945:3;18966:67;19030:2;19025:3;18966:67;:::i;:::-;18959:74;;19042:93;19131:3;19042:93;:::i;:::-;19160:2;19155:3;19151:12;19144:19;;18803:366;;;:::o;19175:419::-;19341:4;19379:2;19368:9;19364:18;19356:26;;19428:9;19422:4;19418:20;19414:1;19403:9;19399:17;19392:47;19456:131;19582:4;19456:131;:::i;:::-;19448:139;;19175:419;;;:::o;19600:180::-;19648:77;19645:1;19638:88;19745:4;19742:1;19735:15;19769:4;19766:1;19759:15;19786:237;19824:3;19843:18;19859:1;19843:18;:::i;:::-;19838:23;;19875:18;19891:1;19875:18;:::i;:::-;19870:23;;19965:1;19959:4;19955:12;19952:1;19949:19;19946:45;;;19971:18;;:::i;:::-;19946:45;20015:1;20012;20008:9;20001:16;;19786:237;;;;:::o;20029:148::-;20131:11;20168:3;20153:18;;20029:148;;;;:::o;20183:377::-;20289:3;20317:39;20350:5;20317:39;:::i;:::-;20372:89;20454:6;20449:3;20372:89;:::i;:::-;20365:96;;20470:52;20515:6;20510:3;20503:4;20496:5;20492:16;20470:52;:::i;:::-;20547:6;20542:3;20538:16;20531:23;;20293:267;20183:377;;;;:::o;20566:155::-;20706:7;20702:1;20694:6;20690:14;20683:31;20566:155;:::o;20727:400::-;20887:3;20908:84;20990:1;20985:3;20908:84;:::i;:::-;20901:91;;21001:93;21090:3;21001:93;:::i;:::-;21119:1;21114:3;21110:11;21103:18;;20727:400;;;:::o;21133:541::-;21366:3;21388:95;21479:3;21470:6;21388:95;:::i;:::-;21381:102;;21500:148;21644:3;21500:148;:::i;:::-;21493:155;;21665:3;21658:10;;21133:541;;;;:::o;21680:235::-;21820:34;21816:1;21808:6;21804:14;21797:58;21889:18;21884:2;21876:6;21872:15;21865:43;21680:235;:::o;21921:366::-;22063:3;22084:67;22148:2;22143:3;22084:67;:::i;:::-;22077:74;;22160:93;22249:3;22160:93;:::i;:::-;22278:2;22273:3;22269:12;22262:19;;21921:366;;;:::o;22293:419::-;22459:4;22497:2;22486:9;22482:18;22474:26;;22546:9;22540:4;22536:20;22532:1;22521:9;22517:17;22510:47;22574:131;22700:4;22574:131;:::i;:::-;22566:139;;22293:419;;;:::o;22718:228::-;22858:34;22854:1;22846:6;22842:14;22835:58;22927:11;22922:2;22914:6;22910:15;22903:36;22718:228;:::o;22952:366::-;23094:3;23115:67;23179:2;23174:3;23115:67;:::i;:::-;23108:74;;23191:93;23280:3;23191:93;:::i;:::-;23309:2;23304:3;23300:12;23293:19;;22952:366;;;:::o;23324:419::-;23490:4;23528:2;23517:9;23513:18;23505:26;;23577:9;23571:4;23567:20;23563:1;23552:9;23548:17;23541:47;23605:131;23731:4;23605:131;:::i;:::-;23597:139;;23324:419;;;:::o;23749:229::-;23889:34;23885:1;23877:6;23873:14;23866:58;23958:12;23953:2;23945:6;23941:15;23934:37;23749:229;:::o;23984:366::-;24126:3;24147:67;24211:2;24206:3;24147:67;:::i;:::-;24140:74;;24223:93;24312:3;24223:93;:::i;:::-;24341:2;24336:3;24332:12;24325:19;;23984:366;;;:::o;24356:419::-;24522:4;24560:2;24549:9;24545:18;24537:26;;24609:9;24603:4;24599:20;24595:1;24584:9;24580:17;24573:47;24637:131;24763:4;24637:131;:::i;:::-;24629:139;;24356:419;;;:::o;24781:231::-;24921:34;24917:1;24909:6;24905:14;24898:58;24990:14;24985:2;24977:6;24973:15;24966:39;24781:231;:::o;25018:366::-;25160:3;25181:67;25245:2;25240:3;25181:67;:::i;:::-;25174:74;;25257:93;25346:3;25257:93;:::i;:::-;25375:2;25370:3;25366:12;25359:19;;25018:366;;;:::o;25390:419::-;25556:4;25594:2;25583:9;25579:18;25571:26;;25643:9;25637:4;25633:20;25629:1;25618:9;25614:17;25607:47;25671:131;25797:4;25671:131;:::i;:::-;25663:139;;25390:419;;;:::o;25815:228::-;25955:34;25951:1;25943:6;25939:14;25932:58;26024:11;26019:2;26011:6;26007:15;26000:36;25815:228;:::o;26049:366::-;26191:3;26212:67;26276:2;26271:3;26212:67;:::i;:::-;26205:74;;26288:93;26377:3;26288:93;:::i;:::-;26406:2;26401:3;26397:12;26390:19;;26049:366;;;:::o;26421:419::-;26587:4;26625:2;26614:9;26610:18;26602:26;;26674:9;26668:4;26664:20;26660:1;26649:9;26645:17;26638:47;26702:131;26828:4;26702:131;:::i;:::-;26694:139;;26421:419;;;:::o;26846:223::-;26986:34;26982:1;26974:6;26970:14;26963:58;27055:6;27050:2;27042:6;27038:15;27031:31;26846:223;:::o;27075:366::-;27217:3;27238:67;27302:2;27297:3;27238:67;:::i;:::-;27231:74;;27314:93;27403:3;27314:93;:::i;:::-;27432:2;27427:3;27423:12;27416:19;;27075:366;;;:::o;27447:419::-;27613:4;27651:2;27640:9;27636:18;27628:26;;27700:9;27694:4;27690:20;27686:1;27675:9;27671:17;27664:47;27728:131;27854:4;27728:131;:::i;:::-;27720:139;;27447:419;;;:::o;27872:191::-;27912:4;27932:20;27950:1;27932:20;:::i;:::-;27927:25;;27966:20;27984:1;27966:20;:::i;:::-;27961:25;;28005:1;28002;27999:8;27996:34;;;28010:18;;:::i;:::-;27996:34;28055:1;28052;28048:9;28040:17;;27872:191;;;;:::o;28069:305::-;28109:3;28128:20;28146:1;28128:20;:::i;:::-;28123:25;;28162:20;28180:1;28162:20;:::i;:::-;28157:25;;28316:1;28248:66;28244:74;28241:1;28238:81;28235:107;;;28322:18;;:::i;:::-;28235:107;28366:1;28363;28359:9;28352:16;;28069:305;;;;:::o;28380:233::-;28419:3;28442:24;28460:5;28442:24;:::i;:::-;28433:33;;28488:66;28481:5;28478:77;28475:103;;;28558:18;;:::i;:::-;28475:103;28605:1;28598:5;28594:13;28587:20;;28380:233;;;:::o;28619:180::-;28667:77;28664:1;28657:88;28764:4;28761:1;28754:15;28788:4;28785:1;28778:15;28805:185;28845:1;28862:20;28880:1;28862:20;:::i;:::-;28857:25;;28896:20;28914:1;28896:20;:::i;:::-;28891:25;;28935:1;28925:35;;28940:18;;:::i;:::-;28925:35;28982:1;28979;28975:9;28970:14;;28805:185;;;;:::o;28996:176::-;29028:1;29045:20;29063:1;29045:20;:::i;:::-;29040:25;;29079:20;29097:1;29079:20;:::i;:::-;29074:25;;29118:1;29108:35;;29123:18;;:::i;:::-;29108:35;29164:1;29161;29157:9;29152:14;;28996:176;;;;:::o;29178:180::-;29226:77;29223:1;29216:88;29323:4;29320:1;29313:15;29347:4;29344:1;29337:15;29364:233;29504:34;29500:1;29492:6;29488:14;29481:58;29573:16;29568:2;29560:6;29556:15;29549:41;29364:233;:::o;29603:366::-;29745:3;29766:67;29830:2;29825:3;29766:67;:::i;:::-;29759:74;;29842:93;29931:3;29842:93;:::i;:::-;29960:2;29955:3;29951:12;29944:19;;29603:366;;;:::o;29975:419::-;30141:4;30179:2;30168:9;30164:18;30156:26;;30228:9;30222:4;30218:20;30214:1;30203:9;30199:17;30192:47;30256:131;30382:4;30256:131;:::i;:::-;30248:139;;29975:419;;;:::o;30400:175::-;30540:27;30536:1;30528:6;30524:14;30517:51;30400:175;:::o;30581:366::-;30723:3;30744:67;30808:2;30803:3;30744:67;:::i;:::-;30737:74;;30820:93;30909:3;30820:93;:::i;:::-;30938:2;30933:3;30929:12;30922:19;;30581:366;;;:::o;30953:419::-;31119:4;31157:2;31146:9;31142:18;31134:26;;31206:9;31200:4;31196:20;31192:1;31181:9;31177:17;31170:47;31234:131;31360:4;31234:131;:::i;:::-;31226:139;;30953:419;;;:::o;31378:237::-;31518:34;31514:1;31506:6;31502:14;31495:58;31587:20;31582:2;31574:6;31570:15;31563:45;31378:237;:::o;31621:366::-;31763:3;31784:67;31848:2;31843:3;31784:67;:::i;:::-;31777:74;;31860:93;31949:3;31860:93;:::i;:::-;31978:2;31973:3;31969:12;31962:19;;31621:366;;;:::o;31993:419::-;32159:4;32197:2;32186:9;32182:18;32174:26;;32246:9;32240:4;32236:20;32232:1;32221:9;32217:17;32210:47;32274:131;32400:4;32274:131;:::i;:::-;32266:139;;31993:419;;;:::o;32418:236::-;32558:34;32554:1;32546:6;32542:14;32535:58;32627:19;32622:2;32614:6;32610:15;32603:44;32418:236;:::o;32660:366::-;32802:3;32823:67;32887:2;32882:3;32823:67;:::i;:::-;32816:74;;32899:93;32988:3;32899:93;:::i;:::-;33017:2;33012:3;33008:12;33001:19;;32660:366;;;:::o;33032:419::-;33198:4;33236:2;33225:9;33221:18;33213:26;;33285:9;33279:4;33275:20;33271:1;33260:9;33256:17;33249:47;33313:131;33439:4;33313:131;:::i;:::-;33305:139;;33032:419;;;:::o;33457:435::-;33637:3;33659:95;33750:3;33741:6;33659:95;:::i;:::-;33652:102;;33771:95;33862:3;33853:6;33771:95;:::i;:::-;33764:102;;33883:3;33876:10;;33457:435;;;;;:::o;33898:98::-;33949:6;33983:5;33977:12;33967:22;;33898:98;;;:::o;34002:168::-;34085:11;34119:6;34114:3;34107:19;34159:4;34154:3;34150:14;34135:29;;34002:168;;;;:::o;34176:360::-;34262:3;34290:38;34322:5;34290:38;:::i;:::-;34344:70;34407:6;34402:3;34344:70;:::i;:::-;34337:77;;34423:52;34468:6;34463:3;34456:4;34449:5;34445:16;34423:52;:::i;:::-;34500:29;34522:6;34500:29;:::i;:::-;34495:3;34491:39;34484:46;;34266:270;34176:360;;;;:::o;34542:640::-;34737:4;34775:3;34764:9;34760:19;34752:27;;34789:71;34857:1;34846:9;34842:17;34833:6;34789:71;:::i;:::-;34870:72;34938:2;34927:9;34923:18;34914:6;34870:72;:::i;:::-;34952;35020:2;35009:9;35005:18;34996:6;34952:72;:::i;:::-;35071:9;35065:4;35061:20;35056:2;35045:9;35041:18;35034:48;35099:76;35170:4;35161:6;35099:76;:::i;:::-;35091:84;;34542:640;;;;;;;:::o;35188:141::-;35244:5;35275:6;35269:13;35260:22;;35291:32;35317:5;35291:32;:::i;:::-;35188:141;;;;:::o;35335:349::-;35404:6;35453:2;35441:9;35432:7;35428:23;35424:32;35421:119;;;35459:79;;:::i;:::-;35421:119;35579:1;35604:63;35659:7;35650:6;35639:9;35635:22;35604:63;:::i;:::-;35594:73;;35550:127;35335:349;;;;:::o;35690:234::-;35830:34;35826:1;35818:6;35814:14;35807:58;35899:17;35894:2;35886:6;35882:15;35875:42;35690:234;:::o;35930:366::-;36072:3;36093:67;36157:2;36152:3;36093:67;:::i;:::-;36086:74;;36169:93;36258:3;36169:93;:::i;:::-;36287:2;36282:3;36278:12;36271:19;;35930:366;;;:::o;36302:419::-;36468:4;36506:2;36495:9;36491:18;36483:26;;36555:9;36549:4;36545:20;36541:1;36530:9;36526:17;36519:47;36583:131;36709:4;36583:131;:::i;:::-;36575:139;;36302:419;;;:::o;36727:182::-;36867:34;36863:1;36855:6;36851:14;36844:58;36727:182;:::o;36915:366::-;37057:3;37078:67;37142:2;37137:3;37078:67;:::i;:::-;37071:74;;37154:93;37243:3;37154:93;:::i;:::-;37272:2;37267:3;37263:12;37256:19;;36915:366;;;:::o;37287:419::-;37453:4;37491:2;37480:9;37476:18;37468:26;;37540:9;37534:4;37530:20;37526:1;37515:9;37511:17;37504:47;37568:131;37694:4;37568:131;:::i;:::-;37560:139;;37287:419;;;:::o;37712:178::-;37852:30;37848:1;37840:6;37836:14;37829:54;37712:178;:::o;37896:366::-;38038:3;38059:67;38123:2;38118:3;38059:67;:::i;:::-;38052:74;;38135:93;38224:3;38135:93;:::i;:::-;38253:2;38248:3;38244:12;38237:19;;37896:366;;;:::o;38268:419::-;38434:4;38472:2;38461:9;38457:18;38449:26;;38521:9;38515:4;38511:20;38507:1;38496:9;38492:17;38485:47;38549:131;38675:4;38549:131;:::i;:::-;38541:139;;38268:419;;;:::o

Swarm Source

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

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