ETH Price: $2,494.49 (-0.97%)

Token

Signals in the Noise (PERLIN)
 

Overview

Max Total Supply

0 PERLIN

Holders

176

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PERLIN
0x97e2706841f0e10ae4e9c1b33111a0757c169014
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:
SimpleCollectible

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-06
*/

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/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/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/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/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/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/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 clea
     * red 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/ERC721.sol



pragma solidity ^0.8.0;







// File: @openzeppelin/contracts/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);
}



/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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: contracts/SimpleCollectible.sol

//"SPDX-License-Identifier: UNLICENSED"
pragma solidity ^0.8.7;
pragma experimental ABIEncoderV2;




contract SimpleCollectible is ERC721, Ownable {
    uint256 public tokenCounter;

    uint256 private _presalePrice = 0; //.00 ETH
    uint256 private _salePrice = 50000000000000000; // .05 ETH

    uint256 private _maxPerTx = 21; // Set to one higher than actual, to save gas on <= checks.

    uint256 public _presaleSupply = 100;
    uint256 public _totalSupply = 10000; 

    string private _baseTokenURI;
    uint private _saleState; // 0 - No sale. 1 - Presale. 2 - Main Sale.

    // Faciliating the needed functionality for the presale
    mapping(address => bool) addressToPreSaleEntry;

    constructor () ERC721 ("Signals in the Noise","PERLIN")  {
        tokenCounter = 0;
        _saleState = 0;
    }

    function mintPresaleCollectibles(uint256 _count) public payable {
        require(isPresaleOpen(), "Presale is not yet open. See wenPresale and wenSale for more info");
        require(!isPresaleComplete(), "Presale is over. See wenSale for more info");

        require(isWalletInPresale(msg.sender), "Wallet isnt in presale! The owner needs to addWalletToPresale.");
        require((_count + tokenCounter) <= _presaleSupply, "Ran out of NFTs for presale! Sry!");
        require(msg.value >= (_presalePrice * _count), "Ether value sent is too low");

        createCollectibles(_count);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");


        return string(abi.encodePacked(getBaseURI(), Strings.toString(tokenId)));
    }
    function mintCollectibles(uint256 _count) public payable {
        require(isSaleOpen(), "Sale is not yet open");
        require(isPresaleComplete(), "Presale has not started or is ongoing");
        require(_count < _maxPerTx, "Cant mint more than mintMax");
        require((_count + tokenCounter) <= _totalSupply, "Ran out of NFTs for sale! Sry!");
        require(msg.value >= (_salePrice * _count), "Ether value sent is not correct");

        createCollectibles(_count);
    }

    function createCollectibles(uint256 _count) private {
        for(uint i = 0; i < _count; i++) {
            createCollectible();
        }
    }

    function createCollectible() private {
            _safeMint(msg.sender, tokenCounter);
            tokenCounter = tokenCounter + 1;
    }
    
    function maxMintsPerTransaction() public view returns (uint) {
        return _maxPerTx - 1; //_maxPerTx is off by 1 for require checks in HOF Mint. Allows use of < instead of <=, less gas
    }

    function wenPresale() public view returns (string memory) {
        if(!isPresaleOpen()) return "#soon";
        return isPresaleComplete() ? "complete" : "now!";
    }

    function wenSale() public view returns (string memory) {
        if(!isSaleOpen()) return "#soon";
        return isSaleComplete() ? "complete" : "now!";
    }

    function isSaleOpen() public view returns (bool) {
        return _saleState == 2;
    }

    function isSaleComplete() public view returns (bool) {
        return tokenCounter == _totalSupply;
    }
    function isPresaleOpen() public view returns (bool) {
        return _saleState >= 1;
    }
    function isPresaleComplete() public view returns (bool) {
        return tokenCounter >= _presaleSupply;
    }
    
    function getSaleState() private view returns (uint){
        return _saleState;
    }
    
    function setSaleState(uint saleState) public onlyOwner {
        _saleState = saleState;
    }
    
    function getSalePrice() private view returns (uint){
        return _salePrice;
    }
    
    function getPresalePrice() private view returns (uint){
        return _presalePrice;
    }

    function isWalletInPresale(address _address) public view returns (bool) {
        return addressToPreSaleEntry[_address];
    }
    function addWalletToPreSale(address _address) public onlyOwner {
        addressToPreSaleEntry[_address] = true;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function getBaseURI() public view returns (string memory){
        return _baseTokenURI;
    }
    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[],"name":"_presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWalletToPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPresaleComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWalletInPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintCollectibles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintPresaleCollectibles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleState","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wenPresale","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wenSale","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600060085566b1a2bc2ec500006009556015600a556064600b55612710600c553480156200003157600080fd5b506040518060400160405280601481526020017f5369676e616c7320696e20746865204e6f6973650000000000000000000000008152506040518060400160405280600681526020017f5045524c494e00000000000000000000000000000000000000000000000000008152508160009080519060200190620000b6929190620001d6565b508060019080519060200190620000cf929190620001d6565b505050620000f2620000e66200010860201b60201c565b6200011060201b60201c565b60006007819055506000600e81905550620002eb565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e49062000286565b90600052602060002090601f01602090048101928262000208576000855562000254565b82601f106200022357805160ff191683800117855562000254565b8280016001018555821562000254579182015b828111156200025357825182559160200191906001019062000236565b5b50905062000263919062000267565b5090565b5b808211156200028257600081600090555060010162000268565b5090565b600060028204905060018216806200029f57607f821691505b60208210811415620002b657620002b5620002bc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f1880620002fb6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063b88d4fde116100a0578063d432877c1161006f578063d432877c146106e6578063e985e9c514610711578063eb4f847b1461074e578063f2fde38b14610779578063f449c3cb146107a2576101f9565b8063b88d4fde1461062a578063c31c0b6214610653578063c87b56dd1461067e578063d082e381146106bb576101f9565b80638aa42302116100dc5780638aa423021461058f5780638da5cb5b146105ab57806395d89b41146105d6578063a22cb46514610601576101f9565b806370a0823114610506578063714c539814610543578063715018a61461056e578063853828b614610585576101f9565b8063233f50661161019057806342842e0e1161015f57806342842e0e14610421578063444512941461044a57806355f804b3146104755780636352211e1461049e57806364aa0c79146104db576101f9565b8063233f50661461036757806323b872dd146103905780632e3fd2ac146103b95780633eaaf86b146103f6576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc5780631224e3e1146102f5578063178a8569146103205780631a0813301461033c576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063084c4088146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906129dd565b6107cd565b6040516102329190612f96565b60405180910390f35b34801561024757600080fd5b506102506108af565b60405161025d9190612fb1565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612a80565b610941565b60405161029a9190612f2f565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612a80565b6109c6565b005b3480156102d857600080fd5b506102f360048036038101906102ee919061299d565b610a4c565b005b34801561030157600080fd5b5061030a610b64565b6040516103179190612fb1565b60405180910390f35b61033a60048036038101906103359190612a80565b610c33565b005b34801561034857600080fd5b50610351610db3565b60405161035e9190612f96565b60405180910390f35b34801561037357600080fd5b5061038e6004803603810190610389919061281a565b610dc0565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612887565b610e97565b005b3480156103c557600080fd5b506103e060048036038101906103db919061281a565b610ef7565b6040516103ed9190612f96565b60405180910390f35b34801561040257600080fd5b5061040b610f4d565b6040516104189190613313565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190612887565b610f53565b005b34801561045657600080fd5b5061045f610f73565b60405161046c9190612fb1565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612a37565b611042565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612a80565b6110d8565b6040516104d29190612f2f565b60405180910390f35b3480156104e757600080fd5b506104f061118a565b6040516104fd9190613313565b60405180910390f35b34801561051257600080fd5b5061052d6004803603810190610528919061281a565b6111a0565b60405161053a9190613313565b60405180910390f35b34801561054f57600080fd5b50610558611258565b6040516105659190612fb1565b60405180910390f35b34801561057a57600080fd5b506105836112ea565b005b61058d611372565b005b6105a960048036038101906105a49190612a80565b61142e565b005b3480156105b757600080fd5b506105c06115b3565b6040516105cd9190612f2f565b60405180910390f35b3480156105e257600080fd5b506105eb6115dd565b6040516105f89190612fb1565b60405180910390f35b34801561060d57600080fd5b506106286004803603810190610623919061295d565b61166f565b005b34801561063657600080fd5b50610651600480360381019061064c91906128da565b6117f0565b005b34801561065f57600080fd5b50610668611852565b6040516106759190612f96565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612a80565b611860565b6040516106b29190612fb1565b60405180910390f35b3480156106c757600080fd5b506106d06118e2565b6040516106dd9190613313565b60405180910390f35b3480156106f257600080fd5b506106fb6118e8565b6040516107089190612f96565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612847565b6118f7565b6040516107459190612f96565b60405180910390f35b34801561075a57600080fd5b5061076361198b565b6040516107709190612f96565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061281a565b611999565b005b3480156107ae57600080fd5b506107b7611a91565b6040516107c49190613313565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a857506108a782611a97565b5b9050919050565b6060600080546108be906135c3565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea906135c3565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82611b01565b61098b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610982906131d3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109ce611b6d565b73ffffffffffffffffffffffffffffffffffffffff166109ec6115b3565b73ffffffffffffffffffffffffffffffffffffffff1614610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a39906131f3565b60405180910390fd5b80600e8190555050565b6000610a57826110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613273565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae7611b6d565b73ffffffffffffffffffffffffffffffffffffffff161480610b165750610b1581610b10611b6d565b6118f7565b5b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906130f3565b60405180910390fd5b610b5f8383611b75565b505050565b6060610b6e61198b565b610baf576040518060400160405280600581526020017f23736f6f6e0000000000000000000000000000000000000000000000000000008152509050610c30565b610bb76118e8565b610bf6576040518060400160405280600481526020017f6e6f772100000000000000000000000000000000000000000000000000000000815250610c2d565b6040518060400160405280600881526020017f636f6d706c6574650000000000000000000000000000000000000000000000008152505b90505b90565b610c3b610db3565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190613033565b60405180910390fd5b610c826118e8565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613293565b60405180910390fd5b600a548110610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613173565b60405180910390fd5b600c5460075482610d1691906133f8565b1115610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90613193565b60405180910390fd5b80600954610d65919061347f565b341015610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613093565b60405180910390fd5b610db081611c2e565b50565b60006002600e5414905090565b610dc8611b6d565b73ffffffffffffffffffffffffffffffffffffffff16610de66115b3565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906131f3565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610ea8610ea2611b6d565b82611c58565b610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906132d3565b60405180910390fd5b610ef2838383611d36565b505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c5481565b610f6e838383604051806020016040528060008152506117f0565b505050565b6060610f7d610db3565b610fbe576040518060400160405280600581526020017f23736f6f6e000000000000000000000000000000000000000000000000000000815250905061103f565b610fc6611852565b611005576040518060400160405280600481526020017f6e6f77210000000000000000000000000000000000000000000000000000000081525061103c565b6040518060400160405280600881526020017f636f6d706c6574650000000000000000000000000000000000000000000000008152505b90505b90565b61104a611b6d565b73ffffffffffffffffffffffffffffffffffffffff166110686115b3565b73ffffffffffffffffffffffffffffffffffffffff16146110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b5906131f3565b60405180910390fd5b80600d90805190602001906110d492919061262e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613133565b60405180910390fd5b80915050919050565b60006001600a5461119b91906134d9565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890613113565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600d8054611267906135c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611293906135c3565b80156112e05780601f106112b5576101008083540402835291602001916112e0565b820191906000526020600020905b8154815290600101906020018083116112c357829003601f168201915b5050505050905090565b6112f2611b6d565b73ffffffffffffffffffffffffffffffffffffffff166113106115b3565b73ffffffffffffffffffffffffffffffffffffffff1614611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d906131f3565b60405180910390fd5b6113706000611f92565b565b61137a611b6d565b73ffffffffffffffffffffffffffffffffffffffff166113986115b3565b73ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906131f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061142c57600080fd5b565b61143661198b565b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c906132b3565b60405180910390fd5b61147d6118e8565b156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b4906130d3565b60405180910390fd5b6114c633610ef7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906132f3565b60405180910390fd5b600b546007548261151691906133f8565b1115611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613253565b60405180910390fd5b80600854611565919061347f565b3410156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906131b3565b60405180910390fd5b6115b081611c2e565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ec906135c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611618906135c3565b80156116655780601f1061163a57610100808354040283529160200191611665565b820191906000526020600020905b81548152906001019060200180831161164857829003601f168201915b5050505050905090565b611677611b6d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90613073565b60405180910390fd5b80600560006116f2611b6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f611b6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e49190612f96565b60405180910390a35050565b6118016117fb611b6d565b83611c58565b611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906132d3565b60405180910390fd5b61184c84848484612058565b50505050565b6000600c5460075414905090565b606061186b82611b01565b6118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613233565b60405180910390fd5b6118b2611258565b6118bb836120b4565b6040516020016118cc929190612f0b565b6040516020818303038152906040529050919050565b60075481565b6000600b546007541015905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006001600e541015905090565b6119a1611b6d565b73ffffffffffffffffffffffffffffffffffffffff166119bf6115b3565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906131f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90612ff3565b60405180910390fd5b611a8e81611f92565b50565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be8836110d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b81811015611c5457611c41612215565b8080611c4c90613626565b915050611c31565b5050565b6000611c6382611b01565b611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906130b3565b60405180910390fd5b6000611cad836110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1c57508373ffffffffffffffffffffffffffffffffffffffff16611d0484610941565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d2d5750611d2c81856118f7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d56826110d8565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390613213565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390613053565b60405180910390fd5b611e27838383612238565b611e32600082611b75565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e8291906134d9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed991906133f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612063848484611d36565b61206f8484848461223d565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590612fd3565b60405180910390fd5b50505050565b606060008214156120fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612210565b600082905060005b6000821461212e57808061211790613626565b915050600a82612127919061344e565b9150612104565b60008167ffffffffffffffff81111561214a5761214961375c565b5b6040519080825280601f01601f19166020018201604052801561217c5781602001600182028036833780820191505090505b5090505b600085146122095760018261219591906134d9565b9150600a856121a4919061366f565b60306121b091906133f8565b60f81b8183815181106121c6576121c561372d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612202919061344e565b9450612180565b8093505050505b919050565b612221336007546123d4565b600160075461223091906133f8565b600781905550565b505050565b600061225e8473ffffffffffffffffffffffffffffffffffffffff166123f2565b156123c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612287611b6d565b8786866040518563ffffffff1660e01b81526004016122a99493929190612f4a565b602060405180830381600087803b1580156122c357600080fd5b505af19250505080156122f457506040513d601f19601f820116820180604052508101906122f19190612a0a565b60015b612377573d8060008114612324576040519150601f19603f3d011682016040523d82523d6000602084013e612329565b606091505b5060008151141561236f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236690612fd3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123cc565b600190505b949350505050565b6123ee828260405180602001604052806000815250612405565b5050565b600080823b905060008111915050919050565b61240f8383612460565b61241c600084848461223d565b61245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290612fd3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790613153565b60405180910390fd5b6124d981611b01565b15612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251090613013565b60405180910390fd5b61252560008383612238565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257591906133f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461263a906135c3565b90600052602060002090601f01602090048101928261265c57600085556126a3565b82601f1061267557805160ff19168380011785556126a3565b828001600101855582156126a3579182015b828111156126a2578251825591602001919060010190612687565b5b5090506126b091906126b4565b5090565b5b808211156126cd5760008160009055506001016126b5565b5090565b60006126e46126df84613353565b61332e565b905082815260208101848484011115612700576126ff613790565b5b61270b848285613581565b509392505050565b600061272661272184613384565b61332e565b90508281526020810184848401111561274257612741613790565b5b61274d848285613581565b509392505050565b60008135905061276481613e86565b92915050565b60008135905061277981613e9d565b92915050565b60008135905061278e81613eb4565b92915050565b6000815190506127a381613eb4565b92915050565b600082601f8301126127be576127bd61378b565b5b81356127ce8482602086016126d1565b91505092915050565b600082601f8301126127ec576127eb61378b565b5b81356127fc848260208601612713565b91505092915050565b60008135905061281481613ecb565b92915050565b6000602082840312156128305761282f61379a565b5b600061283e84828501612755565b91505092915050565b6000806040838503121561285e5761285d61379a565b5b600061286c85828601612755565b925050602061287d85828601612755565b9150509250929050565b6000806000606084860312156128a05761289f61379a565b5b60006128ae86828701612755565b93505060206128bf86828701612755565b92505060406128d086828701612805565b9150509250925092565b600080600080608085870312156128f4576128f361379a565b5b600061290287828801612755565b945050602061291387828801612755565b935050604061292487828801612805565b925050606085013567ffffffffffffffff81111561294557612944613795565b5b612951878288016127a9565b91505092959194509250565b600080604083850312156129745761297361379a565b5b600061298285828601612755565b92505060206129938582860161276a565b9150509250929050565b600080604083850312156129b4576129b361379a565b5b60006129c285828601612755565b92505060206129d385828601612805565b9150509250929050565b6000602082840312156129f3576129f261379a565b5b6000612a018482850161277f565b91505092915050565b600060208284031215612a2057612a1f61379a565b5b6000612a2e84828501612794565b91505092915050565b600060208284031215612a4d57612a4c61379a565b5b600082013567ffffffffffffffff811115612a6b57612a6a613795565b5b612a77848285016127d7565b91505092915050565b600060208284031215612a9657612a9561379a565b5b6000612aa484828501612805565b91505092915050565b612ab68161350d565b82525050565b612ac58161351f565b82525050565b6000612ad6826133b5565b612ae081856133cb565b9350612af0818560208601613590565b612af98161379f565b840191505092915050565b6000612b0f826133c0565b612b1981856133dc565b9350612b29818560208601613590565b612b328161379f565b840191505092915050565b6000612b48826133c0565b612b5281856133ed565b9350612b62818560208601613590565b80840191505092915050565b6000612b7b6032836133dc565b9150612b86826137b0565b604082019050919050565b6000612b9e6026836133dc565b9150612ba9826137ff565b604082019050919050565b6000612bc1601c836133dc565b9150612bcc8261384e565b602082019050919050565b6000612be46014836133dc565b9150612bef82613877565b602082019050919050565b6000612c076024836133dc565b9150612c12826138a0565b604082019050919050565b6000612c2a6019836133dc565b9150612c35826138ef565b602082019050919050565b6000612c4d601f836133dc565b9150612c5882613918565b602082019050919050565b6000612c70602c836133dc565b9150612c7b82613941565b604082019050919050565b6000612c93602a836133dc565b9150612c9e82613990565b604082019050919050565b6000612cb66038836133dc565b9150612cc1826139df565b604082019050919050565b6000612cd9602a836133dc565b9150612ce482613a2e565b604082019050919050565b6000612cfc6029836133dc565b9150612d0782613a7d565b604082019050919050565b6000612d1f6020836133dc565b9150612d2a82613acc565b602082019050919050565b6000612d42601b836133dc565b9150612d4d82613af5565b602082019050919050565b6000612d65601e836133dc565b9150612d7082613b1e565b602082019050919050565b6000612d88601b836133dc565b9150612d9382613b47565b602082019050919050565b6000612dab602c836133dc565b9150612db682613b70565b604082019050919050565b6000612dce6020836133dc565b9150612dd982613bbf565b602082019050919050565b6000612df16029836133dc565b9150612dfc82613be8565b604082019050919050565b6000612e14602f836133dc565b9150612e1f82613c37565b604082019050919050565b6000612e376021836133dc565b9150612e4282613c86565b604082019050919050565b6000612e5a6021836133dc565b9150612e6582613cd5565b604082019050919050565b6000612e7d6025836133dc565b9150612e8882613d24565b604082019050919050565b6000612ea06041836133dc565b9150612eab82613d73565b606082019050919050565b6000612ec36031836133dc565b9150612ece82613de8565b604082019050919050565b6000612ee6603e836133dc565b9150612ef182613e37565b604082019050919050565b612f0581613577565b82525050565b6000612f178285612b3d565b9150612f238284612b3d565b91508190509392505050565b6000602082019050612f446000830184612aad565b92915050565b6000608082019050612f5f6000830187612aad565b612f6c6020830186612aad565b612f796040830185612efc565b8181036060830152612f8b8184612acb565b905095945050505050565b6000602082019050612fab6000830184612abc565b92915050565b60006020820190508181036000830152612fcb8184612b04565b905092915050565b60006020820190508181036000830152612fec81612b6e565b9050919050565b6000602082019050818103600083015261300c81612b91565b9050919050565b6000602082019050818103600083015261302c81612bb4565b9050919050565b6000602082019050818103600083015261304c81612bd7565b9050919050565b6000602082019050818103600083015261306c81612bfa565b9050919050565b6000602082019050818103600083015261308c81612c1d565b9050919050565b600060208201905081810360008301526130ac81612c40565b9050919050565b600060208201905081810360008301526130cc81612c63565b9050919050565b600060208201905081810360008301526130ec81612c86565b9050919050565b6000602082019050818103600083015261310c81612ca9565b9050919050565b6000602082019050818103600083015261312c81612ccc565b9050919050565b6000602082019050818103600083015261314c81612cef565b9050919050565b6000602082019050818103600083015261316c81612d12565b9050919050565b6000602082019050818103600083015261318c81612d35565b9050919050565b600060208201905081810360008301526131ac81612d58565b9050919050565b600060208201905081810360008301526131cc81612d7b565b9050919050565b600060208201905081810360008301526131ec81612d9e565b9050919050565b6000602082019050818103600083015261320c81612dc1565b9050919050565b6000602082019050818103600083015261322c81612de4565b9050919050565b6000602082019050818103600083015261324c81612e07565b9050919050565b6000602082019050818103600083015261326c81612e2a565b9050919050565b6000602082019050818103600083015261328c81612e4d565b9050919050565b600060208201905081810360008301526132ac81612e70565b9050919050565b600060208201905081810360008301526132cc81612e93565b9050919050565b600060208201905081810360008301526132ec81612eb6565b9050919050565b6000602082019050818103600083015261330c81612ed9565b9050919050565b60006020820190506133286000830184612efc565b92915050565b6000613338613349565b905061334482826135f5565b919050565b6000604051905090565b600067ffffffffffffffff82111561336e5761336d61375c565b5b6133778261379f565b9050602081019050919050565b600067ffffffffffffffff82111561339f5761339e61375c565b5b6133a88261379f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061340382613577565b915061340e83613577565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613443576134426136a0565b5b828201905092915050565b600061345982613577565b915061346483613577565b925082613474576134736136cf565b5b828204905092915050565b600061348a82613577565b915061349583613577565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134ce576134cd6136a0565b5b828202905092915050565b60006134e482613577565b91506134ef83613577565b925082821015613502576135016136a0565b5b828203905092915050565b600061351882613557565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135ae578082015181840152602081019050613593565b838111156135bd576000848401525b50505050565b600060028204905060018216806135db57607f821691505b602082108114156135ef576135ee6136fe565b5b50919050565b6135fe8261379f565b810181811067ffffffffffffffff8211171561361d5761361c61375c565b5b80604052505050565b600061363182613577565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613664576136636136a0565b5b600182019050919050565b600061367a82613577565b915061368583613577565b925082613695576136946136cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206973206e6f7420796574206f70656e000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206f7665722e205365652077656e53616c6520666f7260008201527f206d6f726520696e666f00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e744d61780000000000600082015250565b7f52616e206f7574206f66204e46547320666f722073616c652120537279210000600082015250565b7f45746865722076616c75652073656e7420697320746f6f206c6f770000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f52616e206f7574206f66204e46547320666f722070726573616c65212053727960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c6520686173206e6f742073746172746564206f72206973206f6e60008201527f676f696e67000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f7420796574206f70656e2e205365652077656e60008201527f50726573616c6520616e642077656e53616c6520666f72206d6f726520696e6660208201527f6f00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57616c6c65742069736e7420696e2070726573616c652120546865206f776e6560008201527f72206e6565647320746f2061646457616c6c6574546f50726573616c652e0000602082015250565b613e8f8161350d565b8114613e9a57600080fd5b50565b613ea68161351f565b8114613eb157600080fd5b50565b613ebd8161352b565b8114613ec857600080fd5b50565b613ed481613577565b8114613edf57600080fd5b5056fea26469706673582212206b2689aa9c56d240ea91144eaceb769ad2a371423c1eaab970d3265eceb6595264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063b88d4fde116100a0578063d432877c1161006f578063d432877c146106e6578063e985e9c514610711578063eb4f847b1461074e578063f2fde38b14610779578063f449c3cb146107a2576101f9565b8063b88d4fde1461062a578063c31c0b6214610653578063c87b56dd1461067e578063d082e381146106bb576101f9565b80638aa42302116100dc5780638aa423021461058f5780638da5cb5b146105ab57806395d89b41146105d6578063a22cb46514610601576101f9565b806370a0823114610506578063714c539814610543578063715018a61461056e578063853828b614610585576101f9565b8063233f50661161019057806342842e0e1161015f57806342842e0e14610421578063444512941461044a57806355f804b3146104755780636352211e1461049e57806364aa0c79146104db576101f9565b8063233f50661461036757806323b872dd146103905780632e3fd2ac146103b95780633eaaf86b146103f6576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc5780631224e3e1146102f5578063178a8569146103205780631a0813301461033c576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063084c4088146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906129dd565b6107cd565b6040516102329190612f96565b60405180910390f35b34801561024757600080fd5b506102506108af565b60405161025d9190612fb1565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612a80565b610941565b60405161029a9190612f2f565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612a80565b6109c6565b005b3480156102d857600080fd5b506102f360048036038101906102ee919061299d565b610a4c565b005b34801561030157600080fd5b5061030a610b64565b6040516103179190612fb1565b60405180910390f35b61033a60048036038101906103359190612a80565b610c33565b005b34801561034857600080fd5b50610351610db3565b60405161035e9190612f96565b60405180910390f35b34801561037357600080fd5b5061038e6004803603810190610389919061281a565b610dc0565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612887565b610e97565b005b3480156103c557600080fd5b506103e060048036038101906103db919061281a565b610ef7565b6040516103ed9190612f96565b60405180910390f35b34801561040257600080fd5b5061040b610f4d565b6040516104189190613313565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190612887565b610f53565b005b34801561045657600080fd5b5061045f610f73565b60405161046c9190612fb1565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612a37565b611042565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612a80565b6110d8565b6040516104d29190612f2f565b60405180910390f35b3480156104e757600080fd5b506104f061118a565b6040516104fd9190613313565b60405180910390f35b34801561051257600080fd5b5061052d6004803603810190610528919061281a565b6111a0565b60405161053a9190613313565b60405180910390f35b34801561054f57600080fd5b50610558611258565b6040516105659190612fb1565b60405180910390f35b34801561057a57600080fd5b506105836112ea565b005b61058d611372565b005b6105a960048036038101906105a49190612a80565b61142e565b005b3480156105b757600080fd5b506105c06115b3565b6040516105cd9190612f2f565b60405180910390f35b3480156105e257600080fd5b506105eb6115dd565b6040516105f89190612fb1565b60405180910390f35b34801561060d57600080fd5b506106286004803603810190610623919061295d565b61166f565b005b34801561063657600080fd5b50610651600480360381019061064c91906128da565b6117f0565b005b34801561065f57600080fd5b50610668611852565b6040516106759190612f96565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612a80565b611860565b6040516106b29190612fb1565b60405180910390f35b3480156106c757600080fd5b506106d06118e2565b6040516106dd9190613313565b60405180910390f35b3480156106f257600080fd5b506106fb6118e8565b6040516107089190612f96565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612847565b6118f7565b6040516107459190612f96565b60405180910390f35b34801561075a57600080fd5b5061076361198b565b6040516107709190612f96565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061281a565b611999565b005b3480156107ae57600080fd5b506107b7611a91565b6040516107c49190613313565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a857506108a782611a97565b5b9050919050565b6060600080546108be906135c3565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea906135c3565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82611b01565b61098b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610982906131d3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109ce611b6d565b73ffffffffffffffffffffffffffffffffffffffff166109ec6115b3565b73ffffffffffffffffffffffffffffffffffffffff1614610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a39906131f3565b60405180910390fd5b80600e8190555050565b6000610a57826110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613273565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae7611b6d565b73ffffffffffffffffffffffffffffffffffffffff161480610b165750610b1581610b10611b6d565b6118f7565b5b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906130f3565b60405180910390fd5b610b5f8383611b75565b505050565b6060610b6e61198b565b610baf576040518060400160405280600581526020017f23736f6f6e0000000000000000000000000000000000000000000000000000008152509050610c30565b610bb76118e8565b610bf6576040518060400160405280600481526020017f6e6f772100000000000000000000000000000000000000000000000000000000815250610c2d565b6040518060400160405280600881526020017f636f6d706c6574650000000000000000000000000000000000000000000000008152505b90505b90565b610c3b610db3565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190613033565b60405180910390fd5b610c826118e8565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613293565b60405180910390fd5b600a548110610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613173565b60405180910390fd5b600c5460075482610d1691906133f8565b1115610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90613193565b60405180910390fd5b80600954610d65919061347f565b341015610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613093565b60405180910390fd5b610db081611c2e565b50565b60006002600e5414905090565b610dc8611b6d565b73ffffffffffffffffffffffffffffffffffffffff16610de66115b3565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906131f3565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610ea8610ea2611b6d565b82611c58565b610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906132d3565b60405180910390fd5b610ef2838383611d36565b505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c5481565b610f6e838383604051806020016040528060008152506117f0565b505050565b6060610f7d610db3565b610fbe576040518060400160405280600581526020017f23736f6f6e000000000000000000000000000000000000000000000000000000815250905061103f565b610fc6611852565b611005576040518060400160405280600481526020017f6e6f77210000000000000000000000000000000000000000000000000000000081525061103c565b6040518060400160405280600881526020017f636f6d706c6574650000000000000000000000000000000000000000000000008152505b90505b90565b61104a611b6d565b73ffffffffffffffffffffffffffffffffffffffff166110686115b3565b73ffffffffffffffffffffffffffffffffffffffff16146110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b5906131f3565b60405180910390fd5b80600d90805190602001906110d492919061262e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613133565b60405180910390fd5b80915050919050565b60006001600a5461119b91906134d9565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890613113565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600d8054611267906135c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611293906135c3565b80156112e05780601f106112b5576101008083540402835291602001916112e0565b820191906000526020600020905b8154815290600101906020018083116112c357829003601f168201915b5050505050905090565b6112f2611b6d565b73ffffffffffffffffffffffffffffffffffffffff166113106115b3565b73ffffffffffffffffffffffffffffffffffffffff1614611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d906131f3565b60405180910390fd5b6113706000611f92565b565b61137a611b6d565b73ffffffffffffffffffffffffffffffffffffffff166113986115b3565b73ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906131f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061142c57600080fd5b565b61143661198b565b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c906132b3565b60405180910390fd5b61147d6118e8565b156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b4906130d3565b60405180910390fd5b6114c633610ef7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906132f3565b60405180910390fd5b600b546007548261151691906133f8565b1115611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613253565b60405180910390fd5b80600854611565919061347f565b3410156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906131b3565b60405180910390fd5b6115b081611c2e565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ec906135c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611618906135c3565b80156116655780601f1061163a57610100808354040283529160200191611665565b820191906000526020600020905b81548152906001019060200180831161164857829003601f168201915b5050505050905090565b611677611b6d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90613073565b60405180910390fd5b80600560006116f2611b6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f611b6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e49190612f96565b60405180910390a35050565b6118016117fb611b6d565b83611c58565b611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906132d3565b60405180910390fd5b61184c84848484612058565b50505050565b6000600c5460075414905090565b606061186b82611b01565b6118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613233565b60405180910390fd5b6118b2611258565b6118bb836120b4565b6040516020016118cc929190612f0b565b6040516020818303038152906040529050919050565b60075481565b6000600b546007541015905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006001600e541015905090565b6119a1611b6d565b73ffffffffffffffffffffffffffffffffffffffff166119bf6115b3565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906131f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90612ff3565b60405180910390fd5b611a8e81611f92565b50565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be8836110d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b81811015611c5457611c41612215565b8080611c4c90613626565b915050611c31565b5050565b6000611c6382611b01565b611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906130b3565b60405180910390fd5b6000611cad836110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1c57508373ffffffffffffffffffffffffffffffffffffffff16611d0484610941565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d2d5750611d2c81856118f7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d56826110d8565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390613213565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390613053565b60405180910390fd5b611e27838383612238565b611e32600082611b75565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e8291906134d9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed991906133f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612063848484611d36565b61206f8484848461223d565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590612fd3565b60405180910390fd5b50505050565b606060008214156120fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612210565b600082905060005b6000821461212e57808061211790613626565b915050600a82612127919061344e565b9150612104565b60008167ffffffffffffffff81111561214a5761214961375c565b5b6040519080825280601f01601f19166020018201604052801561217c5781602001600182028036833780820191505090505b5090505b600085146122095760018261219591906134d9565b9150600a856121a4919061366f565b60306121b091906133f8565b60f81b8183815181106121c6576121c561372d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612202919061344e565b9450612180565b8093505050505b919050565b612221336007546123d4565b600160075461223091906133f8565b600781905550565b505050565b600061225e8473ffffffffffffffffffffffffffffffffffffffff166123f2565b156123c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612287611b6d565b8786866040518563ffffffff1660e01b81526004016122a99493929190612f4a565b602060405180830381600087803b1580156122c357600080fd5b505af19250505080156122f457506040513d601f19601f820116820180604052508101906122f19190612a0a565b60015b612377573d8060008114612324576040519150601f19603f3d011682016040523d82523d6000602084013e612329565b606091505b5060008151141561236f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236690612fd3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123cc565b600190505b949350505050565b6123ee828260405180602001604052806000815250612405565b5050565b600080823b905060008111915050919050565b61240f8383612460565b61241c600084848461223d565b61245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290612fd3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790613153565b60405180910390fd5b6124d981611b01565b15612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251090613013565b60405180910390fd5b61252560008383612238565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257591906133f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461263a906135c3565b90600052602060002090601f01602090048101928261265c57600085556126a3565b82601f1061267557805160ff19168380011785556126a3565b828001600101855582156126a3579182015b828111156126a2578251825591602001919060010190612687565b5b5090506126b091906126b4565b5090565b5b808211156126cd5760008160009055506001016126b5565b5090565b60006126e46126df84613353565b61332e565b905082815260208101848484011115612700576126ff613790565b5b61270b848285613581565b509392505050565b600061272661272184613384565b61332e565b90508281526020810184848401111561274257612741613790565b5b61274d848285613581565b509392505050565b60008135905061276481613e86565b92915050565b60008135905061277981613e9d565b92915050565b60008135905061278e81613eb4565b92915050565b6000815190506127a381613eb4565b92915050565b600082601f8301126127be576127bd61378b565b5b81356127ce8482602086016126d1565b91505092915050565b600082601f8301126127ec576127eb61378b565b5b81356127fc848260208601612713565b91505092915050565b60008135905061281481613ecb565b92915050565b6000602082840312156128305761282f61379a565b5b600061283e84828501612755565b91505092915050565b6000806040838503121561285e5761285d61379a565b5b600061286c85828601612755565b925050602061287d85828601612755565b9150509250929050565b6000806000606084860312156128a05761289f61379a565b5b60006128ae86828701612755565b93505060206128bf86828701612755565b92505060406128d086828701612805565b9150509250925092565b600080600080608085870312156128f4576128f361379a565b5b600061290287828801612755565b945050602061291387828801612755565b935050604061292487828801612805565b925050606085013567ffffffffffffffff81111561294557612944613795565b5b612951878288016127a9565b91505092959194509250565b600080604083850312156129745761297361379a565b5b600061298285828601612755565b92505060206129938582860161276a565b9150509250929050565b600080604083850312156129b4576129b361379a565b5b60006129c285828601612755565b92505060206129d385828601612805565b9150509250929050565b6000602082840312156129f3576129f261379a565b5b6000612a018482850161277f565b91505092915050565b600060208284031215612a2057612a1f61379a565b5b6000612a2e84828501612794565b91505092915050565b600060208284031215612a4d57612a4c61379a565b5b600082013567ffffffffffffffff811115612a6b57612a6a613795565b5b612a77848285016127d7565b91505092915050565b600060208284031215612a9657612a9561379a565b5b6000612aa484828501612805565b91505092915050565b612ab68161350d565b82525050565b612ac58161351f565b82525050565b6000612ad6826133b5565b612ae081856133cb565b9350612af0818560208601613590565b612af98161379f565b840191505092915050565b6000612b0f826133c0565b612b1981856133dc565b9350612b29818560208601613590565b612b328161379f565b840191505092915050565b6000612b48826133c0565b612b5281856133ed565b9350612b62818560208601613590565b80840191505092915050565b6000612b7b6032836133dc565b9150612b86826137b0565b604082019050919050565b6000612b9e6026836133dc565b9150612ba9826137ff565b604082019050919050565b6000612bc1601c836133dc565b9150612bcc8261384e565b602082019050919050565b6000612be46014836133dc565b9150612bef82613877565b602082019050919050565b6000612c076024836133dc565b9150612c12826138a0565b604082019050919050565b6000612c2a6019836133dc565b9150612c35826138ef565b602082019050919050565b6000612c4d601f836133dc565b9150612c5882613918565b602082019050919050565b6000612c70602c836133dc565b9150612c7b82613941565b604082019050919050565b6000612c93602a836133dc565b9150612c9e82613990565b604082019050919050565b6000612cb66038836133dc565b9150612cc1826139df565b604082019050919050565b6000612cd9602a836133dc565b9150612ce482613a2e565b604082019050919050565b6000612cfc6029836133dc565b9150612d0782613a7d565b604082019050919050565b6000612d1f6020836133dc565b9150612d2a82613acc565b602082019050919050565b6000612d42601b836133dc565b9150612d4d82613af5565b602082019050919050565b6000612d65601e836133dc565b9150612d7082613b1e565b602082019050919050565b6000612d88601b836133dc565b9150612d9382613b47565b602082019050919050565b6000612dab602c836133dc565b9150612db682613b70565b604082019050919050565b6000612dce6020836133dc565b9150612dd982613bbf565b602082019050919050565b6000612df16029836133dc565b9150612dfc82613be8565b604082019050919050565b6000612e14602f836133dc565b9150612e1f82613c37565b604082019050919050565b6000612e376021836133dc565b9150612e4282613c86565b604082019050919050565b6000612e5a6021836133dc565b9150612e6582613cd5565b604082019050919050565b6000612e7d6025836133dc565b9150612e8882613d24565b604082019050919050565b6000612ea06041836133dc565b9150612eab82613d73565b606082019050919050565b6000612ec36031836133dc565b9150612ece82613de8565b604082019050919050565b6000612ee6603e836133dc565b9150612ef182613e37565b604082019050919050565b612f0581613577565b82525050565b6000612f178285612b3d565b9150612f238284612b3d565b91508190509392505050565b6000602082019050612f446000830184612aad565b92915050565b6000608082019050612f5f6000830187612aad565b612f6c6020830186612aad565b612f796040830185612efc565b8181036060830152612f8b8184612acb565b905095945050505050565b6000602082019050612fab6000830184612abc565b92915050565b60006020820190508181036000830152612fcb8184612b04565b905092915050565b60006020820190508181036000830152612fec81612b6e565b9050919050565b6000602082019050818103600083015261300c81612b91565b9050919050565b6000602082019050818103600083015261302c81612bb4565b9050919050565b6000602082019050818103600083015261304c81612bd7565b9050919050565b6000602082019050818103600083015261306c81612bfa565b9050919050565b6000602082019050818103600083015261308c81612c1d565b9050919050565b600060208201905081810360008301526130ac81612c40565b9050919050565b600060208201905081810360008301526130cc81612c63565b9050919050565b600060208201905081810360008301526130ec81612c86565b9050919050565b6000602082019050818103600083015261310c81612ca9565b9050919050565b6000602082019050818103600083015261312c81612ccc565b9050919050565b6000602082019050818103600083015261314c81612cef565b9050919050565b6000602082019050818103600083015261316c81612d12565b9050919050565b6000602082019050818103600083015261318c81612d35565b9050919050565b600060208201905081810360008301526131ac81612d58565b9050919050565b600060208201905081810360008301526131cc81612d7b565b9050919050565b600060208201905081810360008301526131ec81612d9e565b9050919050565b6000602082019050818103600083015261320c81612dc1565b9050919050565b6000602082019050818103600083015261322c81612de4565b9050919050565b6000602082019050818103600083015261324c81612e07565b9050919050565b6000602082019050818103600083015261326c81612e2a565b9050919050565b6000602082019050818103600083015261328c81612e4d565b9050919050565b600060208201905081810360008301526132ac81612e70565b9050919050565b600060208201905081810360008301526132cc81612e93565b9050919050565b600060208201905081810360008301526132ec81612eb6565b9050919050565b6000602082019050818103600083015261330c81612ed9565b9050919050565b60006020820190506133286000830184612efc565b92915050565b6000613338613349565b905061334482826135f5565b919050565b6000604051905090565b600067ffffffffffffffff82111561336e5761336d61375c565b5b6133778261379f565b9050602081019050919050565b600067ffffffffffffffff82111561339f5761339e61375c565b5b6133a88261379f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061340382613577565b915061340e83613577565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613443576134426136a0565b5b828201905092915050565b600061345982613577565b915061346483613577565b925082613474576134736136cf565b5b828204905092915050565b600061348a82613577565b915061349583613577565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134ce576134cd6136a0565b5b828202905092915050565b60006134e482613577565b91506134ef83613577565b925082821015613502576135016136a0565b5b828203905092915050565b600061351882613557565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135ae578082015181840152602081019050613593565b838111156135bd576000848401525b50505050565b600060028204905060018216806135db57607f821691505b602082108114156135ef576135ee6136fe565b5b50919050565b6135fe8261379f565b810181811067ffffffffffffffff8211171561361d5761361c61375c565b5b80604052505050565b600061363182613577565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613664576136636136a0565b5b600182019050919050565b600061367a82613577565b915061368583613577565b925082613695576136946136cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206973206e6f7420796574206f70656e000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206f7665722e205365652077656e53616c6520666f7260008201527f206d6f726520696e666f00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e744d61780000000000600082015250565b7f52616e206f7574206f66204e46547320666f722073616c652120537279210000600082015250565b7f45746865722076616c75652073656e7420697320746f6f206c6f770000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f52616e206f7574206f66204e46547320666f722070726573616c65212053727960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c6520686173206e6f742073746172746564206f72206973206f6e60008201527f676f696e67000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f7420796574206f70656e2e205365652077656e60008201527f50726573616c6520616e642077656e53616c6520666f72206d6f726520696e6660208201527f6f00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57616c6c65742069736e7420696e2070726573616c652120546865206f776e6560008201527f72206e6565647320746f2061646457616c6c6574546f50726573616c652e0000602082015250565b613e8f8161350d565b8114613e9a57600080fd5b50565b613ea68161351f565b8114613eb157600080fd5b50565b613ebd8161352b565b8114613ec857600080fd5b50565b613ed481613577565b8114613edf57600080fd5b5056fea26469706673582212206b2689aa9c56d240ea91144eaceb769ad2a371423c1eaab970d3265eceb6595264736f6c63430008070033

Deployed Bytecode Sourcemap

35214:4445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22938:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23883:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25442:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38740:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24965:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37858:171;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36845:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38207:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39183:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26332:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39048:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35560:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26742:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38037:162;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39315:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23577:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37654:196;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23307:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39425:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:94;;;;;;;;;;;;;:::i;:::-;;39527:123;;;:::i;:::-;;35957:604;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1835:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24052:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25735:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26998:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38305:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36569:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35267:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38517:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26101:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38418:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2735:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35518:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22938:305;23040:4;23092:25;23077:40;;;:11;:40;;;;:105;;;;23149:33;23134:48;;;:11;:48;;;;23077:105;:158;;;;23199:36;23223:11;23199:23;:36::i;:::-;23077:158;23057:178;;22938:305;;;:::o;23883:100::-;23937:13;23970:5;23963:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23883:100;:::o;25442:221::-;25518:7;25546:16;25554:7;25546;:16::i;:::-;25538:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25631:15;:24;25647:7;25631:24;;;;;;;;;;;;;;;;;;;;;25624:31;;25442:221;;;:::o;38740:96::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38819:9:::1;38806:10;:22;;;;38740:96:::0;:::o;24965:411::-;25046:13;25062:23;25077:7;25062:14;:23::i;:::-;25046:39;;25110:5;25104:11;;:2;:11;;;;25096:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25204:5;25188:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25213:37;25230:5;25237:12;:10;:12::i;:::-;25213:16;:37::i;:::-;25188:62;25166:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25347:21;25356:2;25360:7;25347:8;:21::i;:::-;25035:341;24965:411;;:::o;37858:171::-;37901:13;37931:15;:13;:15::i;:::-;37927:35;;37948:14;;;;;;;;;;;;;;;;;;;;;37927:35;37980:19;:17;:19::i;:::-;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37973:48;;37858:171;;:::o;36845:491::-;36921:12;:10;:12::i;:::-;36913:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;36977:19;:17;:19::i;:::-;36969:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37066:9;;37057:6;:18;37049:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37153:12;;37136;;37127:6;:21;;;;:::i;:::-;37126:39;;37118:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;37246:6;37233:10;;:19;;;;:::i;:::-;37219:9;:34;;37211:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;37302:26;37321:6;37302:18;:26::i;:::-;36845:491;:::o;38207:90::-;38250:4;38288:1;38274:10;;:15;38267:22;;38207:90;:::o;39183:120::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39291:4:::1;39257:21;:31;39279:8;39257:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;39183:120:::0;:::o;26332:339::-;26527:41;26546:12;:10;:12::i;:::-;26560:7;26527:18;:41::i;:::-;26519:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26635:28;26645:4;26651:2;26655:7;26635:9;:28::i;:::-;26332:339;;;:::o;39048:129::-;39114:4;39138:21;:31;39160:8;39138:31;;;;;;;;;;;;;;;;;;;;;;;;;39131:38;;39048:129;;;:::o;35560:35::-;;;;:::o;26742:185::-;26880:39;26897:4;26903:2;26907:7;26880:39;;;;;;;;;;;;:16;:39::i;:::-;26742:185;;;:::o;38037:162::-;38077:13;38107:12;:10;:12::i;:::-;38103:32;;38121:14;;;;;;;;;;;;;;;;;;;;;38103:32;38153:16;:14;:16::i;:::-;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38146:45;;38037:162;;:::o;39315:102::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39402:7:::1;39386:13;:23;;;;;;;;;;;;:::i;:::-;;39315:102:::0;:::o;23577:239::-;23649:7;23669:13;23685:7;:16;23693:7;23685:16;;;;;;;;;;;;;;;;;;;;;23669:32;;23737:1;23720:19;;:5;:19;;;;23712:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23803:5;23796:12;;;23577:239;;;:::o;37654:196::-;37709:4;37745:1;37733:9;;:13;;;;:::i;:::-;37726:20;;37654:196;:::o;23307:208::-;23379:7;23424:1;23407:19;;:5;:19;;;;23399:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23491:9;:16;23501:5;23491:16;;;;;;;;;;;;;;;;23484:23;;23307:208;;;:::o;39425:96::-;39468:13;39500;39493:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39425:96;:::o;2486:94::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2551:21:::1;2569:1;2551:9;:21::i;:::-;2486:94::o:0;39527:123::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39602:10:::1;39594:24;;:47;39619:21;39594:47;;;;;;;;;;;;;;;;;;;;;;;39586:56;;;::::0;::::1;;39527:123::o:0;35957:604::-;36040:15;:13;:15::i;:::-;36032:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;36145:19;:17;:19::i;:::-;36144:20;36136:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:29;36250:10;36232:17;:29::i;:::-;36224:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;36374:14;;36357:12;;36348:6;:21;;;;:::i;:::-;36347:41;;36339:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36475:6;36459:13;;:22;;;;:::i;:::-;36445:9;:37;;36437:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36527:26;36546:6;36527:18;:26::i;:::-;35957:604;:::o;1835:87::-;1881:7;1908:6;;;;;;;;;;;1901:13;;1835:87;:::o;24052:104::-;24108:13;24141:7;24134:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24052:104;:::o;25735:295::-;25850:12;:10;:12::i;:::-;25838:24;;:8;:24;;;;25830:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25950:8;25905:18;:32;25924:12;:10;:12::i;:::-;25905:32;;;;;;;;;;;;;;;:42;25938:8;25905:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26003:8;25974:48;;25989:12;:10;:12::i;:::-;25974:48;;;26013:8;25974:48;;;;;;:::i;:::-;;;;;;;;25735:295;;:::o;26998:328::-;27173:41;27192:12;:10;:12::i;:::-;27206:7;27173:18;:41::i;:::-;27165:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27279:39;27293:4;27299:2;27303:7;27312:5;27279:13;:39::i;:::-;26998:328;;;;:::o;38305:107::-;38352:4;38392:12;;38376;;:28;38369:35;;38305:107;:::o;36569:270::-;36642:13;36676:16;36684:7;36676;:16::i;:::-;36668:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36790:12;:10;:12::i;:::-;36804:25;36821:7;36804:16;:25::i;:::-;36773:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36759:72;;36569:270;;;:::o;35267:27::-;;;;:::o;38517:112::-;38567:4;38607:14;;38591:12;;:30;;38584:37;;38517:112;:::o;26101:164::-;26198:4;26222:18;:25;26241:5;26222:25;;;;;;;;;;;;;;;:35;26248:8;26222:35;;;;;;;;;;;;;;;;;;;;;;;;;26215:42;;26101:164;;;;:::o;38418:93::-;38464:4;38502:1;38488:10;;:15;;38481:22;;38418:93;:::o;2735:192::-;2066:12;:10;:12::i;:::-;2055:23;;:7;:5;:7::i;:::-;:23;;;2047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2844:1:::1;2824:22;;:8;:22;;;;2816:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2900:19;2910:8;2900:9;:19::i;:::-;2735:192:::0;:::o;35518:35::-;;;;:::o;4762:157::-;4847:4;4886:25;4871:40;;;:11;:40;;;;4864:47;;4762:157;;;:::o;28836:127::-;28901:4;28953:1;28925:30;;:7;:16;28933:7;28925:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28918:37;;28836:127;;;:::o;711:98::-;764:7;791:10;784:17;;711:98;:::o;32818:174::-;32920:2;32893:15;:24;32909:7;32893:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32976:7;32972:2;32938:46;;32947:23;32962:7;32947:14;:23::i;:::-;32938:46;;;;;;;;;;;;32818:174;;:::o;37344:149::-;37411:6;37407:79;37427:6;37423:1;:10;37407:79;;;37455:19;:17;:19::i;:::-;37435:3;;;;;:::i;:::-;;;;37407:79;;;;37344:149;:::o;29130:348::-;29223:4;29248:16;29256:7;29248;:16::i;:::-;29240:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29324:13;29340:23;29355:7;29340:14;:23::i;:::-;29324:39;;29393:5;29382:16;;:7;:16;;;:51;;;;29426:7;29402:31;;:20;29414:7;29402:11;:20::i;:::-;:31;;;29382:51;:87;;;;29437:32;29454:5;29461:7;29437:16;:32::i;:::-;29382:87;29374:96;;;29130:348;;;;:::o;32122:578::-;32281:4;32254:31;;:23;32269:7;32254:14;:23::i;:::-;:31;;;32246:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32364:1;32350:16;;:2;:16;;;;32342:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32420:39;32441:4;32447:2;32451:7;32420:20;:39::i;:::-;32524:29;32541:1;32545:7;32524:8;:29::i;:::-;32585:1;32566:9;:15;32576:4;32566:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32614:1;32597:9;:13;32607:2;32597:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32645:2;32626:7;:16;32634:7;32626:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32684:7;32680:2;32665:27;;32674:4;32665:27;;;;;;;;;;;;32122:578;;;:::o;2935:173::-;2991:16;3010:6;;;;;;;;;;;2991:25;;3036:8;3027:6;;:17;;;;;;;;;;;;;;;;;;3091:8;3060:40;;3081:8;3060:40;;;;;;;;;;;;2980:128;2935:173;:::o;28208:315::-;28365:28;28375:4;28381:2;28385:7;28365:9;:28::i;:::-;28412:48;28435:4;28441:2;28445:7;28454:5;28412:22;:48::i;:::-;28404:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28208:315;;;;:::o;5237:723::-;5293:13;5523:1;5514:5;:10;5510:53;;;5541:10;;;;;;;;;;;;;;;;;;;;;5510:53;5573:12;5588:5;5573:20;;5604:14;5629:78;5644:1;5636:4;:9;5629:78;;5662:8;;;;;:::i;:::-;;;;5693:2;5685:10;;;;;:::i;:::-;;;5629:78;;;5717:19;5749:6;5739:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5717:39;;5767:154;5783:1;5774:5;:10;5767:154;;5811:1;5801:11;;;;;:::i;:::-;;;5878:2;5870:5;:10;;;;:::i;:::-;5857:2;:24;;;;:::i;:::-;5844:39;;5827:6;5834;5827:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5907:2;5898:11;;;;;:::i;:::-;;;5767:154;;;5945:6;5931:21;;;;;5237:723;;;;:::o;37501:141::-;37553:35;37563:10;37575:12;;37553:9;:35::i;:::-;37633:1;37618:12;;:16;;;;:::i;:::-;37603:12;:31;;;;37501:141::o;34928:126::-;;;;:::o;33557:799::-;33712:4;33733:15;:2;:13;;;:15::i;:::-;33729:620;;;33785:2;33769:36;;;33806:12;:10;:12::i;:::-;33820:4;33826:7;33835:5;33769:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33765:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34028:1;34011:6;:13;:18;34007:272;;;34054:60;;;;;;;;;;:::i;:::-;;;;;;;;34007:272;34229:6;34223:13;34214:6;34210:2;34206:15;34199:38;33765:529;33902:41;;;33892:51;;;:6;:51;;;;33885:58;;;;;33729:620;34333:4;34326:11;;33557:799;;;;;;;:::o;29820:110::-;29896:26;29906:2;29910:7;29896:26;;;;;;;;;;;;:9;:26::i;:::-;29820:110;;:::o;7764:387::-;7824:4;8032:12;8099:7;8087:20;8079:28;;8142:1;8135:4;:8;8128:15;;;7764:387;;;:::o;30157:321::-;30287:18;30293:2;30297:7;30287:5;:18::i;:::-;30338:54;30369:1;30373:2;30377:7;30386:5;30338:22;:54::i;:::-;30316:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30157:321;;;:::o;30814:382::-;30908:1;30894:16;;:2;:16;;;;30886:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30967:16;30975:7;30967;:16::i;:::-;30966:17;30958:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31029:45;31058:1;31062:2;31066:7;31029:20;:45::i;:::-;31104:1;31087:9;:13;31097:2;31087:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31135:2;31116:7;:16;31124:7;31116:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31180:7;31176:2;31155:33;;31172:1;31155:33;;;;;;;;;;;;30814:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:::-;16842:3;16863:67;16927:2;16922:3;16863:67;:::i;:::-;16856:74;;16939:93;17028:3;16939:93;:::i;:::-;17057:2;17052:3;17048:12;17041:19;;16700:366;;;:::o;17072:::-;17214:3;17235:67;17299:2;17294:3;17235:67;:::i;:::-;17228:74;;17311:93;17400:3;17311:93;:::i;:::-;17429:2;17424:3;17420:12;17413:19;;17072:366;;;:::o;17444:::-;17586:3;17607:67;17671:2;17666:3;17607:67;:::i;:::-;17600:74;;17683:93;17772:3;17683:93;:::i;:::-;17801:2;17796:3;17792:12;17785:19;;17444:366;;;:::o;17816:::-;17958:3;17979:67;18043:2;18038:3;17979:67;:::i;:::-;17972:74;;18055:93;18144:3;18055:93;:::i;:::-;18173:2;18168:3;18164:12;18157:19;;17816:366;;;:::o;18188:118::-;18275:24;18293:5;18275:24;:::i;:::-;18270:3;18263:37;18188:118;;:::o;18312:435::-;18492:3;18514:95;18605:3;18596:6;18514:95;:::i;:::-;18507:102;;18626:95;18717:3;18708:6;18626:95;:::i;:::-;18619:102;;18738:3;18731:10;;18312:435;;;;;:::o;18753:222::-;18846:4;18884:2;18873:9;18869:18;18861:26;;18897:71;18965:1;18954:9;18950:17;18941:6;18897:71;:::i;:::-;18753:222;;;;:::o;18981:640::-;19176:4;19214:3;19203:9;19199:19;19191:27;;19228:71;19296:1;19285:9;19281:17;19272:6;19228:71;:::i;:::-;19309:72;19377:2;19366:9;19362:18;19353:6;19309:72;:::i;:::-;19391;19459:2;19448:9;19444:18;19435:6;19391:72;:::i;:::-;19510:9;19504:4;19500:20;19495:2;19484:9;19480:18;19473:48;19538:76;19609:4;19600:6;19538:76;:::i;:::-;19530:84;;18981:640;;;;;;;:::o;19627:210::-;19714:4;19752:2;19741:9;19737:18;19729:26;;19765:65;19827:1;19816:9;19812:17;19803:6;19765:65;:::i;:::-;19627:210;;;;:::o;19843:313::-;19956:4;19994:2;19983:9;19979:18;19971:26;;20043:9;20037:4;20033:20;20029:1;20018:9;20014:17;20007:47;20071:78;20144:4;20135:6;20071:78;:::i;:::-;20063:86;;19843:313;;;;:::o;20162:419::-;20328:4;20366:2;20355:9;20351:18;20343:26;;20415:9;20409:4;20405:20;20401:1;20390:9;20386:17;20379:47;20443:131;20569:4;20443:131;:::i;:::-;20435:139;;20162:419;;;:::o;20587:::-;20753:4;20791:2;20780:9;20776:18;20768:26;;20840:9;20834:4;20830:20;20826:1;20815:9;20811:17;20804:47;20868:131;20994:4;20868:131;:::i;:::-;20860:139;;20587:419;;;:::o;21012:::-;21178:4;21216:2;21205:9;21201:18;21193:26;;21265:9;21259:4;21255:20;21251:1;21240:9;21236:17;21229:47;21293:131;21419:4;21293:131;:::i;:::-;21285:139;;21012:419;;;:::o;21437:::-;21603:4;21641:2;21630:9;21626:18;21618:26;;21690:9;21684:4;21680:20;21676:1;21665:9;21661:17;21654:47;21718:131;21844:4;21718:131;:::i;:::-;21710:139;;21437:419;;;:::o;21862:::-;22028:4;22066:2;22055:9;22051:18;22043:26;;22115:9;22109:4;22105:20;22101:1;22090:9;22086:17;22079:47;22143:131;22269:4;22143:131;:::i;:::-;22135:139;;21862:419;;;:::o;22287:::-;22453:4;22491:2;22480:9;22476:18;22468:26;;22540:9;22534:4;22530:20;22526:1;22515:9;22511:17;22504:47;22568:131;22694:4;22568:131;:::i;:::-;22560:139;;22287:419;;;:::o;22712:::-;22878:4;22916:2;22905:9;22901:18;22893:26;;22965:9;22959:4;22955:20;22951:1;22940:9;22936:17;22929:47;22993:131;23119:4;22993:131;:::i;:::-;22985:139;;22712:419;;;:::o;23137:::-;23303:4;23341:2;23330:9;23326:18;23318:26;;23390:9;23384:4;23380:20;23376:1;23365:9;23361:17;23354:47;23418:131;23544:4;23418:131;:::i;:::-;23410:139;;23137:419;;;:::o;23562:::-;23728:4;23766:2;23755:9;23751:18;23743:26;;23815:9;23809:4;23805:20;23801:1;23790:9;23786:17;23779:47;23843:131;23969:4;23843:131;:::i;:::-;23835:139;;23562:419;;;:::o;23987:::-;24153:4;24191:2;24180:9;24176:18;24168:26;;24240:9;24234:4;24230:20;24226:1;24215:9;24211:17;24204:47;24268:131;24394:4;24268:131;:::i;:::-;24260:139;;23987:419;;;:::o;24412:::-;24578:4;24616:2;24605:9;24601:18;24593:26;;24665:9;24659:4;24655:20;24651:1;24640:9;24636:17;24629:47;24693:131;24819:4;24693:131;:::i;:::-;24685:139;;24412:419;;;:::o;24837:::-;25003:4;25041:2;25030:9;25026:18;25018:26;;25090:9;25084:4;25080:20;25076:1;25065:9;25061:17;25054:47;25118:131;25244:4;25118:131;:::i;:::-;25110:139;;24837:419;;;:::o;25262:::-;25428:4;25466:2;25455:9;25451:18;25443:26;;25515:9;25509:4;25505:20;25501:1;25490:9;25486:17;25479:47;25543:131;25669:4;25543:131;:::i;:::-;25535:139;;25262:419;;;:::o;25687:::-;25853:4;25891:2;25880:9;25876:18;25868:26;;25940:9;25934:4;25930:20;25926:1;25915:9;25911:17;25904:47;25968:131;26094:4;25968:131;:::i;:::-;25960:139;;25687:419;;;:::o;26112:::-;26278:4;26316:2;26305:9;26301:18;26293:26;;26365:9;26359:4;26355:20;26351:1;26340:9;26336:17;26329:47;26393:131;26519:4;26393:131;:::i;:::-;26385:139;;26112:419;;;:::o;26537:::-;26703:4;26741:2;26730:9;26726:18;26718:26;;26790:9;26784:4;26780:20;26776:1;26765:9;26761:17;26754:47;26818:131;26944:4;26818:131;:::i;:::-;26810:139;;26537:419;;;:::o;26962:::-;27128:4;27166:2;27155:9;27151:18;27143:26;;27215:9;27209:4;27205:20;27201:1;27190:9;27186:17;27179:47;27243:131;27369:4;27243:131;:::i;:::-;27235:139;;26962:419;;;:::o;27387:::-;27553:4;27591:2;27580:9;27576:18;27568:26;;27640:9;27634:4;27630:20;27626:1;27615:9;27611:17;27604:47;27668:131;27794:4;27668:131;:::i;:::-;27660:139;;27387:419;;;:::o;27812:::-;27978:4;28016:2;28005:9;28001:18;27993:26;;28065:9;28059:4;28055:20;28051:1;28040:9;28036:17;28029:47;28093:131;28219:4;28093:131;:::i;:::-;28085:139;;27812:419;;;:::o;28237:::-;28403:4;28441:2;28430:9;28426:18;28418:26;;28490:9;28484:4;28480:20;28476:1;28465:9;28461:17;28454:47;28518:131;28644:4;28518:131;:::i;:::-;28510:139;;28237:419;;;:::o;28662:::-;28828:4;28866:2;28855:9;28851:18;28843:26;;28915:9;28909:4;28905:20;28901:1;28890:9;28886:17;28879:47;28943:131;29069:4;28943:131;:::i;:::-;28935:139;;28662:419;;;:::o;29087:::-;29253:4;29291:2;29280:9;29276:18;29268:26;;29340:9;29334:4;29330:20;29326:1;29315:9;29311:17;29304:47;29368:131;29494:4;29368:131;:::i;:::-;29360:139;;29087:419;;;:::o;29512:::-;29678:4;29716:2;29705:9;29701:18;29693:26;;29765:9;29759:4;29755:20;29751:1;29740:9;29736:17;29729:47;29793:131;29919:4;29793:131;:::i;:::-;29785:139;;29512:419;;;:::o;29937:::-;30103:4;30141:2;30130:9;30126:18;30118:26;;30190:9;30184:4;30180:20;30176:1;30165:9;30161:17;30154:47;30218:131;30344:4;30218:131;:::i;:::-;30210:139;;29937:419;;;:::o;30362:::-;30528:4;30566:2;30555:9;30551:18;30543:26;;30615:9;30609:4;30605:20;30601:1;30590:9;30586:17;30579:47;30643:131;30769:4;30643:131;:::i;:::-;30635:139;;30362:419;;;:::o;30787:::-;30953:4;30991:2;30980:9;30976:18;30968:26;;31040:9;31034:4;31030:20;31026:1;31015:9;31011:17;31004:47;31068:131;31194:4;31068:131;:::i;:::-;31060:139;;30787:419;;;:::o;31212:222::-;31305:4;31343:2;31332:9;31328:18;31320:26;;31356:71;31424:1;31413:9;31409:17;31400:6;31356:71;:::i;:::-;31212:222;;;;:::o;31440:129::-;31474:6;31501:20;;:::i;:::-;31491:30;;31530:33;31558:4;31550:6;31530:33;:::i;:::-;31440:129;;;:::o;31575:75::-;31608:6;31641:2;31635:9;31625:19;;31575:75;:::o;31656:307::-;31717:4;31807:18;31799:6;31796:30;31793:56;;;31829:18;;:::i;:::-;31793:56;31867:29;31889:6;31867:29;:::i;:::-;31859:37;;31951:4;31945;31941:15;31933:23;;31656:307;;;:::o;31969:308::-;32031:4;32121:18;32113:6;32110:30;32107:56;;;32143:18;;:::i;:::-;32107:56;32181:29;32203:6;32181:29;:::i;:::-;32173:37;;32265:4;32259;32255:15;32247:23;;31969:308;;;:::o;32283:98::-;32334:6;32368:5;32362:12;32352:22;;32283:98;;;:::o;32387:99::-;32439:6;32473:5;32467:12;32457:22;;32387:99;;;:::o;32492:168::-;32575:11;32609:6;32604:3;32597:19;32649:4;32644:3;32640:14;32625:29;;32492:168;;;;:::o;32666:169::-;32750:11;32784:6;32779:3;32772:19;32824:4;32819:3;32815:14;32800:29;;32666:169;;;;:::o;32841:148::-;32943:11;32980:3;32965:18;;32841:148;;;;:::o;32995:305::-;33035:3;33054:20;33072:1;33054:20;:::i;:::-;33049:25;;33088:20;33106:1;33088:20;:::i;:::-;33083:25;;33242:1;33174:66;33170:74;33167:1;33164:81;33161:107;;;33248:18;;:::i;:::-;33161:107;33292:1;33289;33285:9;33278:16;;32995:305;;;;:::o;33306:185::-;33346:1;33363:20;33381:1;33363:20;:::i;:::-;33358:25;;33397:20;33415:1;33397:20;:::i;:::-;33392:25;;33436:1;33426:35;;33441:18;;:::i;:::-;33426:35;33483:1;33480;33476:9;33471:14;;33306:185;;;;:::o;33497:348::-;33537:7;33560:20;33578:1;33560:20;:::i;:::-;33555:25;;33594:20;33612:1;33594:20;:::i;:::-;33589:25;;33782:1;33714:66;33710:74;33707:1;33704:81;33699:1;33692:9;33685:17;33681:105;33678:131;;;33789:18;;:::i;:::-;33678:131;33837:1;33834;33830:9;33819:20;;33497:348;;;;:::o;33851:191::-;33891:4;33911:20;33929:1;33911:20;:::i;:::-;33906:25;;33945:20;33963:1;33945:20;:::i;:::-;33940:25;;33984:1;33981;33978:8;33975:34;;;33989:18;;:::i;:::-;33975:34;34034:1;34031;34027:9;34019:17;;33851:191;;;;:::o;34048:96::-;34085:7;34114:24;34132:5;34114:24;:::i;:::-;34103:35;;34048:96;;;:::o;34150:90::-;34184:7;34227:5;34220:13;34213:21;34202:32;;34150:90;;;:::o;34246:149::-;34282:7;34322:66;34315:5;34311:78;34300:89;;34246:149;;;:::o;34401:126::-;34438:7;34478:42;34471:5;34467:54;34456:65;;34401:126;;;:::o;34533:77::-;34570:7;34599:5;34588:16;;34533:77;;;:::o;34616:154::-;34700:6;34695:3;34690;34677:30;34762:1;34753:6;34748:3;34744:16;34737:27;34616:154;;;:::o;34776:307::-;34844:1;34854:113;34868:6;34865:1;34862:13;34854:113;;;34953:1;34948:3;34944:11;34938:18;34934:1;34929:3;34925:11;34918:39;34890:2;34887:1;34883:10;34878:15;;34854:113;;;34985:6;34982:1;34979:13;34976:101;;;35065:1;35056:6;35051:3;35047:16;35040:27;34976:101;34825:258;34776:307;;;:::o;35089:320::-;35133:6;35170:1;35164:4;35160:12;35150:22;;35217:1;35211:4;35207:12;35238:18;35228:81;;35294:4;35286:6;35282:17;35272:27;;35228:81;35356:2;35348:6;35345:14;35325:18;35322:38;35319:84;;;35375:18;;:::i;:::-;35319:84;35140:269;35089:320;;;:::o;35415:281::-;35498:27;35520:4;35498:27;:::i;:::-;35490:6;35486:40;35628:6;35616:10;35613:22;35592:18;35580:10;35577:34;35574:62;35571:88;;;35639:18;;:::i;:::-;35571:88;35679:10;35675:2;35668:22;35458:238;35415:281;;:::o;35702:233::-;35741:3;35764:24;35782:5;35764:24;:::i;:::-;35755:33;;35810:66;35803:5;35800:77;35797:103;;;35880:18;;:::i;:::-;35797:103;35927:1;35920:5;35916:13;35909:20;;35702:233;;;:::o;35941:176::-;35973:1;35990:20;36008:1;35990:20;:::i;:::-;35985:25;;36024:20;36042:1;36024:20;:::i;:::-;36019:25;;36063:1;36053:35;;36068:18;;:::i;:::-;36053:35;36109:1;36106;36102:9;36097:14;;35941:176;;;;:::o;36123:180::-;36171:77;36168:1;36161:88;36268:4;36265:1;36258:15;36292:4;36289:1;36282:15;36309:180;36357:77;36354:1;36347:88;36454:4;36451:1;36444:15;36478:4;36475:1;36468:15;36495:180;36543:77;36540:1;36533:88;36640:4;36637:1;36630:15;36664:4;36661:1;36654:15;36681:180;36729:77;36726:1;36719:88;36826:4;36823:1;36816:15;36850:4;36847:1;36840:15;36867:180;36915:77;36912:1;36905:88;37012:4;37009:1;37002:15;37036:4;37033:1;37026:15;37053:117;37162:1;37159;37152:12;37176:117;37285:1;37282;37275:12;37299:117;37408:1;37405;37398:12;37422:117;37531:1;37528;37521:12;37545:102;37586:6;37637:2;37633:7;37628:2;37621:5;37617:14;37613:28;37603:38;;37545:102;;;:::o;37653:237::-;37793:34;37789:1;37781:6;37777:14;37770:58;37862:20;37857:2;37849:6;37845:15;37838:45;37653:237;:::o;37896:225::-;38036:34;38032:1;38024:6;38020:14;38013:58;38105:8;38100:2;38092:6;38088:15;38081:33;37896:225;:::o;38127:178::-;38267:30;38263:1;38255:6;38251:14;38244:54;38127:178;:::o;38311:170::-;38451:22;38447:1;38439:6;38435:14;38428:46;38311:170;:::o;38487:223::-;38627:34;38623:1;38615:6;38611:14;38604:58;38696:6;38691:2;38683:6;38679:15;38672:31;38487:223;:::o;38716:175::-;38856:27;38852:1;38844:6;38840:14;38833:51;38716:175;:::o;38897:181::-;39037:33;39033:1;39025:6;39021:14;39014:57;38897:181;:::o;39084:231::-;39224:34;39220:1;39212:6;39208:14;39201:58;39293:14;39288:2;39280:6;39276:15;39269:39;39084:231;:::o;39321:229::-;39461:34;39457:1;39449:6;39445:14;39438:58;39530:12;39525:2;39517:6;39513:15;39506:37;39321:229;:::o;39556:243::-;39696:34;39692:1;39684:6;39680:14;39673:58;39765:26;39760:2;39752:6;39748:15;39741:51;39556:243;:::o;39805:229::-;39945:34;39941:1;39933:6;39929:14;39922:58;40014:12;40009:2;40001:6;39997:15;39990:37;39805:229;:::o;40040:228::-;40180:34;40176:1;40168:6;40164:14;40157:58;40249:11;40244:2;40236:6;40232:15;40225:36;40040:228;:::o;40274:182::-;40414:34;40410:1;40402:6;40398:14;40391:58;40274:182;:::o;40462:177::-;40602:29;40598:1;40590:6;40586:14;40579:53;40462:177;:::o;40645:180::-;40785:32;40781:1;40773:6;40769:14;40762:56;40645:180;:::o;40831:177::-;40971:29;40967:1;40959:6;40955:14;40948:53;40831:177;:::o;41014:231::-;41154:34;41150:1;41142:6;41138:14;41131:58;41223:14;41218:2;41210:6;41206:15;41199:39;41014:231;:::o;41251:182::-;41391:34;41387:1;41379:6;41375:14;41368:58;41251:182;:::o;41439:228::-;41579:34;41575:1;41567:6;41563:14;41556:58;41648:11;41643:2;41635:6;41631:15;41624:36;41439:228;:::o;41673:234::-;41813:34;41809:1;41801:6;41797:14;41790:58;41882:17;41877:2;41869:6;41865:15;41858:42;41673:234;:::o;41913:220::-;42053:34;42049:1;42041:6;42037:14;42030:58;42122:3;42117:2;42109:6;42105:15;42098:28;41913:220;:::o;42139:::-;42279:34;42275:1;42267:6;42263:14;42256:58;42348:3;42343:2;42335:6;42331:15;42324:28;42139:220;:::o;42365:224::-;42505:34;42501:1;42493:6;42489:14;42482:58;42574:7;42569:2;42561:6;42557:15;42550:32;42365:224;:::o;42595:289::-;42735:34;42731:1;42723:6;42719:14;42712:58;42804:34;42799:2;42791:6;42787:15;42780:59;42873:3;42868:2;42860:6;42856:15;42849:28;42595:289;:::o;42890:236::-;43030:34;43026:1;43018:6;43014:14;43007:58;43099:19;43094:2;43086:6;43082:15;43075:44;42890:236;:::o;43132:249::-;43272:34;43268:1;43260:6;43256:14;43249:58;43341:32;43336:2;43328:6;43324:15;43317:57;43132:249;:::o;43387:122::-;43460:24;43478:5;43460:24;:::i;:::-;43453:5;43450:35;43440:63;;43499:1;43496;43489:12;43440:63;43387:122;:::o;43515:116::-;43585:21;43600:5;43585:21;:::i;:::-;43578:5;43575:32;43565:60;;43621:1;43618;43611:12;43565:60;43515:116;:::o;43637:120::-;43709:23;43726:5;43709:23;:::i;:::-;43702:5;43699:34;43689:62;;43747:1;43744;43737:12;43689:62;43637:120;:::o;43763:122::-;43836:24;43854:5;43836:24;:::i;:::-;43829:5;43826:35;43816:63;;43875:1;43872;43865:12;43816:63;43763:122;:::o

Swarm Source

ipfs://6b2689aa9c56d240ea91144eaceb769ad2a371423c1eaab970d3265eceb65952
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.