ETH Price: $3,333.30 (-2.50%)

Token

Pickle Anniversary Gift (P1CKLE)
 

Overview

Max Total Supply

213 P1CKLE

Holders

213

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 P1CKLE
0xc508d4101dcdac0fde791a974361f02909736845
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:
PickleAnniversary

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


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

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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 contracts/PickleAnniversary.sol

pragma solidity ^0.8.0;


interface IFeeDistributor {
    function ve_for_at(address _user, uint256 _timestamp)
        external
        returns (uint256);
}

contract PickleAnniversary is ERC721Enumerable, Ownable {
    string public _tokenURI;
    uint256 public snapshotTime = 1631248201;
    bool public _ownerClaimed;
    mapping(address => bool) public userClaimed;
    mapping(uint256 => bool) public giftRedeemed;

    IFeeDistributor public constant DILL = IFeeDistributor(
        0x74C6CadE3eF61d64dcc9b97490d9FbB231e4BdCc
    );

    constructor(string memory _uri)
        public
        ERC721("Pickle Anniversary Gift", "P1CKLE")
    {
        _tokenURI = _uri;
        _ownerClaimed = false;
    }

    // Reserver 25 mints for the team to distribute
    function reserveMints() public onlyOwner {
        require(_ownerClaimed = false, "Owner has already claimed");
        uint256 supply = totalSupply();
        uint256 i;
        for (i = 0; i < 25; i++) {
            _safeMint(msg.sender, supply + i);
        }
        _ownerClaimed = true;
    }

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

        string memory uri = _baseURI();
        return uri;
    }

    function _baseURI() internal override view returns (string memory) {
        return _tokenURI;
    }

    function setTokenURI(string memory _uri) public onlyOwner {
        _tokenURI = _uri;
    }

    function mintNFT(address recipient) public returns (uint256) {
        require(!userClaimed[msg.sender], "User has already claimed NFT");

        // Require a DILL balance > 10 at the snapshotTime
        require(
            DILL.ve_for_at(msg.sender, snapshotTime) >= mul(10, 1e18),
            "User balance does not qualify"
        );

        uint256 supply = totalSupply();
        uint256 newItemId = supply;
        _mint(recipient, newItemId);

        userClaimed[msg.sender] = true;

        return newItemId;
    }

    function redeemGift(uint256 tokenId) public returns (bool) {
        require(
            msg.sender == ownerOf(tokenId),
            "Can only redeem tokens you own"
        );
        require(
            giftRedeemed[tokenId] == false,
            "Token has already been redeemed"
        );
        giftRedeemed[tokenId] = true;
        return true;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"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":"DILL","outputs":[{"internalType":"contract IFeeDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ownerClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"giftRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeemGift","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMints","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":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshotTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"userClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405263613adf49600c553480156200001957600080fd5b50604051620041b8380380620041b883398181016040528101906200003f91906200032a565b6040518060400160405280601781526020017f5069636b6c6520416e6e697665727361727920476966740000000000000000008152506040518060400160405280600681526020017f5031434b4c4500000000000000000000000000000000000000000000000000008152508160009080519060200190620000c392919062000208565b508060019080519060200190620000dc92919062000208565b505050620000ff620000f36200013a60201b60201c565b6200014260201b60201c565b80600b90805190602001906200011792919062000208565b506000600d60006101000a81548160ff02191690831515021790555050620004a0565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000216906200040c565b90600052602060002090601f0160209004810192826200023a576000855562000286565b82601f106200025557805160ff191683800117855562000286565b8280016001018555821562000286579182015b828111156200028557825182559160200191906001019062000268565b5b50905062000295919062000299565b5090565b5b80821115620002b45760008160009055506001016200029a565b5090565b6000620002cf620002c984620003a3565b6200036f565b905082815260208101848484011115620002e857600080fd5b620002f5848285620003d6565b509392505050565b600082601f8301126200030f57600080fd5b815162000321848260208601620002b8565b91505092915050565b6000602082840312156200033d57600080fd5b600082015167ffffffffffffffff8111156200035857600080fd5b6200036684828501620002fd565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171562000399576200039862000471565b5b8060405250919050565b600067ffffffffffffffff821115620003c157620003c062000471565b5b601f19601f8301169050602081019050919050565b60005b83811015620003f6578082015181840152602081019050620003d9565b8381111562000406576000848401525b50505050565b600060028204905060018216806200042557607f821691505b602082108114156200043c576200043b62000442565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d0880620004b06000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063b88d4fde116100a2578063e0df5b6f11610071578063e0df5b6f14610556578063e985e9c514610572578063f2fde38b146105a2578063f5064b10146105be576101cf565b8063b88d4fde146104aa578063c5f6a5fd146104c6578063c87b56dd146104f6578063d08de2c014610526576101cf565b806395d89b41116100de57806395d89b4114610448578063a22cb46514610466578063a335de9014610482578063b4ce37d21461048c576101cf565b806370a08231146103f0578063715018a6146104205780638da5cb5b1461042a576101cf565b80633b7fcdca116101715780634eb1fbeb1161014b5780634eb1fbeb146103425780634f6ccce71461036057806354ba0f27146103905780636352211e146103c0576101cf565b80633b7fcdca146102d857806342842e0e146103085780634c6d767b14610324576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632f745c59146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612aa6565b6105dc565b6040516101fb9190613503565b60405180910390f35b61020c610656565b6040516102199190613539565b60405180910390f35b61023c60048036038101906102379190612b39565b6106e8565b6040516102499190613473565b60405180910390f35b61026c60048036038101906102679190612a6a565b61076d565b005b610276610885565b604051610283919061385b565b60405180910390f35b6102a660048036038101906102a19190612964565b610892565b005b6102c260048036038101906102bd9190612a6a565b6108f2565b6040516102cf919061385b565b60405180910390f35b6102f260048036038101906102ed91906128ff565b610997565b6040516102ff9190613503565b60405180910390f35b610322600480360381019061031d9190612964565b6109b7565b005b61032c6109d7565b604051610339919061385b565b60405180910390f35b61034a6109dd565b604051610357919061351e565b60405180910390f35b61037a60048036038101906103759190612b39565b6109f5565b604051610387919061385b565b60405180910390f35b6103aa60048036038101906103a591906128ff565b610a8c565b6040516103b7919061385b565b60405180910390f35b6103da60048036038101906103d59190612b39565b610c8f565b6040516103e79190613473565b60405180910390f35b61040a600480360381019061040591906128ff565b610d41565b604051610417919061385b565b60405180910390f35b610428610df9565b005b610432610e81565b60405161043f9190613473565b60405180910390f35b610450610eab565b60405161045d9190613539565b60405180910390f35b610480600480360381019061047b9190612a2e565b610f3d565b005b61048a6110be565b005b6104946111f2565b6040516104a19190613539565b60405180910390f35b6104c460048036038101906104bf91906129b3565b611280565b005b6104e060048036038101906104db9190612b39565b6112e2565b6040516104ed9190613503565b60405180910390f35b610510600480360381019061050b9190612b39565b6113f6565b60405161051d9190613539565b60405180910390f35b610540600480360381019061053b9190612b39565b611455565b60405161054d9190613503565b60405180910390f35b610570600480360381019061056b9190612af8565b611475565b005b61058c60048036038101906105879190612928565b61150b565b6040516105999190613503565b60405180910390f35b6105bc60048036038101906105b791906128ff565b61159f565b005b6105c6611697565b6040516105d39190613503565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e826116aa565b5b9050919050565b60606000805461066590613b2e565b80601f016020809104026020016040519081016040528092919081815260200182805461069190613b2e565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f38261178c565b610732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107299061371b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077882610c8f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e0906137db565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108086117f8565b73ffffffffffffffffffffffffffffffffffffffff1614806108375750610836816108316117f8565b61150b565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d9061367b565b60405180910390fd5b6108808383611800565b505050565b6000600880549050905090565b6108a361089d6117f8565b826118b9565b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906137fb565b60405180910390fd5b6108ed838383611997565b505050565b60006108fd83610d41565b821061093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061355b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6109d283838360405180602001604052806000815250611280565b505050565b600c5481565b7374c6cade3ef61d64dcc9b97490d9fbb231e4bdcc81565b60006109ff610885565b8210610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a379061383b565b60405180910390fd5b60088281548110610a7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b12906137bb565b60405180910390fd5b610b2e600a670de0b6b3a7640000611bf3565b7374c6cade3ef61d64dcc9b97490d9fbb231e4bdcc73ffffffffffffffffffffffffffffffffffffffff1663ace296fb33600c546040518363ffffffff1660e01b8152600401610b7f9291906134da565b602060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd19190612b62565b1015610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061375b565b60405180910390fd5b6000610c1c610885565b90506000819050610c2d8482611c6e565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508092505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906136bb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061369b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e016117f8565b73ffffffffffffffffffffffffffffffffffffffff16610e1f610e81565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c9061373b565b60405180910390fd5b610e7f6000611e3c565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610eba90613b2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee690613b2e565b8015610f335780601f10610f0857610100808354040283529160200191610f33565b820191906000526020600020905b815481529060010190602001808311610f1657829003601f168201915b5050505050905090565b610f456117f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa9061363b565b60405180910390fd5b8060056000610fc06117f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106d6117f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b29190613503565b60405180910390a35050565b6110c66117f8565b73ffffffffffffffffffffffffffffffffffffffff166110e4610e81565b73ffffffffffffffffffffffffffffffffffffffff161461113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061373b565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061381b565b60405180910390fd5b600061119d610885565b905060005b60198110156111d3576111c03382846111bb919061393f565b611f02565b80806111cb90613b60565b9150506111a2565b6001600d60006101000a81548160ff0219169083151502179055505050565b600b80546111ff90613b2e565b80601f016020809104026020016040519081016040528092919081815260200182805461122b90613b2e565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b61129161128b6117f8565b836118b9565b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906137fb565b60405180910390fd5b6112dc84848484611f20565b50505050565b60006112ed82610c8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611351906135fb565b60405180910390fd5b60001515600f600084815260200190815260200160002060009054906101000a900460ff161515146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b8906135bb565b60405180910390fd5b6001600f600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60606114018261178c565b611440576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114379061379b565b60405180910390fd5b600061144a611f7c565b905080915050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61147d6117f8565b73ffffffffffffffffffffffffffffffffffffffff1661149b610e81565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e89061373b565b60405180910390fd5b80600b908051906020019061150792919061270e565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a76117f8565b73ffffffffffffffffffffffffffffffffffffffff166115c5610e81565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116129061373b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116829061359b565b60405180910390fd5b61169481611e3c565b50565b600d60009054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061178557506117848261200e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661187383610c8f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c48261178c565b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa9061365b565b60405180910390fd5b600061190e83610c8f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061197d57508373ffffffffffffffffffffffffffffffffffffffff16611965846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061198e575061198d818561150b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119b782610c8f565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061377b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a749061361b565b60405180910390fd5b611a88838383612078565b611a93600082611800565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae39190613a20565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3a919061393f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080831415611c065760009050611c68565b60008284611c1491906139c6565b9050828482611c239190613995565b14611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a906136fb565b60405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd5906136db565b60405180910390fd5b611ce78161178c565b15611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e906135db565b60405180910390fd5b611d3360008383612078565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d83919061393f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f1c82826040518060200160405280600081525061218c565b5050565b611f2b848484611997565b611f37848484846121e7565b611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061357b565b60405180910390fd5b50505050565b6060600b8054611f8b90613b2e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb790613b2e565b80156120045780601f10611fd957610100808354040283529160200191612004565b820191906000526020600020905b815481529060010190602001808311611fe757829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61208383838361237e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c6576120c181612383565b612105565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121045761210383826123cc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121485761214381612539565b612187565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461218657612185828261267c565b5b5b505050565b6121968383611c6e565b6121a360008484846121e7565b6121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d99061357b565b60405180910390fd5b505050565b60006122088473ffffffffffffffffffffffffffffffffffffffff166126fb565b15612371578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122316117f8565b8786866040518563ffffffff1660e01b8152600401612253949392919061348e565b602060405180830381600087803b15801561226d57600080fd5b505af192505050801561229e57506040513d601f19601f8201168201806040525081019061229b9190612acf565b60015b612321573d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b50600081511415612319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123109061357b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612376565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123d984610d41565b6123e39190613a20565b90506000600760008481526020019081526020016000205490508181146124c8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061254d9190613a20565b90506000600960008481526020019081526020016000205490506000600883815481106125a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106125eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612660577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061268783610d41565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461271a90613b2e565b90600052602060002090601f01602090048101928261273c5760008555612783565b82601f1061275557805160ff1916838001178555612783565b82800160010185558215612783579182015b82811115612782578251825591602001919060010190612767565b5b5090506127909190612794565b5090565b5b808211156127ad576000816000905550600101612795565b5090565b60006127c46127bf846138a7565b613876565b9050828152602081018484840111156127dc57600080fd5b6127e7848285613aec565b509392505050565b60006128026127fd846138d7565b613876565b90508281526020810184848401111561281a57600080fd5b612825848285613aec565b509392505050565b60008135905061283c81613c76565b92915050565b60008135905061285181613c8d565b92915050565b60008135905061286681613ca4565b92915050565b60008151905061287b81613ca4565b92915050565b600082601f83011261289257600080fd5b81356128a28482602086016127b1565b91505092915050565b600082601f8301126128bc57600080fd5b81356128cc8482602086016127ef565b91505092915050565b6000813590506128e481613cbb565b92915050565b6000815190506128f981613cbb565b92915050565b60006020828403121561291157600080fd5b600061291f8482850161282d565b91505092915050565b6000806040838503121561293b57600080fd5b60006129498582860161282d565b925050602061295a8582860161282d565b9150509250929050565b60008060006060848603121561297957600080fd5b60006129878682870161282d565b93505060206129988682870161282d565b92505060406129a9868287016128d5565b9150509250925092565b600080600080608085870312156129c957600080fd5b60006129d78782880161282d565b94505060206129e88782880161282d565b93505060406129f9878288016128d5565b925050606085013567ffffffffffffffff811115612a1657600080fd5b612a2287828801612881565b91505092959194509250565b60008060408385031215612a4157600080fd5b6000612a4f8582860161282d565b9250506020612a6085828601612842565b9150509250929050565b60008060408385031215612a7d57600080fd5b6000612a8b8582860161282d565b9250506020612a9c858286016128d5565b9150509250929050565b600060208284031215612ab857600080fd5b6000612ac684828501612857565b91505092915050565b600060208284031215612ae157600080fd5b6000612aef8482850161286c565b91505092915050565b600060208284031215612b0a57600080fd5b600082013567ffffffffffffffff811115612b2457600080fd5b612b30848285016128ab565b91505092915050565b600060208284031215612b4b57600080fd5b6000612b59848285016128d5565b91505092915050565b600060208284031215612b7457600080fd5b6000612b82848285016128ea565b91505092915050565b612b9481613a54565b82525050565b612ba381613a66565b82525050565b6000612bb482613907565b612bbe818561391d565b9350612bce818560208601613afb565b612bd781613c65565b840191505092915050565b612beb81613ac8565b82525050565b6000612bfc82613912565b612c06818561392e565b9350612c16818560208601613afb565b612c1f81613c65565b840191505092915050565b6000612c37602b8361392e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612c9d60328361392e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612d0360268361392e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d69601f8361392e565b91507f546f6b656e2068617320616c7265616479206265656e2072656465656d6564006000830152602082019050919050565b6000612da9601c8361392e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612de9601e8361392e565b91507f43616e206f6e6c792072656465656d20746f6b656e7320796f75206f776e00006000830152602082019050919050565b6000612e2960248361392e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e8f60198361392e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612ecf602c8361392e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f3560388361392e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612f9b602a8361392e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061300160298361392e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061306760208361392e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006130a760218361392e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061310d602c8361392e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061317360208361392e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006131b3601d8361392e565b91507f557365722062616c616e636520646f6573206e6f74207175616c6966790000006000830152602082019050919050565b60006131f360298361392e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613259602f8361392e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132bf601c8361392e565b91507f557365722068617320616c726561647920636c61696d6564204e4654000000006000830152602082019050919050565b60006132ff60218361392e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061336560318361392e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006133cb60198361392e565b91507f4f776e65722068617320616c726561647920636c61696d6564000000000000006000830152602082019050919050565b600061340b602c8361392e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61346d81613abe565b82525050565b60006020820190506134886000830184612b8b565b92915050565b60006080820190506134a36000830187612b8b565b6134b06020830186612b8b565b6134bd6040830185613464565b81810360608301526134cf8184612ba9565b905095945050505050565b60006040820190506134ef6000830185612b8b565b6134fc6020830184613464565b9392505050565b60006020820190506135186000830184612b9a565b92915050565b60006020820190506135336000830184612be2565b92915050565b600060208201905081810360008301526135538184612bf1565b905092915050565b6000602082019050818103600083015261357481612c2a565b9050919050565b6000602082019050818103600083015261359481612c90565b9050919050565b600060208201905081810360008301526135b481612cf6565b9050919050565b600060208201905081810360008301526135d481612d5c565b9050919050565b600060208201905081810360008301526135f481612d9c565b9050919050565b6000602082019050818103600083015261361481612ddc565b9050919050565b6000602082019050818103600083015261363481612e1c565b9050919050565b6000602082019050818103600083015261365481612e82565b9050919050565b6000602082019050818103600083015261367481612ec2565b9050919050565b6000602082019050818103600083015261369481612f28565b9050919050565b600060208201905081810360008301526136b481612f8e565b9050919050565b600060208201905081810360008301526136d481612ff4565b9050919050565b600060208201905081810360008301526136f48161305a565b9050919050565b600060208201905081810360008301526137148161309a565b9050919050565b6000602082019050818103600083015261373481613100565b9050919050565b6000602082019050818103600083015261375481613166565b9050919050565b60006020820190508181036000830152613774816131a6565b9050919050565b60006020820190508181036000830152613794816131e6565b9050919050565b600060208201905081810360008301526137b48161324c565b9050919050565b600060208201905081810360008301526137d4816132b2565b9050919050565b600060208201905081810360008301526137f4816132f2565b9050919050565b6000602082019050818103600083015261381481613358565b9050919050565b60006020820190508181036000830152613834816133be565b9050919050565b60006020820190508181036000830152613854816133fe565b9050919050565b60006020820190506138706000830184613464565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561389d5761389c613c36565b5b8060405250919050565b600067ffffffffffffffff8211156138c2576138c1613c36565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138f2576138f1613c36565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061394a82613abe565b915061395583613abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398a57613989613ba9565b5b828201905092915050565b60006139a082613abe565b91506139ab83613abe565b9250826139bb576139ba613bd8565b5b828204905092915050565b60006139d182613abe565b91506139dc83613abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1557613a14613ba9565b5b828202905092915050565b6000613a2b82613abe565b9150613a3683613abe565b925082821015613a4957613a48613ba9565b5b828203905092915050565b6000613a5f82613a9e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613ad382613ada565b9050919050565b6000613ae582613a9e565b9050919050565b82818337600083830152505050565b60005b83811015613b19578082015181840152602081019050613afe565b83811115613b28576000848401525b50505050565b60006002820490506001821680613b4657607f821691505b60208210811415613b5a57613b59613c07565b5b50919050565b6000613b6b82613abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9e57613b9d613ba9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c7f81613a54565b8114613c8a57600080fd5b50565b613c9681613a66565b8114613ca157600080fd5b50565b613cad81613a72565b8114613cb857600080fd5b50565b613cc481613abe565b8114613ccf57600080fd5b5056fea2646970667358221220bd98df5b3cfd77fb3459ab484f18756743345f173bd0bc2b67adfd718eb5a83b64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d644454483467396e464a506375345631416868596379533739516b357133655255365278777232636267634d0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063b88d4fde116100a2578063e0df5b6f11610071578063e0df5b6f14610556578063e985e9c514610572578063f2fde38b146105a2578063f5064b10146105be576101cf565b8063b88d4fde146104aa578063c5f6a5fd146104c6578063c87b56dd146104f6578063d08de2c014610526576101cf565b806395d89b41116100de57806395d89b4114610448578063a22cb46514610466578063a335de9014610482578063b4ce37d21461048c576101cf565b806370a08231146103f0578063715018a6146104205780638da5cb5b1461042a576101cf565b80633b7fcdca116101715780634eb1fbeb1161014b5780634eb1fbeb146103425780634f6ccce71461036057806354ba0f27146103905780636352211e146103c0576101cf565b80633b7fcdca146102d857806342842e0e146103085780634c6d767b14610324576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632f745c59146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612aa6565b6105dc565b6040516101fb9190613503565b60405180910390f35b61020c610656565b6040516102199190613539565b60405180910390f35b61023c60048036038101906102379190612b39565b6106e8565b6040516102499190613473565b60405180910390f35b61026c60048036038101906102679190612a6a565b61076d565b005b610276610885565b604051610283919061385b565b60405180910390f35b6102a660048036038101906102a19190612964565b610892565b005b6102c260048036038101906102bd9190612a6a565b6108f2565b6040516102cf919061385b565b60405180910390f35b6102f260048036038101906102ed91906128ff565b610997565b6040516102ff9190613503565b60405180910390f35b610322600480360381019061031d9190612964565b6109b7565b005b61032c6109d7565b604051610339919061385b565b60405180910390f35b61034a6109dd565b604051610357919061351e565b60405180910390f35b61037a60048036038101906103759190612b39565b6109f5565b604051610387919061385b565b60405180910390f35b6103aa60048036038101906103a591906128ff565b610a8c565b6040516103b7919061385b565b60405180910390f35b6103da60048036038101906103d59190612b39565b610c8f565b6040516103e79190613473565b60405180910390f35b61040a600480360381019061040591906128ff565b610d41565b604051610417919061385b565b60405180910390f35b610428610df9565b005b610432610e81565b60405161043f9190613473565b60405180910390f35b610450610eab565b60405161045d9190613539565b60405180910390f35b610480600480360381019061047b9190612a2e565b610f3d565b005b61048a6110be565b005b6104946111f2565b6040516104a19190613539565b60405180910390f35b6104c460048036038101906104bf91906129b3565b611280565b005b6104e060048036038101906104db9190612b39565b6112e2565b6040516104ed9190613503565b60405180910390f35b610510600480360381019061050b9190612b39565b6113f6565b60405161051d9190613539565b60405180910390f35b610540600480360381019061053b9190612b39565b611455565b60405161054d9190613503565b60405180910390f35b610570600480360381019061056b9190612af8565b611475565b005b61058c60048036038101906105879190612928565b61150b565b6040516105999190613503565b60405180910390f35b6105bc60048036038101906105b791906128ff565b61159f565b005b6105c6611697565b6040516105d39190613503565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e826116aa565b5b9050919050565b60606000805461066590613b2e565b80601f016020809104026020016040519081016040528092919081815260200182805461069190613b2e565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f38261178c565b610732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107299061371b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077882610c8f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e0906137db565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108086117f8565b73ffffffffffffffffffffffffffffffffffffffff1614806108375750610836816108316117f8565b61150b565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d9061367b565b60405180910390fd5b6108808383611800565b505050565b6000600880549050905090565b6108a361089d6117f8565b826118b9565b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906137fb565b60405180910390fd5b6108ed838383611997565b505050565b60006108fd83610d41565b821061093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061355b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6109d283838360405180602001604052806000815250611280565b505050565b600c5481565b7374c6cade3ef61d64dcc9b97490d9fbb231e4bdcc81565b60006109ff610885565b8210610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a379061383b565b60405180910390fd5b60088281548110610a7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b12906137bb565b60405180910390fd5b610b2e600a670de0b6b3a7640000611bf3565b7374c6cade3ef61d64dcc9b97490d9fbb231e4bdcc73ffffffffffffffffffffffffffffffffffffffff1663ace296fb33600c546040518363ffffffff1660e01b8152600401610b7f9291906134da565b602060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd19190612b62565b1015610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061375b565b60405180910390fd5b6000610c1c610885565b90506000819050610c2d8482611c6e565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508092505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906136bb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061369b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e016117f8565b73ffffffffffffffffffffffffffffffffffffffff16610e1f610e81565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c9061373b565b60405180910390fd5b610e7f6000611e3c565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610eba90613b2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee690613b2e565b8015610f335780601f10610f0857610100808354040283529160200191610f33565b820191906000526020600020905b815481529060010190602001808311610f1657829003601f168201915b5050505050905090565b610f456117f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa9061363b565b60405180910390fd5b8060056000610fc06117f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106d6117f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b29190613503565b60405180910390a35050565b6110c66117f8565b73ffffffffffffffffffffffffffffffffffffffff166110e4610e81565b73ffffffffffffffffffffffffffffffffffffffff161461113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061373b565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061381b565b60405180910390fd5b600061119d610885565b905060005b60198110156111d3576111c03382846111bb919061393f565b611f02565b80806111cb90613b60565b9150506111a2565b6001600d60006101000a81548160ff0219169083151502179055505050565b600b80546111ff90613b2e565b80601f016020809104026020016040519081016040528092919081815260200182805461122b90613b2e565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b61129161128b6117f8565b836118b9565b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906137fb565b60405180910390fd5b6112dc84848484611f20565b50505050565b60006112ed82610c8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611351906135fb565b60405180910390fd5b60001515600f600084815260200190815260200160002060009054906101000a900460ff161515146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b8906135bb565b60405180910390fd5b6001600f600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60606114018261178c565b611440576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114379061379b565b60405180910390fd5b600061144a611f7c565b905080915050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61147d6117f8565b73ffffffffffffffffffffffffffffffffffffffff1661149b610e81565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e89061373b565b60405180910390fd5b80600b908051906020019061150792919061270e565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a76117f8565b73ffffffffffffffffffffffffffffffffffffffff166115c5610e81565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116129061373b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116829061359b565b60405180910390fd5b61169481611e3c565b50565b600d60009054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061178557506117848261200e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661187383610c8f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c48261178c565b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa9061365b565b60405180910390fd5b600061190e83610c8f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061197d57508373ffffffffffffffffffffffffffffffffffffffff16611965846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061198e575061198d818561150b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119b782610c8f565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061377b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a749061361b565b60405180910390fd5b611a88838383612078565b611a93600082611800565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae39190613a20565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3a919061393f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080831415611c065760009050611c68565b60008284611c1491906139c6565b9050828482611c239190613995565b14611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a906136fb565b60405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd5906136db565b60405180910390fd5b611ce78161178c565b15611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e906135db565b60405180910390fd5b611d3360008383612078565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d83919061393f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f1c82826040518060200160405280600081525061218c565b5050565b611f2b848484611997565b611f37848484846121e7565b611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061357b565b60405180910390fd5b50505050565b6060600b8054611f8b90613b2e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb790613b2e565b80156120045780601f10611fd957610100808354040283529160200191612004565b820191906000526020600020905b815481529060010190602001808311611fe757829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61208383838361237e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c6576120c181612383565b612105565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121045761210383826123cc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121485761214381612539565b612187565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461218657612185828261267c565b5b5b505050565b6121968383611c6e565b6121a360008484846121e7565b6121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d99061357b565b60405180910390fd5b505050565b60006122088473ffffffffffffffffffffffffffffffffffffffff166126fb565b15612371578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122316117f8565b8786866040518563ffffffff1660e01b8152600401612253949392919061348e565b602060405180830381600087803b15801561226d57600080fd5b505af192505050801561229e57506040513d601f19601f8201168201806040525081019061229b9190612acf565b60015b612321573d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b50600081511415612319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123109061357b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612376565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123d984610d41565b6123e39190613a20565b90506000600760008481526020019081526020016000205490508181146124c8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061254d9190613a20565b90506000600960008481526020019081526020016000205490506000600883815481106125a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106125eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612660577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061268783610d41565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461271a90613b2e565b90600052602060002090601f01602090048101928261273c5760008555612783565b82601f1061275557805160ff1916838001178555612783565b82800160010185558215612783579182015b82811115612782578251825591602001919060010190612767565b5b5090506127909190612794565b5090565b5b808211156127ad576000816000905550600101612795565b5090565b60006127c46127bf846138a7565b613876565b9050828152602081018484840111156127dc57600080fd5b6127e7848285613aec565b509392505050565b60006128026127fd846138d7565b613876565b90508281526020810184848401111561281a57600080fd5b612825848285613aec565b509392505050565b60008135905061283c81613c76565b92915050565b60008135905061285181613c8d565b92915050565b60008135905061286681613ca4565b92915050565b60008151905061287b81613ca4565b92915050565b600082601f83011261289257600080fd5b81356128a28482602086016127b1565b91505092915050565b600082601f8301126128bc57600080fd5b81356128cc8482602086016127ef565b91505092915050565b6000813590506128e481613cbb565b92915050565b6000815190506128f981613cbb565b92915050565b60006020828403121561291157600080fd5b600061291f8482850161282d565b91505092915050565b6000806040838503121561293b57600080fd5b60006129498582860161282d565b925050602061295a8582860161282d565b9150509250929050565b60008060006060848603121561297957600080fd5b60006129878682870161282d565b93505060206129988682870161282d565b92505060406129a9868287016128d5565b9150509250925092565b600080600080608085870312156129c957600080fd5b60006129d78782880161282d565b94505060206129e88782880161282d565b93505060406129f9878288016128d5565b925050606085013567ffffffffffffffff811115612a1657600080fd5b612a2287828801612881565b91505092959194509250565b60008060408385031215612a4157600080fd5b6000612a4f8582860161282d565b9250506020612a6085828601612842565b9150509250929050565b60008060408385031215612a7d57600080fd5b6000612a8b8582860161282d565b9250506020612a9c858286016128d5565b9150509250929050565b600060208284031215612ab857600080fd5b6000612ac684828501612857565b91505092915050565b600060208284031215612ae157600080fd5b6000612aef8482850161286c565b91505092915050565b600060208284031215612b0a57600080fd5b600082013567ffffffffffffffff811115612b2457600080fd5b612b30848285016128ab565b91505092915050565b600060208284031215612b4b57600080fd5b6000612b59848285016128d5565b91505092915050565b600060208284031215612b7457600080fd5b6000612b82848285016128ea565b91505092915050565b612b9481613a54565b82525050565b612ba381613a66565b82525050565b6000612bb482613907565b612bbe818561391d565b9350612bce818560208601613afb565b612bd781613c65565b840191505092915050565b612beb81613ac8565b82525050565b6000612bfc82613912565b612c06818561392e565b9350612c16818560208601613afb565b612c1f81613c65565b840191505092915050565b6000612c37602b8361392e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612c9d60328361392e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612d0360268361392e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d69601f8361392e565b91507f546f6b656e2068617320616c7265616479206265656e2072656465656d6564006000830152602082019050919050565b6000612da9601c8361392e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612de9601e8361392e565b91507f43616e206f6e6c792072656465656d20746f6b656e7320796f75206f776e00006000830152602082019050919050565b6000612e2960248361392e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e8f60198361392e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612ecf602c8361392e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f3560388361392e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612f9b602a8361392e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061300160298361392e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061306760208361392e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006130a760218361392e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061310d602c8361392e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061317360208361392e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006131b3601d8361392e565b91507f557365722062616c616e636520646f6573206e6f74207175616c6966790000006000830152602082019050919050565b60006131f360298361392e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613259602f8361392e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132bf601c8361392e565b91507f557365722068617320616c726561647920636c61696d6564204e4654000000006000830152602082019050919050565b60006132ff60218361392e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061336560318361392e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006133cb60198361392e565b91507f4f776e65722068617320616c726561647920636c61696d6564000000000000006000830152602082019050919050565b600061340b602c8361392e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61346d81613abe565b82525050565b60006020820190506134886000830184612b8b565b92915050565b60006080820190506134a36000830187612b8b565b6134b06020830186612b8b565b6134bd6040830185613464565b81810360608301526134cf8184612ba9565b905095945050505050565b60006040820190506134ef6000830185612b8b565b6134fc6020830184613464565b9392505050565b60006020820190506135186000830184612b9a565b92915050565b60006020820190506135336000830184612be2565b92915050565b600060208201905081810360008301526135538184612bf1565b905092915050565b6000602082019050818103600083015261357481612c2a565b9050919050565b6000602082019050818103600083015261359481612c90565b9050919050565b600060208201905081810360008301526135b481612cf6565b9050919050565b600060208201905081810360008301526135d481612d5c565b9050919050565b600060208201905081810360008301526135f481612d9c565b9050919050565b6000602082019050818103600083015261361481612ddc565b9050919050565b6000602082019050818103600083015261363481612e1c565b9050919050565b6000602082019050818103600083015261365481612e82565b9050919050565b6000602082019050818103600083015261367481612ec2565b9050919050565b6000602082019050818103600083015261369481612f28565b9050919050565b600060208201905081810360008301526136b481612f8e565b9050919050565b600060208201905081810360008301526136d481612ff4565b9050919050565b600060208201905081810360008301526136f48161305a565b9050919050565b600060208201905081810360008301526137148161309a565b9050919050565b6000602082019050818103600083015261373481613100565b9050919050565b6000602082019050818103600083015261375481613166565b9050919050565b60006020820190508181036000830152613774816131a6565b9050919050565b60006020820190508181036000830152613794816131e6565b9050919050565b600060208201905081810360008301526137b48161324c565b9050919050565b600060208201905081810360008301526137d4816132b2565b9050919050565b600060208201905081810360008301526137f4816132f2565b9050919050565b6000602082019050818103600083015261381481613358565b9050919050565b60006020820190508181036000830152613834816133be565b9050919050565b60006020820190508181036000830152613854816133fe565b9050919050565b60006020820190506138706000830184613464565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561389d5761389c613c36565b5b8060405250919050565b600067ffffffffffffffff8211156138c2576138c1613c36565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138f2576138f1613c36565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061394a82613abe565b915061395583613abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398a57613989613ba9565b5b828201905092915050565b60006139a082613abe565b91506139ab83613abe565b9250826139bb576139ba613bd8565b5b828204905092915050565b60006139d182613abe565b91506139dc83613abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1557613a14613ba9565b5b828202905092915050565b6000613a2b82613abe565b9150613a3683613abe565b925082821015613a4957613a48613ba9565b5b828203905092915050565b6000613a5f82613a9e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613ad382613ada565b9050919050565b6000613ae582613a9e565b9050919050565b82818337600083830152505050565b60005b83811015613b19578082015181840152602081019050613afe565b83811115613b28576000848401525b50505050565b60006002820490506001821680613b4657607f821691505b60208210811415613b5a57613b59613c07565b5b50919050565b6000613b6b82613abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9e57613b9d613ba9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c7f81613a54565b8114613c8a57600080fd5b50565b613c9681613a66565b8114613ca157600080fd5b50565b613cad81613a72565b8114613cb857600080fd5b50565b613cc481613abe565b8114613ccf57600080fd5b5056fea2646970667358221220bd98df5b3cfd77fb3459ab484f18756743345f173bd0bc2b67adfd718eb5a83b64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d644454483467396e464a506375345631416868596379533739516b357133655255365278777232636267634d0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://ipfs.io/ipfs/QmdDTH4g9nFJPcu4V1AhhYcyS79Qk5q3eRU6Rxwr2cbgcM

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d644454483467396e46
Arg [3] : 4a506375345631416868596379533739516b3571336552553652787772326362
Arg [4] : 67634d0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43424:2638:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34783:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21680:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23239:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22762:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35423:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24129:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35091:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43596:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24539:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43517:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43699:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35613:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44908:544;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21374:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21104:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42582:94;;;:::i;:::-;;41931:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21849:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23532:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44056:306;;;:::i;:::-;;43487:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24795:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45460:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44370:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43646:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44807:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23898:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42831:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43564:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34783:224;34885:4;34924:35;34909:50;;;:11;:50;;;;:90;;;;34963:36;34987:11;34963:23;:36::i;:::-;34909:90;34902:97;;34783:224;;;:::o;21680:100::-;21734:13;21767:5;21760:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21680:100;:::o;23239:221::-;23315:7;23343:16;23351:7;23343;:16::i;:::-;23335:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23428:15;:24;23444:7;23428:24;;;;;;;;;;;;;;;;;;;;;23421:31;;23239:221;;;:::o;22762:411::-;22843:13;22859:23;22874:7;22859:14;:23::i;:::-;22843:39;;22907:5;22901:11;;:2;:11;;;;22893:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23001:5;22985:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23010:37;23027:5;23034:12;:10;:12::i;:::-;23010:16;:37::i;:::-;22985:62;22963:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23144:21;23153:2;23157:7;23144:8;:21::i;:::-;22762:411;;;:::o;35423:113::-;35484:7;35511:10;:17;;;;35504:24;;35423:113;:::o;24129:339::-;24324:41;24343:12;:10;:12::i;:::-;24357:7;24324:18;:41::i;:::-;24316:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24432:28;24442:4;24448:2;24452:7;24432:9;:28::i;:::-;24129:339;;;:::o;35091:256::-;35188:7;35224:23;35241:5;35224:16;:23::i;:::-;35216:5;:31;35208:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35313:12;:19;35326:5;35313:19;;;;;;;;;;;;;;;:26;35333:5;35313:26;;;;;;;;;;;;35306:33;;35091:256;;;;:::o;43596:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;24539:185::-;24677:39;24694:4;24700:2;24704:7;24677:39;;;;;;;;;;;;:16;:39::i;:::-;24539:185;;;:::o;43517:40::-;;;;:::o;43699:114::-;43764:42;43699:114;:::o;35613:233::-;35688:7;35724:30;:28;:30::i;:::-;35716:5;:38;35708:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35821:10;35832:5;35821:17;;;;;;;;;;;;;;;;;;;;;;;;35814:24;;35613:233;;;:::o;44908:544::-;44960:7;44989:11;:23;45001:10;44989:23;;;;;;;;;;;;;;;;;;;;;;;;;44988:24;44980:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45184:13;45188:2;45192:4;45184:3;:13::i;:::-;43764:42;45140:14;;;45155:10;45167:12;;45140:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;45118:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;45267:14;45284:13;:11;:13::i;:::-;45267:30;;45308:17;45328:6;45308:26;;45345:27;45351:9;45362;45345:5;:27::i;:::-;45411:4;45385:11;:23;45397:10;45385:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;45435:9;45428:16;;;;44908:544;;;:::o;21374:239::-;21446:7;21466:13;21482:7;:16;21490:7;21482:16;;;;;;;;;;;;;;;;;;;;;21466:32;;21534:1;21517:19;;:5;:19;;;;21509:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21600:5;21593:12;;;21374:239;;;:::o;21104:208::-;21176:7;21221:1;21204:19;;:5;:19;;;;21196:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21288:9;:16;21298:5;21288:16;;;;;;;;;;;;;;;;21281:23;;21104:208;;;:::o;42582:94::-;42162:12;:10;:12::i;:::-;42151:23;;:7;:5;:7::i;:::-;:23;;;42143:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42647:21:::1;42665:1;42647:9;:21::i;:::-;42582:94::o:0;41931:87::-;41977:7;42004:6;;;;;;;;;;;41997:13;;41931:87;:::o;21849:104::-;21905:13;21938:7;21931:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21849:104;:::o;23532:295::-;23647:12;:10;:12::i;:::-;23635:24;;:8;:24;;;;23627:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23747:8;23702:18;:32;23721:12;:10;:12::i;:::-;23702:32;;;;;;;;;;;;;;;:42;23735:8;23702:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23800:8;23771:48;;23786:12;:10;:12::i;:::-;23771:48;;;23810:8;23771:48;;;;;;:::i;:::-;;;;;;;;23532:295;;:::o;44056:306::-;42162:12;:10;:12::i;:::-;42151:23;;:7;:5;:7::i;:::-;:23;;;42143:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44132:5:::1;44116:13;;:21;;;;;;;;;;;;;;;;;44108:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44178:14;44195:13;:11;:13::i;:::-;44178:30;;44219:9;44239:85;44255:2;44251:1;:6;44239:85;;;44279:33;44289:10;44310:1;44301:6;:10;;;;:::i;:::-;44279:9;:33::i;:::-;44259:3;;;;;:::i;:::-;;;;44239:85;;;44350:4;44334:13;;:20;;;;;;;;;;;;;;;;;;42222:1;;44056:306::o:0;43487:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24795:328::-;24970:41;24989:12;:10;:12::i;:::-;25003:7;24970:18;:41::i;:::-;24962:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25076:39;25090:4;25096:2;25100:7;25109:5;25076:13;:39::i;:::-;24795:328;;;;:::o;45460:371::-;45513:4;45566:16;45574:7;45566;:16::i;:::-;45552:30;;:10;:30;;;45530:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45698:5;45673:30;;:12;:21;45686:7;45673:21;;;;;;;;;;;;;;;;;;;;;:30;;;45651:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45797:4;45773:12;:21;45786:7;45773:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;45819:4;45812:11;;45460:371;;;:::o;44370:319::-;44472:13;44525:17;44533:8;44525:7;:17::i;:::-;44503:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;44630:17;44650:10;:8;:10::i;:::-;44630:30;;44678:3;44671:10;;;44370:319;;;:::o;43646:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;44807:93::-;42162:12;:10;:12::i;:::-;42151:23;;:7;:5;:7::i;:::-;:23;;;42143:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44888:4:::1;44876:9;:16;;;;;;;;;;;;:::i;:::-;;44807:93:::0;:::o;23898:164::-;23995:4;24019:18;:25;24038:5;24019:25;;;;;;;;;;;;;;;:35;24045:8;24019:35;;;;;;;;;;;;;;;;;;;;;;;;;24012:42;;23898:164;;;;:::o;42831:192::-;42162:12;:10;:12::i;:::-;42151:23;;:7;:5;:7::i;:::-;:23;;;42143:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42940:1:::1;42920:22;;:8;:22;;;;42912:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42996:19;43006:8;42996:9;:19::i;:::-;42831:192:::0;:::o;43564:25::-;;;;;;;;;;;;;:::o;20735:305::-;20837:4;20889:25;20874:40;;;:11;:40;;;;:105;;;;20946:33;20931:48;;;:11;:48;;;;20874:105;:158;;;;20996:36;21020:11;20996:23;:36::i;:::-;20874:158;20854:178;;20735:305;;;:::o;26633:127::-;26698:4;26750:1;26722:30;;:7;:16;26730:7;26722:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26715:37;;26633:127;;;:::o;16149:98::-;16202:7;16229:10;16222:17;;16149:98;:::o;30615:174::-;30717:2;30690:15;:24;30706:7;30690:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30773:7;30769:2;30735:46;;30744:23;30759:7;30744:14;:23::i;:::-;30735:46;;;;;;;;;;;;30615:174;;:::o;26927:348::-;27020:4;27045:16;27053:7;27045;:16::i;:::-;27037:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27121:13;27137:23;27152:7;27137:14;:23::i;:::-;27121:39;;27190:5;27179:16;;:7;:16;;;:51;;;;27223:7;27199:31;;:20;27211:7;27199:11;:20::i;:::-;:31;;;27179:51;:87;;;;27234:32;27251:5;27258:7;27234:16;:32::i;:::-;27179:87;27171:96;;;26927:348;;;;:::o;29919:578::-;30078:4;30051:31;;:23;30066:7;30051:14;:23::i;:::-;:31;;;30043:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30161:1;30147:16;;:2;:16;;;;30139:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30217:39;30238:4;30244:2;30248:7;30217:20;:39::i;:::-;30321:29;30338:1;30342:7;30321:8;:29::i;:::-;30382:1;30363:9;:15;30373:4;30363:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30411:1;30394:9;:13;30404:2;30394:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30442:2;30423:7;:16;30431:7;30423:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30481:7;30477:2;30462:27;;30471:4;30462:27;;;;;;;;;;;;29919:578;;;:::o;45839:220::-;45897:7;45926:1;45921;:6;45917:20;;;45936:1;45929:8;;;;45917:20;45948:9;45964:1;45960;:5;;;;:::i;:::-;45948:17;;45993:1;45988;45984;:5;;;;:::i;:::-;:10;45976:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46050:1;46043:8;;;45839:220;;;;;:::o;28611:382::-;28705:1;28691:16;;:2;:16;;;;28683:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28764:16;28772:7;28764;:16::i;:::-;28763:17;28755:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28826:45;28855:1;28859:2;28863:7;28826:20;:45::i;:::-;28901:1;28884:9;:13;28894:2;28884:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28932:2;28913:7;:16;28921:7;28913:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28977:7;28973:2;28952:33;;28969:1;28952:33;;;;;;;;;;;;28611:382;;:::o;43031:173::-;43087:16;43106:6;;;;;;;;;;;43087:25;;43132:8;43123:6;;:17;;;;;;;;;;;;;;;;;;43187:8;43156:40;;43177:8;43156:40;;;;;;;;;;;;43031:173;;:::o;27617:110::-;27693:26;27703:2;27707:7;27693:26;;;;;;;;;;;;:9;:26::i;:::-;27617:110;;:::o;26005:315::-;26162:28;26172:4;26178:2;26182:7;26162:9;:28::i;:::-;26209:48;26232:4;26238:2;26242:7;26251:5;26209:22;:48::i;:::-;26201:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26005:315;;;;:::o;44697:102::-;44749:13;44782:9;44775:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44697:102;:::o;19237:157::-;19322:4;19361:25;19346:40;;;:11;:40;;;;19339:47;;19237:157;;;:::o;36459:589::-;36603:45;36630:4;36636:2;36640:7;36603:26;:45::i;:::-;36681:1;36665:18;;:4;:18;;;36661:187;;;36700:40;36732:7;36700:31;:40::i;:::-;36661:187;;;36770:2;36762:10;;:4;:10;;;36758:90;;36789:47;36822:4;36828:7;36789:32;:47::i;:::-;36758:90;36661:187;36876:1;36862:16;;:2;:16;;;36858:183;;;36895:45;36932:7;36895:36;:45::i;:::-;36858:183;;;36968:4;36962:10;;:2;:10;;;36958:83;;36989:40;37017:2;37021:7;36989:27;:40::i;:::-;36958:83;36858:183;36459:589;;;:::o;27954:321::-;28084:18;28090:2;28094:7;28084:5;:18::i;:::-;28135:54;28166:1;28170:2;28174:7;28183:5;28135:22;:54::i;:::-;28113:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27954:321;;;:::o;31354:799::-;31509:4;31530:15;:2;:13;;;:15::i;:::-;31526:620;;;31582:2;31566:36;;;31603:12;:10;:12::i;:::-;31617:4;31623:7;31632:5;31566:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31562:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31825:1;31808:6;:13;:18;31804:272;;;31851:60;;;;;;;;;;:::i;:::-;;;;;;;;31804:272;32026:6;32020:13;32011:6;32007:2;32003:15;31996:38;31562:529;31699:41;;;31689:51;;;:6;:51;;;;31682:58;;;;;31526:620;32130:4;32123:11;;31354:799;;;;;;;:::o;32725:126::-;;;;:::o;37771:164::-;37875:10;:17;;;;37848:15;:24;37864:7;37848:24;;;;;;;;;;;:44;;;;37903:10;37919:7;37903:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37771:164;:::o;38562:988::-;38828:22;38878:1;38853:22;38870:4;38853:16;:22::i;:::-;:26;;;;:::i;:::-;38828:51;;38890:18;38911:17;:26;38929:7;38911:26;;;;;;;;;;;;38890:47;;39058:14;39044:10;:28;39040:328;;39089:19;39111:12;:18;39124:4;39111:18;;;;;;;;;;;;;;;:34;39130:14;39111:34;;;;;;;;;;;;39089:56;;39195:11;39162:12;:18;39175:4;39162:18;;;;;;;;;;;;;;;:30;39181:10;39162:30;;;;;;;;;;;:44;;;;39312:10;39279:17;:30;39297:11;39279:30;;;;;;;;;;;:43;;;;39040:328;;39464:17;:26;39482:7;39464:26;;;;;;;;;;;39457:33;;;39508:12;:18;39521:4;39508:18;;;;;;;;;;;;;;;:34;39527:14;39508:34;;;;;;;;;;;39501:41;;;38562:988;;;;:::o;39845:1079::-;40098:22;40143:1;40123:10;:17;;;;:21;;;;:::i;:::-;40098:46;;40155:18;40176:15;:24;40192:7;40176:24;;;;;;;;;;;;40155:45;;40527:19;40549:10;40560:14;40549:26;;;;;;;;;;;;;;;;;;;;;;;;40527:48;;40613:11;40588:10;40599;40588:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40724:10;40693:15;:28;40709:11;40693:28;;;;;;;;;;;:41;;;;40865:15;:24;40881:7;40865:24;;;;;;;;;;;40858:31;;;40900:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39845:1079;;;;:::o;37349:221::-;37434:14;37451:20;37468:2;37451:16;:20::i;:::-;37434:37;;37509:7;37482:12;:16;37495:2;37482:16;;;;;;;;;;;;;;;:24;37499:6;37482:24;;;;;;;;;;;:34;;;;37556:6;37527:17;:26;37545:7;37527:26;;;;;;;;;;;:35;;;;37349:221;;;:::o;8189:387::-;8249:4;8457:12;8524:7;8512:20;8504:28;;8567:1;8560:4;:8;8553:15;;;8189:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:143::-;;2095:6;2089:13;2080:22;;2111:33;2138:5;2111:33;:::i;:::-;2070:80;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:260::-;;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5153:1;5150;5143:12;5105:2;5196:1;5221:52;5265:7;5256:6;5245:9;5241:22;5221:52;:::i;:::-;5211:62;;5167:116;5095:195;;;;:::o;5296:282::-;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5473:1;5498:63;5553:7;5544:6;5533:9;5529:22;5498:63;:::i;:::-;5488:73;;5444:127;5372:206;;;;:::o;5584:375::-;;5702:2;5690:9;5681:7;5677:23;5673:32;5670:2;;;5718:1;5715;5708:12;5670:2;5789:1;5778:9;5774:17;5761:31;5819:18;5811:6;5808:30;5805:2;;;5851:1;5848;5841:12;5805:2;5879:63;5934:7;5925:6;5914:9;5910:22;5879:63;:::i;:::-;5869:73;;5732:220;5660:299;;;;:::o;5965:262::-;;6073:2;6061:9;6052:7;6048:23;6044:32;6041:2;;;6089:1;6086;6079:12;6041:2;6132:1;6157:53;6202:7;6193:6;6182:9;6178:22;6157:53;:::i;:::-;6147:63;;6103:117;6031:196;;;;:::o;6233:284::-;;6352:2;6340:9;6331:7;6327:23;6323:32;6320:2;;;6368:1;6365;6358:12;6320:2;6411:1;6436:64;6492:7;6483:6;6472:9;6468:22;6436:64;:::i;:::-;6426:74;;6382:128;6310:207;;;;:::o;6523:118::-;6610:24;6628:5;6610:24;:::i;:::-;6605:3;6598:37;6588:53;;:::o;6647:109::-;6728:21;6743:5;6728:21;:::i;:::-;6723:3;6716:34;6706:50;;:::o;6762:360::-;;6876:38;6908:5;6876:38;:::i;:::-;6930:70;6993:6;6988:3;6930:70;:::i;:::-;6923:77;;7009:52;7054:6;7049:3;7042:4;7035:5;7031:16;7009:52;:::i;:::-;7086:29;7108:6;7086:29;:::i;:::-;7081:3;7077:39;7070:46;;6852:270;;;;;:::o;7128:179::-;7239:61;7294:5;7239:61;:::i;:::-;7234:3;7227:74;7217:90;;:::o;7313:364::-;;7429:39;7462:5;7429:39;:::i;:::-;7484:71;7548:6;7543:3;7484:71;:::i;:::-;7477:78;;7564:52;7609:6;7604:3;7597:4;7590:5;7586:16;7564:52;:::i;:::-;7641:29;7663:6;7641:29;:::i;:::-;7636:3;7632:39;7625:46;;7405:272;;;;;:::o;7683:375::-;;7846:67;7910:2;7905:3;7846:67;:::i;:::-;7839:74;;7943:34;7939:1;7934:3;7930:11;7923:55;8009:13;8004:2;7999:3;7995:12;7988:35;8049:2;8044:3;8040:12;8033:19;;7829:229;;;:::o;8064:382::-;;8227:67;8291:2;8286:3;8227:67;:::i;:::-;8220:74;;8324:34;8320:1;8315:3;8311:11;8304:55;8390:20;8385:2;8380:3;8376:12;8369:42;8437:2;8432:3;8428:12;8421:19;;8210:236;;;:::o;8452:370::-;;8615:67;8679:2;8674:3;8615:67;:::i;:::-;8608:74;;8712:34;8708:1;8703:3;8699:11;8692:55;8778:8;8773:2;8768:3;8764:12;8757:30;8813:2;8808:3;8804:12;8797:19;;8598:224;;;:::o;8828:329::-;;8991:67;9055:2;9050:3;8991:67;:::i;:::-;8984:74;;9088:33;9084:1;9079:3;9075:11;9068:54;9148:2;9143:3;9139:12;9132:19;;8974:183;;;:::o;9163:326::-;;9326:67;9390:2;9385:3;9326:67;:::i;:::-;9319:74;;9423:30;9419:1;9414:3;9410:11;9403:51;9480:2;9475:3;9471:12;9464:19;;9309:180;;;:::o;9495:328::-;;9658:67;9722:2;9717:3;9658:67;:::i;:::-;9651:74;;9755:32;9751:1;9746:3;9742:11;9735:53;9814:2;9809:3;9805:12;9798:19;;9641:182;;;:::o;9829:368::-;;9992:67;10056:2;10051:3;9992:67;:::i;:::-;9985:74;;10089:34;10085:1;10080:3;10076:11;10069:55;10155:6;10150:2;10145:3;10141:12;10134:28;10188:2;10183:3;10179:12;10172:19;;9975:222;;;:::o;10203:323::-;;10366:67;10430:2;10425:3;10366:67;:::i;:::-;10359:74;;10463:27;10459:1;10454:3;10450:11;10443:48;10517:2;10512:3;10508:12;10501:19;;10349:177;;;:::o;10532:376::-;;10695:67;10759:2;10754:3;10695:67;:::i;:::-;10688:74;;10792:34;10788:1;10783:3;10779:11;10772:55;10858:14;10853:2;10848:3;10844:12;10837:36;10899:2;10894:3;10890:12;10883:19;;10678:230;;;:::o;10914:388::-;;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11174:34;11170:1;11165:3;11161:11;11154:55;11240:26;11235:2;11230:3;11226:12;11219:48;11293:2;11288:3;11284:12;11277:19;;11060:242;;;:::o;11308:374::-;;11471:67;11535:2;11530:3;11471:67;:::i;:::-;11464:74;;11568:34;11564:1;11559:3;11555:11;11548:55;11634:12;11629:2;11624:3;11620:12;11613:34;11673:2;11668:3;11664:12;11657:19;;11454:228;;;:::o;11688:373::-;;11851:67;11915:2;11910:3;11851:67;:::i;:::-;11844:74;;11948:34;11944:1;11939:3;11935:11;11928:55;12014:11;12009:2;12004:3;12000:12;11993:33;12052:2;12047:3;12043:12;12036:19;;11834:227;;;:::o;12067:330::-;;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12327:34;12323:1;12318:3;12314:11;12307:55;12388:2;12383:3;12379:12;12372:19;;12213:184;;;:::o;12403:365::-;;12566:67;12630:2;12625:3;12566:67;:::i;:::-;12559:74;;12663:34;12659:1;12654:3;12650:11;12643:55;12729:3;12724:2;12719:3;12715:12;12708:25;12759:2;12754:3;12750:12;12743:19;;12549:219;;;:::o;12774:376::-;;12937:67;13001:2;12996:3;12937:67;:::i;:::-;12930:74;;13034:34;13030:1;13025:3;13021:11;13014:55;13100:14;13095:2;13090:3;13086:12;13079:36;13141:2;13136:3;13132:12;13125:19;;12920:230;;;:::o;13156:330::-;;13319:67;13383:2;13378:3;13319:67;:::i;:::-;13312:74;;13416:34;13412:1;13407:3;13403:11;13396:55;13477:2;13472:3;13468:12;13461:19;;13302:184;;;:::o;13492:327::-;;13655:67;13719:2;13714:3;13655:67;:::i;:::-;13648:74;;13752:31;13748:1;13743:3;13739:11;13732:52;13810:2;13805:3;13801:12;13794:19;;13638:181;;;:::o;13825:373::-;;13988:67;14052:2;14047:3;13988:67;:::i;:::-;13981:74;;14085:34;14081:1;14076:3;14072:11;14065:55;14151:11;14146:2;14141:3;14137:12;14130:33;14189:2;14184:3;14180:12;14173:19;;13971:227;;;:::o;14204:379::-;;14367:67;14431:2;14426:3;14367:67;:::i;:::-;14360:74;;14464:34;14460:1;14455:3;14451:11;14444:55;14530:17;14525:2;14520:3;14516:12;14509:39;14574:2;14569:3;14565:12;14558:19;;14350:233;;;:::o;14589:326::-;;14752:67;14816:2;14811:3;14752:67;:::i;:::-;14745:74;;14849:30;14845:1;14840:3;14836:11;14829:51;14906:2;14901:3;14897:12;14890:19;;14735:180;;;:::o;14921:365::-;;15084:67;15148:2;15143:3;15084:67;:::i;:::-;15077:74;;15181:34;15177:1;15172:3;15168:11;15161:55;15247:3;15242:2;15237:3;15233:12;15226:25;15277:2;15272:3;15268:12;15261:19;;15067:219;;;:::o;15292:381::-;;15455:67;15519:2;15514:3;15455:67;:::i;:::-;15448:74;;15552:34;15548:1;15543:3;15539:11;15532:55;15618:19;15613:2;15608:3;15604:12;15597:41;15664:2;15659:3;15655:12;15648:19;;15438:235;;;:::o;15679:323::-;;15842:67;15906:2;15901:3;15842:67;:::i;:::-;15835:74;;15939:27;15935:1;15930:3;15926:11;15919:48;15993:2;15988:3;15984:12;15977:19;;15825:177;;;:::o;16008:376::-;;16171:67;16235:2;16230:3;16171:67;:::i;:::-;16164:74;;16268:34;16264:1;16259:3;16255:11;16248:55;16334:14;16329:2;16324:3;16320:12;16313:36;16375:2;16370:3;16366:12;16359:19;;16154:230;;;:::o;16390:118::-;16477:24;16495:5;16477:24;:::i;:::-;16472:3;16465:37;16455:53;;:::o;16514:222::-;;16645:2;16634:9;16630:18;16622:26;;16658:71;16726:1;16715:9;16711:17;16702:6;16658:71;:::i;:::-;16612:124;;;;:::o;16742:640::-;;16975:3;16964:9;16960:19;16952:27;;16989:71;17057:1;17046:9;17042:17;17033:6;16989:71;:::i;:::-;17070:72;17138:2;17127:9;17123:18;17114:6;17070:72;:::i;:::-;17152;17220:2;17209:9;17205:18;17196:6;17152:72;:::i;:::-;17271:9;17265:4;17261:20;17256:2;17245:9;17241:18;17234:48;17299:76;17370:4;17361:6;17299:76;:::i;:::-;17291:84;;16942:440;;;;;;;:::o;17388:332::-;;17547:2;17536:9;17532:18;17524:26;;17560:71;17628:1;17617:9;17613:17;17604:6;17560:71;:::i;:::-;17641:72;17709:2;17698:9;17694:18;17685:6;17641:72;:::i;:::-;17514:206;;;;;:::o;17726:210::-;;17851:2;17840:9;17836:18;17828:26;;17864:65;17926:1;17915:9;17911:17;17902:6;17864:65;:::i;:::-;17818:118;;;;:::o;17942:270::-;;18097:2;18086:9;18082:18;18074:26;;18110:95;18202:1;18191:9;18187:17;18178:6;18110:95;:::i;:::-;18064:148;;;;:::o;18218:313::-;;18369:2;18358:9;18354:18;18346:26;;18418:9;18412:4;18408:20;18404:1;18393:9;18389:17;18382:47;18446:78;18519:4;18510:6;18446:78;:::i;:::-;18438:86;;18336:195;;;;:::o;18537:419::-;;18741:2;18730:9;18726:18;18718:26;;18790:9;18784:4;18780:20;18776:1;18765:9;18761:17;18754:47;18818:131;18944:4;18818:131;:::i;:::-;18810:139;;18708:248;;;:::o;18962:419::-;;19166:2;19155:9;19151:18;19143:26;;19215:9;19209:4;19205:20;19201:1;19190:9;19186:17;19179:47;19243:131;19369:4;19243:131;:::i;:::-;19235:139;;19133:248;;;:::o;19387:419::-;;19591:2;19580:9;19576:18;19568:26;;19640:9;19634:4;19630:20;19626:1;19615:9;19611:17;19604:47;19668:131;19794:4;19668:131;:::i;:::-;19660:139;;19558:248;;;:::o;19812:419::-;;20016:2;20005:9;20001:18;19993:26;;20065:9;20059:4;20055:20;20051:1;20040:9;20036:17;20029:47;20093:131;20219:4;20093:131;:::i;:::-;20085:139;;19983:248;;;:::o;20237:419::-;;20441:2;20430:9;20426:18;20418:26;;20490:9;20484:4;20480:20;20476:1;20465:9;20461:17;20454:47;20518:131;20644:4;20518:131;:::i;:::-;20510:139;;20408:248;;;:::o;20662:419::-;;20866:2;20855:9;20851:18;20843:26;;20915:9;20909:4;20905:20;20901:1;20890:9;20886:17;20879:47;20943:131;21069:4;20943:131;:::i;:::-;20935:139;;20833:248;;;:::o;21087:419::-;;21291:2;21280:9;21276:18;21268:26;;21340:9;21334:4;21330:20;21326:1;21315:9;21311:17;21304:47;21368:131;21494:4;21368:131;:::i;:::-;21360:139;;21258:248;;;:::o;21512:419::-;;21716:2;21705:9;21701:18;21693:26;;21765:9;21759:4;21755:20;21751:1;21740:9;21736:17;21729:47;21793:131;21919:4;21793:131;:::i;:::-;21785:139;;21683:248;;;:::o;21937:419::-;;22141:2;22130:9;22126:18;22118:26;;22190:9;22184:4;22180:20;22176:1;22165:9;22161:17;22154:47;22218:131;22344:4;22218:131;:::i;:::-;22210:139;;22108:248;;;:::o;22362:419::-;;22566:2;22555:9;22551:18;22543:26;;22615:9;22609:4;22605:20;22601:1;22590:9;22586:17;22579:47;22643:131;22769:4;22643:131;:::i;:::-;22635:139;;22533:248;;;:::o;22787:419::-;;22991:2;22980:9;22976:18;22968:26;;23040:9;23034:4;23030:20;23026:1;23015:9;23011:17;23004:47;23068:131;23194:4;23068:131;:::i;:::-;23060:139;;22958:248;;;:::o;23212:419::-;;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:131;23619:4;23493:131;:::i;:::-;23485:139;;23383:248;;;:::o;23637:419::-;;23841:2;23830:9;23826:18;23818:26;;23890:9;23884:4;23880:20;23876:1;23865:9;23861:17;23854:47;23918:131;24044:4;23918:131;:::i;:::-;23910:139;;23808:248;;;:::o;24062:419::-;;24266:2;24255:9;24251:18;24243:26;;24315:9;24309:4;24305:20;24301:1;24290:9;24286:17;24279:47;24343:131;24469:4;24343:131;:::i;:::-;24335:139;;24233:248;;;:::o;24487:419::-;;24691:2;24680:9;24676:18;24668:26;;24740:9;24734:4;24730:20;24726:1;24715:9;24711:17;24704:47;24768:131;24894:4;24768:131;:::i;:::-;24760:139;;24658:248;;;:::o;24912:419::-;;25116:2;25105:9;25101:18;25093:26;;25165:9;25159:4;25155:20;25151:1;25140:9;25136:17;25129:47;25193:131;25319:4;25193:131;:::i;:::-;25185:139;;25083:248;;;:::o;25337:419::-;;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:131;25744:4;25618:131;:::i;:::-;25610:139;;25508:248;;;:::o;25762:419::-;;25966:2;25955:9;25951:18;25943:26;;26015:9;26009:4;26005:20;26001:1;25990:9;25986:17;25979:47;26043:131;26169:4;26043:131;:::i;:::-;26035:139;;25933:248;;;:::o;26187:419::-;;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26358:248;;;:::o;26612:419::-;;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26783:248;;;:::o;27037:419::-;;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:131;27444:4;27318:131;:::i;:::-;27310:139;;27208:248;;;:::o;27462:419::-;;27666:2;27655:9;27651:18;27643:26;;27715:9;27709:4;27705:20;27701:1;27690:9;27686:17;27679:47;27743:131;27869:4;27743:131;:::i;:::-;27735:139;;27633:248;;;:::o;27887:419::-;;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:131;28294:4;28168:131;:::i;:::-;28160:139;;28058:248;;;:::o;28312:419::-;;28516:2;28505:9;28501:18;28493:26;;28565:9;28559:4;28555:20;28551:1;28540:9;28536:17;28529:47;28593:131;28719:4;28593:131;:::i;:::-;28585:139;;28483:248;;;:::o;28737:222::-;;28868:2;28857:9;28853:18;28845:26;;28881:71;28949:1;28938:9;28934:17;28925:6;28881:71;:::i;:::-;28835:124;;;;:::o;28965:283::-;;29031:2;29025:9;29015:19;;29073:4;29065:6;29061:17;29180:6;29168:10;29165:22;29144:18;29132:10;29129:34;29126:62;29123:2;;;29191:18;;:::i;:::-;29123:2;29231:10;29227:2;29220:22;29005:243;;;;:::o;29254:331::-;;29405:18;29397:6;29394:30;29391:2;;;29427:18;;:::i;:::-;29391:2;29512:4;29508:9;29501:4;29493:6;29489:17;29485:33;29477:41;;29573:4;29567;29563:15;29555:23;;29320:265;;;:::o;29591:332::-;;29743:18;29735:6;29732:30;29729:2;;;29765:18;;:::i;:::-;29729:2;29850:4;29846:9;29839:4;29831:6;29827:17;29823:33;29815:41;;29911:4;29905;29901:15;29893:23;;29658:265;;;:::o;29929:98::-;;30014:5;30008:12;29998:22;;29987:40;;;:::o;30033:99::-;;30119:5;30113:12;30103:22;;30092:40;;;:::o;30138:168::-;;30255:6;30250:3;30243:19;30295:4;30290:3;30286:14;30271:29;;30233:73;;;;:::o;30312:169::-;;30430:6;30425:3;30418:19;30470:4;30465:3;30461:14;30446:29;;30408:73;;;;:::o;30487:305::-;;30546:20;30564:1;30546:20;:::i;:::-;30541:25;;30580:20;30598:1;30580:20;:::i;:::-;30575:25;;30734:1;30666:66;30662:74;30659:1;30656:81;30653:2;;;30740:18;;:::i;:::-;30653:2;30784:1;30781;30777:9;30770:16;;30531:261;;;;:::o;30798:185::-;;30855:20;30873:1;30855:20;:::i;:::-;30850:25;;30889:20;30907:1;30889:20;:::i;:::-;30884:25;;30928:1;30918:2;;30933:18;;:::i;:::-;30918:2;30975:1;30972;30968:9;30963:14;;30840:143;;;;:::o;30989:348::-;;31052:20;31070:1;31052:20;:::i;:::-;31047:25;;31086:20;31104:1;31086:20;:::i;:::-;31081:25;;31274:1;31206:66;31202:74;31199:1;31196:81;31191:1;31184:9;31177:17;31173:105;31170:2;;;31281:18;;:::i;:::-;31170:2;31329:1;31326;31322:9;31311:20;;31037:300;;;;:::o;31343:191::-;;31403:20;31421:1;31403:20;:::i;:::-;31398:25;;31437:20;31455:1;31437:20;:::i;:::-;31432:25;;31476:1;31473;31470:8;31467:2;;;31481:18;;:::i;:::-;31467:2;31526:1;31523;31519:9;31511:17;;31388:146;;;;:::o;31540:96::-;;31606:24;31624:5;31606:24;:::i;:::-;31595:35;;31585:51;;;:::o;31642:90::-;;31719:5;31712:13;31705:21;31694:32;;31684:48;;;:::o;31738:149::-;;31814:66;31807:5;31803:78;31792:89;;31782:105;;;:::o;31893:126::-;;31970:42;31963:5;31959:54;31948:65;;31938:81;;;:::o;32025:77::-;;32091:5;32080:16;;32070:32;;;:::o;32108:174::-;;32215:61;32270:5;32215:61;:::i;:::-;32202:74;;32192:90;;;:::o;32288:137::-;;32395:24;32413:5;32395:24;:::i;:::-;32382:37;;32372:53;;;:::o;32431:154::-;32515:6;32510:3;32505;32492:30;32577:1;32568:6;32563:3;32559:16;32552:27;32482:103;;;:::o;32591:307::-;32659:1;32669:113;32683:6;32680:1;32677:13;32669:113;;;32768:1;32763:3;32759:11;32753:18;32749:1;32744:3;32740:11;32733:39;32705:2;32702:1;32698:10;32693:15;;32669:113;;;32800:6;32797:1;32794:13;32791:2;;;32880:1;32871:6;32866:3;32862:16;32855:27;32791:2;32640:258;;;;:::o;32904:320::-;;32985:1;32979:4;32975:12;32965:22;;33032:1;33026:4;33022:12;33053:18;33043:2;;33109:4;33101:6;33097:17;33087:27;;33043:2;33171;33163:6;33160:14;33140:18;33137:38;33134:2;;;33190:18;;:::i;:::-;33134:2;32955:269;;;;:::o;33230:233::-;;33292:24;33310:5;33292:24;:::i;:::-;33283:33;;33338:66;33331:5;33328:77;33325:2;;;33408:18;;:::i;:::-;33325:2;33455:1;33448:5;33444:13;33437:20;;33273:190;;;:::o;33469:180::-;33517:77;33514:1;33507:88;33614:4;33611:1;33604:15;33638:4;33635:1;33628:15;33655:180;33703:77;33700:1;33693:88;33800:4;33797:1;33790:15;33824:4;33821:1;33814:15;33841:180;33889:77;33886:1;33879:88;33986:4;33983:1;33976:15;34010:4;34007:1;34000:15;34027:180;34075:77;34072:1;34065:88;34172:4;34169:1;34162:15;34196:4;34193:1;34186:15;34213:102;;34305:2;34301:7;34296:2;34289:5;34285:14;34281:28;34271:38;;34261:54;;;:::o;34321:122::-;34394:24;34412:5;34394:24;:::i;:::-;34387:5;34384:35;34374:2;;34433:1;34430;34423:12;34374:2;34364:79;:::o;34449:116::-;34519:21;34534:5;34519:21;:::i;:::-;34512:5;34509:32;34499:2;;34555:1;34552;34545:12;34499:2;34489:76;:::o;34571:120::-;34643:23;34660:5;34643:23;:::i;:::-;34636:5;34633:34;34623:2;;34681:1;34678;34671:12;34623:2;34613:78;:::o;34697:122::-;34770:24;34788:5;34770:24;:::i;:::-;34763:5;34760:35;34750:2;;34809:1;34806;34799:12;34750:2;34740:79;:::o

Swarm Source

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