ETH Price: $3,881.99 (-1.25%)

Token

Potion Punks (PKEY)
 

Overview

Max Total Supply

1,025 PKEY

Holders

308

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 PKEY
0x79ec97834c585e94e5102cfefd2d61e042e19952
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:
PotionPunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-24
*/

// Sources flattened with hardhat v2.5.0 https://hardhat.org
 
// File contracts/utils/introspection/IERC165.sol
 
// SPDX-License-Identifier: MIT
 
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 contracts/token/ERC721/IERC721.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
 
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
 
    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
 
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
 
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
 
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
 
    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;
 
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is 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 contracts/token/ERC721/IERC721Receiver.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
 
 
// File contracts/token/ERC721/extensions/IERC721Metadata.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
 
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);
 
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
 
 
// File contracts/utils/Address.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
 
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");
 
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
 
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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
 
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
 
// File contracts/utils/Context.sol
 
 
 
pragma solidity ^0.8.0;
 
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
 
 
// File contracts/utils/Strings.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
 
}
 
 
// File contracts/utils/introspection/ERC165.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
 
 
// File contracts/token/ERC721/ERC721.sol
 
 
 
pragma solidity ^0.8.0;
 
 
 
 
 
 
 
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
 
    // Token name
    string private _name;
 
    // Token symbol
    string private _symbol;
 
    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;
 
    // Mapping owner address to token count
    mapping (address => uint256) private _balances;
 
    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;
 
    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;
 
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
 
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId
            || interfaceId == type(IERC721Metadata).interfaceId
            || super.supportsInterface(interfaceId);
    }
 
    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }
 
    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
 
    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
 
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : '';
    }
 
    /**
     * @dev Base URI for computing {tokenURI}. 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}
 
 
// File contracts/token/ERC721/extensions/ERC721URIStorage.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;
 
    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;
 
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
 
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
 
        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
 
        return super.tokenURI(tokenId);
    }
 
    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
 
    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
 
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}
 
 
// File contracts/access/Ownable.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.8.0;

interface ApeInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);
}


 

contract PotionPunks is ERC721URIStorage, Ownable {

    event MintPotionPunk (address indexed minter, uint256 startWith, uint256 times);
   
    
    uint256 public totalPotionPunks; //bruh man strikes again 
    uint256 public totalCount = 3500; 
    string public baseURI;
    bool public started;
    mapping(address => uint256) apeHolderMintCount;
    mapping(uint256 => bool) claimedApes;
    uint addressRegistryCount;
    bool public apeHolderStart;
    
    
    
    // Allowing the free mint to ape holders
    
    address public apeAddress = 0xf2bCA53F401C0F53cA78e9270efd1F7B5330b522;
    ApeInterface apeContract = ApeInterface(apeAddress);
  
    
    
    constructor(string memory name_, string memory symbol_, string memory baseURI_) ERC721(name_, symbol_) {
        baseURI = baseURI_;
    }
    

    modifier mintEnabled() {
        require(started, "not started");
        _;
    }
    
    modifier apeHolderEnabled() {
        require(apeHolderStart, "not started");
        _;
    }
 
    function totalSupply() public view virtual returns (uint256) {
        return totalPotionPunks;
       
    }
 
    function _baseURI() internal view virtual override returns (string memory){
        return baseURI;
    }
 
    function setBaseURI(string memory _newURI) public onlyOwner {
        baseURI = _newURI;
    }
    
 
    function setTokenURI(uint256 _tokenId, string memory _tokenURI) public onlyOwner {
        _setTokenURI(_tokenId, _tokenURI);
    }
 
    function setNormalStart(bool _start) public onlyOwner {
        started = _start;
    }
    
    function setFreeMintStart(bool _start) public onlyOwner {
        apeHolderStart = _start;
    }
    
    function changeTotalCount(uint256 _count) public onlyOwner {
        totalPotionPunks = _count;
    }
    
    
    function apeHolderFreeMint(uint256[] memory _apeIds) public apeHolderEnabled {
        
        require(ownsAllTheApes(_apeIds,msg.sender), "You do not own all these apes");
        require(apeContract.balanceOf(msg.sender) > 0, "Must own a Genesis ape");
        require(totalPotionPunks + 1 <= totalCount, "Mint amount will exceed total collection amount.");
        require(claimedAllTheApes(_apeIds), "These apes have already been claimed");
        
        emit MintPotionPunk(msg.sender, totalPotionPunks+1, _apeIds.length);
        for (uint256 i = 0; i < _apeIds.length; i++) {
            
            if(claimedApes[_apeIds[i]] == false) {
                claimedApes[_apeIds[i]] = true;
                totalPotionPunks++;
                _mint(_msgSender(), _apeIds[i]);
            }

        }
        
    }
    
    
    function ownsAllTheApes(uint256[] memory _apeIds, address _owner) public view returns(bool success){
        
        for(uint256 i = 0; i < _apeIds.length; i++){
            if(apeContract.ownerOf(_apeIds[i]) == _owner ){
                continue;
            }
            
            return false;
            
        }
        return true;
        
    }


    function claimedAllTheApes(uint256[] memory _apeIds) public view returns(bool success){
        
        for(uint256 i = 0; i < _apeIds.length; i++){
            if(claimedApes[_apeIds[i]]){
                return false;
            }            
        }
        return true;
        
    }

    
    
    function claimed(uint256 _id) public view  returns (bool success){
        return claimedApes[_id];
    }
    

    
    function adminMintGiveaways(address _addr) public onlyOwner {
        require(totalPotionPunks + 1 <= totalCount, "Mint amount will exceed total collection amount.");
        emit MintPotionPunk(_addr, totalPotionPunks+1, 1);
        _mint(_addr, 1 + totalPotionPunks++);
    } 
    
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","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":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"startWith","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"times","type":"uint256"}],"name":"MintPotionPunk","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":[{"internalType":"address","name":"_addr","type":"address"}],"name":"adminMintGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_apeIds","type":"uint256[]"}],"name":"apeHolderFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apeHolderStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"changeTotalCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_apeIds","type":"uint256[]"}],"name":"claimedAllTheApes","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"_apeIds","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"ownsAllTheApes","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setFreeMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setNormalStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPotionPunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

6080604052610dac60095573f2bca53f401c0f53ca78e9270efd1f7b5330b522600f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000cf57600080fd5b506040516200485a3803806200485a8339818101604052810190620000f5919062000334565b828281600090805190602001906200010f92919062000206565b5080600190805190602001906200012892919062000206565b50505060006200013d620001fe60201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600a9080519060200190620001f492919062000206565b5050505062000571565b600033905090565b828054620002149062000482565b90600052602060002090601f01602090048101928262000238576000855562000284565b82601f106200025357805160ff191683800117855562000284565b8280016001018555821562000284579182015b828111156200028357825182559160200191906001019062000266565b5b50905062000293919062000297565b5090565b5b80821115620002b257600081600090555060010162000298565b5090565b6000620002cd620002c78462000416565b620003ed565b905082815260208101848484011115620002ec57620002eb62000551565b5b620002f98482856200044c565b509392505050565b600082601f8301126200031957620003186200054c565b5b81516200032b848260208601620002b6565b91505092915050565b60008060006060848603121562000350576200034f6200055b565b5b600084015167ffffffffffffffff81111562000371576200037062000556565b5b6200037f8682870162000301565b935050602084015167ffffffffffffffff811115620003a357620003a262000556565b5b620003b18682870162000301565b925050604084015167ffffffffffffffff811115620003d557620003d462000556565b5b620003e38682870162000301565b9150509250925092565b6000620003f96200040c565b9050620004078282620004b8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200043457620004336200051d565b5b6200043f8262000560565b9050602081019050919050565b60005b838110156200046c5780820151818401526020810190506200044f565b838111156200047c576000848401525b50505050565b600060028204905060018216806200049b57607f821691505b60208210811415620004b257620004b1620004ee565b5b50919050565b620004c38262000560565b810181811067ffffffffffffffff82111715620004e557620004e46200051d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6142d980620005816000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806355f804b31161011a5780638da5cb5b116100ad578063b88d4fde1161007c578063b88d4fde1461058a578063c87b56dd146105a6578063dbe7e3bd146105d6578063e985e9c514610606578063f2fde38b14610636576101fb565b80638da5cb5b14610516578063917bb57f1461053457806395d89b4114610550578063a22cb4651461056e576101fb565b806363feb9c2116100e957806363feb9c21461048e5780636c0360eb146104be57806370a08231146104dc578063715018a61461050c576101fb565b806355f804b31461040857806360f61cec146104245780636352211e1461044257806363d3c4b014610472576101fb565b806323b872dd1161019257806334eafb111161016157806334eafb11146103965780633c49a8a9146103b457806342842e0e146103d0578063441f9571146103ec576101fb565b806323b872dd14610322578063249a99731461033e57806326202f0e1461035c5780632cfad39a14610378576101fb565b8063095ea7b3116101ce578063095ea7b3146102ae578063162094c4146102ca57806318160ddd146102e65780631f2698ab14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063073175131461024e578063081812fc1461027e575b600080fd5b61021a60048036038101906102159190612e5b565b610652565b6040516102279190613443565b60405180910390f35b610238610734565b604051610245919061345e565b60405180910390f35b61026860048036038101906102639190612d89565b6107c6565b6040516102759190613443565b60405180910390f35b61029860048036038101906102939190612efe565b61083f565b6040516102a591906133dc565b60405180910390f35b6102c860048036038101906102c39190612d49565b6108c4565b005b6102e460048036038101906102df9190612f58565b6109dc565b005b6102ee610a66565b6040516102fb9190613760565b60405180910390f35b61030c610a70565b6040516103199190613443565b60405180910390f35b61033c60048036038101906103379190612c33565b610a83565b005b610346610ae3565b6040516103539190613443565b60405180910390f35b61037660048036038101906103719190612d89565b610af6565b005b610380610e69565b60405161038d9190613760565b60405180910390f35b61039e610e6f565b6040516103ab9190613760565b60405180910390f35b6103ce60048036038101906103c99190612b99565b610e75565b005b6103ea60048036038101906103e59190612c33565b610fd2565b005b61040660048036038101906104019190612efe565b610ff2565b005b610422600480360381019061041d9190612eb5565b611078565b005b61042c61110e565b60405161043991906133dc565b60405180910390f35b61045c60048036038101906104579190612efe565b611134565b60405161046991906133dc565b60405180910390f35b61048c60048036038101906104879190612e2e565b6111e6565b005b6104a860048036038101906104a39190612dd2565b61127f565b6040516104b59190613443565b60405180910390f35b6104c66113b6565b6040516104d3919061345e565b60405180910390f35b6104f660048036038101906104f19190612b99565b611444565b6040516105039190613760565b60405180910390f35b6105146114fc565b005b61051e611639565b60405161052b91906133dc565b60405180910390f35b61054e60048036038101906105499190612e2e565b611663565b005b6105586116fc565b604051610565919061345e565b60405180910390f35b61058860048036038101906105839190612d09565b61178e565b005b6105a4600480360381019061059f9190612c86565b61190f565b005b6105c060048036038101906105bb9190612efe565b611971565b6040516105cd919061345e565b60405180910390f35b6105f060048036038101906105eb9190612efe565b611ac3565b6040516105fd9190613443565b60405180910390f35b610620600480360381019061061b9190612bf3565b611aed565b60405161062d9190613443565b60405180910390f35b610650600480360381019061064b9190612b99565b611b81565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061072d575061072c82611d2d565b5b9050919050565b60606000805461074390613a46565b80601f016020809104026020016040519081016040528092919081815260200182805461076f90613a46565b80156107bc5780601f10610791576101008083540402835291602001916107bc565b820191906000526020600020905b81548152906001019060200180831161079f57829003601f168201915b5050505050905090565b600080600090505b825181101561083457600d60008483815181106107ee576107ed613bb0565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161561082157600091505061083a565b808061082c90613aa9565b9150506107ce565b50600190505b919050565b600061084a82611d97565b610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090613620565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cf82611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610937906136c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095f611e03565b73ffffffffffffffffffffffffffffffffffffffff16148061098e575061098d81610988611e03565b611aed565b5b6109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490613540565b60405180910390fd5b6109d78383611e0b565b505050565b6109e4611e03565b73ffffffffffffffffffffffffffffffffffffffff16610a02611639565b73ffffffffffffffffffffffffffffffffffffffff1614610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f90613640565b60405180910390fd5b610a628282611ec4565b5050565b6000600854905090565b600b60009054906101000a900460ff1681565b610a94610a8e611e03565b82611f38565b610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906136e0565b60405180910390fd5b610ade838383612016565b505050565b600f60009054906101000a900460ff1681565b600f60009054906101000a900460ff16610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613740565b60405180910390fd5b610b4f813361127f565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906135c0565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610beb91906133dc565b60206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3b9190612f2b565b11610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906136a0565b60405180910390fd5b6009546001600854610c8d91906138c3565b1115610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613720565b60405180910390fd5b610cd7816107c6565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613700565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe88363bb89e692935bee34c73cef0533f691afda481dbf1eb44fce483c77305f6001600854610d5d91906138c3565b8351604051610d6d9291906137a4565b60405180910390a260005b8151811015610e655760001515600d6000848481518110610d9c57610d9b613bb0565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615151415610e52576001600d6000848481518110610de157610de0613bb0565b5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060086000815480929190610e2190613aa9565b9190505550610e51610e31611e03565b838381518110610e4457610e43613bb0565b5b6020026020010151612272565b5b8080610e5d90613aa9565b915050610d78565b5050565b60085481565b60095481565b610e7d611e03565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611639565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890613640565b60405180910390fd5b6009546001600854610f0391906138c3565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90613720565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fe88363bb89e692935bee34c73cef0533f691afda481dbf1eb44fce483c77305f6001600854610f8b91906138c3565b6001604051610f9b92919061377b565b60405180910390a2610fcf8160086000815480929190610fba90613aa9565b919050556001610fca91906138c3565b612272565b50565b610fed8383836040518060200160405280600081525061190f565b505050565b610ffa611e03565b73ffffffffffffffffffffffffffffffffffffffff16611018611639565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613640565b60405180910390fd5b8060088190555050565b611080611e03565b73ffffffffffffffffffffffffffffffffffffffff1661109e611639565b73ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90613640565b60405180910390fd5b80600a908051906020019061110a9291906128e5565b5050565b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613580565b60405180910390fd5b80915050919050565b6111ee611e03565b73ffffffffffffffffffffffffffffffffffffffff1661120c611639565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613640565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080600090505b83518110156113aa578273ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8684815181106112f8576112f7613bb0565b5b60200260200101516040518263ffffffff1660e01b815260040161131c9190613760565b60206040518083038186803b15801561133457600080fd5b505afa158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190612bc6565b73ffffffffffffffffffffffffffffffffffffffff16141561138d57611397565b60009150506113b0565b80806113a290613aa9565b915050611287565b50600190505b92915050565b600a80546113c390613a46565b80601f01602080910402602001604051908101604052809291908181526020018280546113ef90613a46565b801561143c5780601f106114115761010080835404028352916020019161143c565b820191906000526020600020905b81548152906001019060200180831161141f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613560565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611504611e03565b73ffffffffffffffffffffffffffffffffffffffff16611522611639565b73ffffffffffffffffffffffffffffffffffffffff1614611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90613640565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61166b611e03565b73ffffffffffffffffffffffffffffffffffffffff16611689611639565b73ffffffffffffffffffffffffffffffffffffffff16146116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d690613640565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60606001805461170b90613a46565b80601f016020809104026020016040519081016040528092919081815260200182805461173790613a46565b80156117845780601f1061175957610100808354040283529160200191611784565b820191906000526020600020905b81548152906001019060200180831161176757829003601f168201915b5050505050905090565b611796611e03565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb90613500565b60405180910390fd5b8060056000611811611e03565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118be611e03565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119039190613443565b60405180910390a35050565b61192061191a611e03565b83611f38565b61195f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611956906136e0565b60405180910390fd5b61196b84848484612440565b50505050565b606061197c82611d97565b6119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613600565b60405180910390fd5b60006006600084815260200190815260200160002080546119db90613a46565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0790613a46565b8015611a545780601f10611a2957610100808354040283529160200191611a54565b820191906000526020600020905b815481529060010190602001808311611a3757829003601f168201915b505050505090506000611a6561249c565b9050600081511415611a7b578192505050611abe565b600082511115611ab0578082604051602001611a989291906133b8565b60405160208183030381529060405292505050611abe565b611ab98461252e565b925050505b919050565b6000600d600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b89611e03565b73ffffffffffffffffffffffffffffffffffffffff16611ba7611639565b73ffffffffffffffffffffffffffffffffffffffff1614611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490613640565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906134a0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7e83611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ecd82611d97565b611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906135a0565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611f339291906128e5565b505050565b6000611f4382611d97565b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613520565b60405180910390fd5b6000611f8d83611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc57508373ffffffffffffffffffffffffffffffffffffffff16611fe48461083f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200d575061200c8185611aed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203682611134565b73ffffffffffffffffffffffffffffffffffffffff161461208c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208390613660565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f3906134e0565b60405180910390fd5b6121078383836125d5565b612112600082611e0b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612162919061394a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b991906138c3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d9906135e0565b60405180910390fd5b6122eb81611d97565b1561232b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612322906134c0565b60405180910390fd5b612337600083836125d5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238791906138c3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61244b848484612016565b612457848484846125da565b612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d90613480565b60405180910390fd5b50505050565b6060600a80546124ab90613a46565b80601f01602080910402602001604051908101604052809291908181526020018280546124d790613a46565b80156125245780601f106124f957610100808354040283529160200191612524565b820191906000526020600020905b81548152906001019060200180831161250757829003601f168201915b5050505050905090565b606061253982611d97565b612578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256f90613680565b60405180910390fd5b600061258261249c565b905060008151116125a257604051806020016040528060008152506125cd565b806125ac84612771565b6040516020016125bd9291906133b8565b6040516020818303038152906040525b915050919050565b505050565b60006125fb8473ffffffffffffffffffffffffffffffffffffffff166128d2565b15612764578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612624611e03565b8786866040518563ffffffff1660e01b815260040161264694939291906133f7565b602060405180830381600087803b15801561266057600080fd5b505af192505050801561269157506040513d601f19601f8201168201806040525081019061268e9190612e88565b60015b612714573d80600081146126c1576040519150601f19603f3d011682016040523d82523d6000602084013e6126c6565b606091505b5060008151141561270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390613480565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612769565b600190505b949350505050565b606060008214156127b9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128cd565b600082905060005b600082146127eb5780806127d490613aa9565b915050600a826127e49190613919565b91506127c1565b60008167ffffffffffffffff81111561280757612806613bdf565b5b6040519080825280601f01601f1916602001820160405280156128395781602001600182028036833780820191505090505b5090505b600085146128c657600182612852919061394a565b9150600a856128619190613af2565b603061286d91906138c3565b60f81b81838151811061288357612882613bb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128bf9190613919565b945061283d565b8093505050505b919050565b600080823b905060008111915050919050565b8280546128f190613a46565b90600052602060002090601f016020900481019282612913576000855561295a565b82601f1061292c57805160ff191683800117855561295a565b8280016001018555821561295a579182015b8281111561295957825182559160200191906001019061293e565b5b509050612967919061296b565b5090565b5b8082111561298457600081600090555060010161296c565b5090565b600061299b612996846137f2565b6137cd565b905080838252602082019050828560208602820111156129be576129bd613c13565b5b60005b858110156129ee57816129d48882612b6f565b8452602084019350602083019250506001810190506129c1565b5050509392505050565b6000612a0b612a068461381e565b6137cd565b905082815260208101848484011115612a2757612a26613c18565b5b612a32848285613a04565b509392505050565b6000612a4d612a488461384f565b6137cd565b905082815260208101848484011115612a6957612a68613c18565b5b612a74848285613a04565b509392505050565b600081359050612a8b81614247565b92915050565b600081519050612aa081614247565b92915050565b600082601f830112612abb57612aba613c0e565b5b8135612acb848260208601612988565b91505092915050565b600081359050612ae38161425e565b92915050565b600081359050612af881614275565b92915050565b600081519050612b0d81614275565b92915050565b600082601f830112612b2857612b27613c0e565b5b8135612b388482602086016129f8565b91505092915050565b600082601f830112612b5657612b55613c0e565b5b8135612b66848260208601612a3a565b91505092915050565b600081359050612b7e8161428c565b92915050565b600081519050612b938161428c565b92915050565b600060208284031215612baf57612bae613c22565b5b6000612bbd84828501612a7c565b91505092915050565b600060208284031215612bdc57612bdb613c22565b5b6000612bea84828501612a91565b91505092915050565b60008060408385031215612c0a57612c09613c22565b5b6000612c1885828601612a7c565b9250506020612c2985828601612a7c565b9150509250929050565b600080600060608486031215612c4c57612c4b613c22565b5b6000612c5a86828701612a7c565b9350506020612c6b86828701612a7c565b9250506040612c7c86828701612b6f565b9150509250925092565b60008060008060808587031215612ca057612c9f613c22565b5b6000612cae87828801612a7c565b9450506020612cbf87828801612a7c565b9350506040612cd087828801612b6f565b925050606085013567ffffffffffffffff811115612cf157612cf0613c1d565b5b612cfd87828801612b13565b91505092959194509250565b60008060408385031215612d2057612d1f613c22565b5b6000612d2e85828601612a7c565b9250506020612d3f85828601612ad4565b9150509250929050565b60008060408385031215612d6057612d5f613c22565b5b6000612d6e85828601612a7c565b9250506020612d7f85828601612b6f565b9150509250929050565b600060208284031215612d9f57612d9e613c22565b5b600082013567ffffffffffffffff811115612dbd57612dbc613c1d565b5b612dc984828501612aa6565b91505092915050565b60008060408385031215612de957612de8613c22565b5b600083013567ffffffffffffffff811115612e0757612e06613c1d565b5b612e1385828601612aa6565b9250506020612e2485828601612a7c565b9150509250929050565b600060208284031215612e4457612e43613c22565b5b6000612e5284828501612ad4565b91505092915050565b600060208284031215612e7157612e70613c22565b5b6000612e7f84828501612ae9565b91505092915050565b600060208284031215612e9e57612e9d613c22565b5b6000612eac84828501612afe565b91505092915050565b600060208284031215612ecb57612eca613c22565b5b600082013567ffffffffffffffff811115612ee957612ee8613c1d565b5b612ef584828501612b41565b91505092915050565b600060208284031215612f1457612f13613c22565b5b6000612f2284828501612b6f565b91505092915050565b600060208284031215612f4157612f40613c22565b5b6000612f4f84828501612b84565b91505092915050565b60008060408385031215612f6f57612f6e613c22565b5b6000612f7d85828601612b6f565b925050602083013567ffffffffffffffff811115612f9e57612f9d613c1d565b5b612faa85828601612b41565b9150509250929050565b612fbd8161397e565b82525050565b612fcc81613990565b82525050565b6000612fdd82613880565b612fe78185613896565b9350612ff7818560208601613a13565b61300081613c27565b840191505092915050565b613014816139f2565b82525050565b60006130258261388b565b61302f81856138a7565b935061303f818560208601613a13565b61304881613c27565b840191505092915050565b600061305e8261388b565b61306881856138b8565b9350613078818560208601613a13565b80840191505092915050565b60006130916032836138a7565b915061309c82613c38565b604082019050919050565b60006130b46026836138a7565b91506130bf82613c87565b604082019050919050565b60006130d7601c836138a7565b91506130e282613cd6565b602082019050919050565b60006130fa6024836138a7565b915061310582613cff565b604082019050919050565b600061311d6019836138a7565b915061312882613d4e565b602082019050919050565b6000613140602c836138a7565b915061314b82613d77565b604082019050919050565b60006131636038836138a7565b915061316e82613dc6565b604082019050919050565b6000613186602a836138a7565b915061319182613e15565b604082019050919050565b60006131a96029836138a7565b91506131b482613e64565b604082019050919050565b60006131cc602e836138a7565b91506131d782613eb3565b604082019050919050565b60006131ef601d836138a7565b91506131fa82613f02565b602082019050919050565b60006132126020836138a7565b915061321d82613f2b565b602082019050919050565b60006132356031836138a7565b915061324082613f54565b604082019050919050565b6000613258602c836138a7565b915061326382613fa3565b604082019050919050565b600061327b6020836138a7565b915061328682613ff2565b602082019050919050565b600061329e6029836138a7565b91506132a98261401b565b604082019050919050565b60006132c1602f836138a7565b91506132cc8261406a565b604082019050919050565b60006132e46016836138a7565b91506132ef826140b9565b602082019050919050565b60006133076021836138a7565b9150613312826140e2565b604082019050919050565b600061332a6031836138a7565b915061333582614131565b604082019050919050565b600061334d6024836138a7565b915061335882614180565b604082019050919050565b60006133706030836138a7565b915061337b826141cf565b604082019050919050565b6000613393600b836138a7565b915061339e8261421e565b602082019050919050565b6133b2816139e8565b82525050565b60006133c48285613053565b91506133d08284613053565b91508190509392505050565b60006020820190506133f16000830184612fb4565b92915050565b600060808201905061340c6000830187612fb4565b6134196020830186612fb4565b61342660408301856133a9565b81810360608301526134388184612fd2565b905095945050505050565b60006020820190506134586000830184612fc3565b92915050565b60006020820190508181036000830152613478818461301a565b905092915050565b6000602082019050818103600083015261349981613084565b9050919050565b600060208201905081810360008301526134b9816130a7565b9050919050565b600060208201905081810360008301526134d9816130ca565b9050919050565b600060208201905081810360008301526134f9816130ed565b9050919050565b6000602082019050818103600083015261351981613110565b9050919050565b6000602082019050818103600083015261353981613133565b9050919050565b6000602082019050818103600083015261355981613156565b9050919050565b6000602082019050818103600083015261357981613179565b9050919050565b600060208201905081810360008301526135998161319c565b9050919050565b600060208201905081810360008301526135b9816131bf565b9050919050565b600060208201905081810360008301526135d9816131e2565b9050919050565b600060208201905081810360008301526135f981613205565b9050919050565b6000602082019050818103600083015261361981613228565b9050919050565b600060208201905081810360008301526136398161324b565b9050919050565b600060208201905081810360008301526136598161326e565b9050919050565b6000602082019050818103600083015261367981613291565b9050919050565b60006020820190508181036000830152613699816132b4565b9050919050565b600060208201905081810360008301526136b9816132d7565b9050919050565b600060208201905081810360008301526136d9816132fa565b9050919050565b600060208201905081810360008301526136f98161331d565b9050919050565b6000602082019050818103600083015261371981613340565b9050919050565b6000602082019050818103600083015261373981613363565b9050919050565b6000602082019050818103600083015261375981613386565b9050919050565b600060208201905061377560008301846133a9565b92915050565b600060408201905061379060008301856133a9565b61379d602083018461300b565b9392505050565b60006040820190506137b960008301856133a9565b6137c660208301846133a9565b9392505050565b60006137d76137e8565b90506137e38282613a78565b919050565b6000604051905090565b600067ffffffffffffffff82111561380d5761380c613bdf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561383957613838613bdf565b5b61384282613c27565b9050602081019050919050565b600067ffffffffffffffff82111561386a57613869613bdf565b5b61387382613c27565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ce826139e8565b91506138d9836139e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390e5761390d613b23565b5b828201905092915050565b6000613924826139e8565b915061392f836139e8565b92508261393f5761393e613b52565b5b828204905092915050565b6000613955826139e8565b9150613960836139e8565b92508282101561397357613972613b23565b5b828203905092915050565b6000613989826139c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006139fd826139e8565b9050919050565b82818337600083830152505050565b60005b83811015613a31578082015181840152602081019050613a16565b83811115613a40576000848401525b50505050565b60006002820490506001821680613a5e57607f821691505b60208210811415613a7257613a71613b81565b5b50919050565b613a8182613c27565b810181811067ffffffffffffffff82111715613aa057613a9f613bdf565b5b80604052505050565b6000613ab4826139e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ae757613ae6613b23565b5b600182019050919050565b6000613afd826139e8565b9150613b08836139e8565b925082613b1857613b17613b52565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e20616c6c2074686573652061706573000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d757374206f776e20612047656e657369732061706500000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f54686573652061706573206861766520616c7265616479206265656e20636c6160008201527f696d656400000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b6142508161397e565b811461425b57600080fd5b50565b61426781613990565b811461427257600080fd5b50565b61427e8161399c565b811461428957600080fd5b50565b614295816139e8565b81146142a057600080fd5b5056fea26469706673582212203fd91cb29f92906b7fd2327da58621d1a78534ae18f737d86b3084a6b460870964736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c506f74696f6e2050756e6b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004504b4559000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806355f804b31161011a5780638da5cb5b116100ad578063b88d4fde1161007c578063b88d4fde1461058a578063c87b56dd146105a6578063dbe7e3bd146105d6578063e985e9c514610606578063f2fde38b14610636576101fb565b80638da5cb5b14610516578063917bb57f1461053457806395d89b4114610550578063a22cb4651461056e576101fb565b806363feb9c2116100e957806363feb9c21461048e5780636c0360eb146104be57806370a08231146104dc578063715018a61461050c576101fb565b806355f804b31461040857806360f61cec146104245780636352211e1461044257806363d3c4b014610472576101fb565b806323b872dd1161019257806334eafb111161016157806334eafb11146103965780633c49a8a9146103b457806342842e0e146103d0578063441f9571146103ec576101fb565b806323b872dd14610322578063249a99731461033e57806326202f0e1461035c5780632cfad39a14610378576101fb565b8063095ea7b3116101ce578063095ea7b3146102ae578063162094c4146102ca57806318160ddd146102e65780631f2698ab14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063073175131461024e578063081812fc1461027e575b600080fd5b61021a60048036038101906102159190612e5b565b610652565b6040516102279190613443565b60405180910390f35b610238610734565b604051610245919061345e565b60405180910390f35b61026860048036038101906102639190612d89565b6107c6565b6040516102759190613443565b60405180910390f35b61029860048036038101906102939190612efe565b61083f565b6040516102a591906133dc565b60405180910390f35b6102c860048036038101906102c39190612d49565b6108c4565b005b6102e460048036038101906102df9190612f58565b6109dc565b005b6102ee610a66565b6040516102fb9190613760565b60405180910390f35b61030c610a70565b6040516103199190613443565b60405180910390f35b61033c60048036038101906103379190612c33565b610a83565b005b610346610ae3565b6040516103539190613443565b60405180910390f35b61037660048036038101906103719190612d89565b610af6565b005b610380610e69565b60405161038d9190613760565b60405180910390f35b61039e610e6f565b6040516103ab9190613760565b60405180910390f35b6103ce60048036038101906103c99190612b99565b610e75565b005b6103ea60048036038101906103e59190612c33565b610fd2565b005b61040660048036038101906104019190612efe565b610ff2565b005b610422600480360381019061041d9190612eb5565b611078565b005b61042c61110e565b60405161043991906133dc565b60405180910390f35b61045c60048036038101906104579190612efe565b611134565b60405161046991906133dc565b60405180910390f35b61048c60048036038101906104879190612e2e565b6111e6565b005b6104a860048036038101906104a39190612dd2565b61127f565b6040516104b59190613443565b60405180910390f35b6104c66113b6565b6040516104d3919061345e565b60405180910390f35b6104f660048036038101906104f19190612b99565b611444565b6040516105039190613760565b60405180910390f35b6105146114fc565b005b61051e611639565b60405161052b91906133dc565b60405180910390f35b61054e60048036038101906105499190612e2e565b611663565b005b6105586116fc565b604051610565919061345e565b60405180910390f35b61058860048036038101906105839190612d09565b61178e565b005b6105a4600480360381019061059f9190612c86565b61190f565b005b6105c060048036038101906105bb9190612efe565b611971565b6040516105cd919061345e565b60405180910390f35b6105f060048036038101906105eb9190612efe565b611ac3565b6040516105fd9190613443565b60405180910390f35b610620600480360381019061061b9190612bf3565b611aed565b60405161062d9190613443565b60405180910390f35b610650600480360381019061064b9190612b99565b611b81565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061072d575061072c82611d2d565b5b9050919050565b60606000805461074390613a46565b80601f016020809104026020016040519081016040528092919081815260200182805461076f90613a46565b80156107bc5780601f10610791576101008083540402835291602001916107bc565b820191906000526020600020905b81548152906001019060200180831161079f57829003601f168201915b5050505050905090565b600080600090505b825181101561083457600d60008483815181106107ee576107ed613bb0565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161561082157600091505061083a565b808061082c90613aa9565b9150506107ce565b50600190505b919050565b600061084a82611d97565b610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090613620565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cf82611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610937906136c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095f611e03565b73ffffffffffffffffffffffffffffffffffffffff16148061098e575061098d81610988611e03565b611aed565b5b6109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490613540565b60405180910390fd5b6109d78383611e0b565b505050565b6109e4611e03565b73ffffffffffffffffffffffffffffffffffffffff16610a02611639565b73ffffffffffffffffffffffffffffffffffffffff1614610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f90613640565b60405180910390fd5b610a628282611ec4565b5050565b6000600854905090565b600b60009054906101000a900460ff1681565b610a94610a8e611e03565b82611f38565b610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906136e0565b60405180910390fd5b610ade838383612016565b505050565b600f60009054906101000a900460ff1681565b600f60009054906101000a900460ff16610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613740565b60405180910390fd5b610b4f813361127f565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906135c0565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610beb91906133dc565b60206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3b9190612f2b565b11610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906136a0565b60405180910390fd5b6009546001600854610c8d91906138c3565b1115610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613720565b60405180910390fd5b610cd7816107c6565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613700565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe88363bb89e692935bee34c73cef0533f691afda481dbf1eb44fce483c77305f6001600854610d5d91906138c3565b8351604051610d6d9291906137a4565b60405180910390a260005b8151811015610e655760001515600d6000848481518110610d9c57610d9b613bb0565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615151415610e52576001600d6000848481518110610de157610de0613bb0565b5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060086000815480929190610e2190613aa9565b9190505550610e51610e31611e03565b838381518110610e4457610e43613bb0565b5b6020026020010151612272565b5b8080610e5d90613aa9565b915050610d78565b5050565b60085481565b60095481565b610e7d611e03565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611639565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890613640565b60405180910390fd5b6009546001600854610f0391906138c3565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90613720565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fe88363bb89e692935bee34c73cef0533f691afda481dbf1eb44fce483c77305f6001600854610f8b91906138c3565b6001604051610f9b92919061377b565b60405180910390a2610fcf8160086000815480929190610fba90613aa9565b919050556001610fca91906138c3565b612272565b50565b610fed8383836040518060200160405280600081525061190f565b505050565b610ffa611e03565b73ffffffffffffffffffffffffffffffffffffffff16611018611639565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613640565b60405180910390fd5b8060088190555050565b611080611e03565b73ffffffffffffffffffffffffffffffffffffffff1661109e611639565b73ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90613640565b60405180910390fd5b80600a908051906020019061110a9291906128e5565b5050565b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613580565b60405180910390fd5b80915050919050565b6111ee611e03565b73ffffffffffffffffffffffffffffffffffffffff1661120c611639565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613640565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080600090505b83518110156113aa578273ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8684815181106112f8576112f7613bb0565b5b60200260200101516040518263ffffffff1660e01b815260040161131c9190613760565b60206040518083038186803b15801561133457600080fd5b505afa158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190612bc6565b73ffffffffffffffffffffffffffffffffffffffff16141561138d57611397565b60009150506113b0565b80806113a290613aa9565b915050611287565b50600190505b92915050565b600a80546113c390613a46565b80601f01602080910402602001604051908101604052809291908181526020018280546113ef90613a46565b801561143c5780601f106114115761010080835404028352916020019161143c565b820191906000526020600020905b81548152906001019060200180831161141f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613560565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611504611e03565b73ffffffffffffffffffffffffffffffffffffffff16611522611639565b73ffffffffffffffffffffffffffffffffffffffff1614611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90613640565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61166b611e03565b73ffffffffffffffffffffffffffffffffffffffff16611689611639565b73ffffffffffffffffffffffffffffffffffffffff16146116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d690613640565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60606001805461170b90613a46565b80601f016020809104026020016040519081016040528092919081815260200182805461173790613a46565b80156117845780601f1061175957610100808354040283529160200191611784565b820191906000526020600020905b81548152906001019060200180831161176757829003601f168201915b5050505050905090565b611796611e03565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb90613500565b60405180910390fd5b8060056000611811611e03565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118be611e03565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119039190613443565b60405180910390a35050565b61192061191a611e03565b83611f38565b61195f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611956906136e0565b60405180910390fd5b61196b84848484612440565b50505050565b606061197c82611d97565b6119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613600565b60405180910390fd5b60006006600084815260200190815260200160002080546119db90613a46565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0790613a46565b8015611a545780601f10611a2957610100808354040283529160200191611a54565b820191906000526020600020905b815481529060010190602001808311611a3757829003601f168201915b505050505090506000611a6561249c565b9050600081511415611a7b578192505050611abe565b600082511115611ab0578082604051602001611a989291906133b8565b60405160208183030381529060405292505050611abe565b611ab98461252e565b925050505b919050565b6000600d600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b89611e03565b73ffffffffffffffffffffffffffffffffffffffff16611ba7611639565b73ffffffffffffffffffffffffffffffffffffffff1614611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490613640565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906134a0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7e83611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ecd82611d97565b611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906135a0565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611f339291906128e5565b505050565b6000611f4382611d97565b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613520565b60405180910390fd5b6000611f8d83611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc57508373ffffffffffffffffffffffffffffffffffffffff16611fe48461083f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200d575061200c8185611aed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203682611134565b73ffffffffffffffffffffffffffffffffffffffff161461208c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208390613660565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f3906134e0565b60405180910390fd5b6121078383836125d5565b612112600082611e0b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612162919061394a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b991906138c3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d9906135e0565b60405180910390fd5b6122eb81611d97565b1561232b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612322906134c0565b60405180910390fd5b612337600083836125d5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238791906138c3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61244b848484612016565b612457848484846125da565b612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d90613480565b60405180910390fd5b50505050565b6060600a80546124ab90613a46565b80601f01602080910402602001604051908101604052809291908181526020018280546124d790613a46565b80156125245780601f106124f957610100808354040283529160200191612524565b820191906000526020600020905b81548152906001019060200180831161250757829003601f168201915b5050505050905090565b606061253982611d97565b612578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256f90613680565b60405180910390fd5b600061258261249c565b905060008151116125a257604051806020016040528060008152506125cd565b806125ac84612771565b6040516020016125bd9291906133b8565b6040516020818303038152906040525b915050919050565b505050565b60006125fb8473ffffffffffffffffffffffffffffffffffffffff166128d2565b15612764578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612624611e03565b8786866040518563ffffffff1660e01b815260040161264694939291906133f7565b602060405180830381600087803b15801561266057600080fd5b505af192505050801561269157506040513d601f19601f8201168201806040525081019061268e9190612e88565b60015b612714573d80600081146126c1576040519150601f19603f3d011682016040523d82523d6000602084013e6126c6565b606091505b5060008151141561270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390613480565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612769565b600190505b949350505050565b606060008214156127b9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128cd565b600082905060005b600082146127eb5780806127d490613aa9565b915050600a826127e49190613919565b91506127c1565b60008167ffffffffffffffff81111561280757612806613bdf565b5b6040519080825280601f01601f1916602001820160405280156128395781602001600182028036833780820191505090505b5090505b600085146128c657600182612852919061394a565b9150600a856128619190613af2565b603061286d91906138c3565b60f81b81838151811061288357612882613bb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128bf9190613919565b945061283d565b8093505050505b919050565b600080823b905060008111915050919050565b8280546128f190613a46565b90600052602060002090601f016020900481019282612913576000855561295a565b82601f1061292c57805160ff191683800117855561295a565b8280016001018555821561295a579182015b8281111561295957825182559160200191906001019061293e565b5b509050612967919061296b565b5090565b5b8082111561298457600081600090555060010161296c565b5090565b600061299b612996846137f2565b6137cd565b905080838252602082019050828560208602820111156129be576129bd613c13565b5b60005b858110156129ee57816129d48882612b6f565b8452602084019350602083019250506001810190506129c1565b5050509392505050565b6000612a0b612a068461381e565b6137cd565b905082815260208101848484011115612a2757612a26613c18565b5b612a32848285613a04565b509392505050565b6000612a4d612a488461384f565b6137cd565b905082815260208101848484011115612a6957612a68613c18565b5b612a74848285613a04565b509392505050565b600081359050612a8b81614247565b92915050565b600081519050612aa081614247565b92915050565b600082601f830112612abb57612aba613c0e565b5b8135612acb848260208601612988565b91505092915050565b600081359050612ae38161425e565b92915050565b600081359050612af881614275565b92915050565b600081519050612b0d81614275565b92915050565b600082601f830112612b2857612b27613c0e565b5b8135612b388482602086016129f8565b91505092915050565b600082601f830112612b5657612b55613c0e565b5b8135612b66848260208601612a3a565b91505092915050565b600081359050612b7e8161428c565b92915050565b600081519050612b938161428c565b92915050565b600060208284031215612baf57612bae613c22565b5b6000612bbd84828501612a7c565b91505092915050565b600060208284031215612bdc57612bdb613c22565b5b6000612bea84828501612a91565b91505092915050565b60008060408385031215612c0a57612c09613c22565b5b6000612c1885828601612a7c565b9250506020612c2985828601612a7c565b9150509250929050565b600080600060608486031215612c4c57612c4b613c22565b5b6000612c5a86828701612a7c565b9350506020612c6b86828701612a7c565b9250506040612c7c86828701612b6f565b9150509250925092565b60008060008060808587031215612ca057612c9f613c22565b5b6000612cae87828801612a7c565b9450506020612cbf87828801612a7c565b9350506040612cd087828801612b6f565b925050606085013567ffffffffffffffff811115612cf157612cf0613c1d565b5b612cfd87828801612b13565b91505092959194509250565b60008060408385031215612d2057612d1f613c22565b5b6000612d2e85828601612a7c565b9250506020612d3f85828601612ad4565b9150509250929050565b60008060408385031215612d6057612d5f613c22565b5b6000612d6e85828601612a7c565b9250506020612d7f85828601612b6f565b9150509250929050565b600060208284031215612d9f57612d9e613c22565b5b600082013567ffffffffffffffff811115612dbd57612dbc613c1d565b5b612dc984828501612aa6565b91505092915050565b60008060408385031215612de957612de8613c22565b5b600083013567ffffffffffffffff811115612e0757612e06613c1d565b5b612e1385828601612aa6565b9250506020612e2485828601612a7c565b9150509250929050565b600060208284031215612e4457612e43613c22565b5b6000612e5284828501612ad4565b91505092915050565b600060208284031215612e7157612e70613c22565b5b6000612e7f84828501612ae9565b91505092915050565b600060208284031215612e9e57612e9d613c22565b5b6000612eac84828501612afe565b91505092915050565b600060208284031215612ecb57612eca613c22565b5b600082013567ffffffffffffffff811115612ee957612ee8613c1d565b5b612ef584828501612b41565b91505092915050565b600060208284031215612f1457612f13613c22565b5b6000612f2284828501612b6f565b91505092915050565b600060208284031215612f4157612f40613c22565b5b6000612f4f84828501612b84565b91505092915050565b60008060408385031215612f6f57612f6e613c22565b5b6000612f7d85828601612b6f565b925050602083013567ffffffffffffffff811115612f9e57612f9d613c1d565b5b612faa85828601612b41565b9150509250929050565b612fbd8161397e565b82525050565b612fcc81613990565b82525050565b6000612fdd82613880565b612fe78185613896565b9350612ff7818560208601613a13565b61300081613c27565b840191505092915050565b613014816139f2565b82525050565b60006130258261388b565b61302f81856138a7565b935061303f818560208601613a13565b61304881613c27565b840191505092915050565b600061305e8261388b565b61306881856138b8565b9350613078818560208601613a13565b80840191505092915050565b60006130916032836138a7565b915061309c82613c38565b604082019050919050565b60006130b46026836138a7565b91506130bf82613c87565b604082019050919050565b60006130d7601c836138a7565b91506130e282613cd6565b602082019050919050565b60006130fa6024836138a7565b915061310582613cff565b604082019050919050565b600061311d6019836138a7565b915061312882613d4e565b602082019050919050565b6000613140602c836138a7565b915061314b82613d77565b604082019050919050565b60006131636038836138a7565b915061316e82613dc6565b604082019050919050565b6000613186602a836138a7565b915061319182613e15565b604082019050919050565b60006131a96029836138a7565b91506131b482613e64565b604082019050919050565b60006131cc602e836138a7565b91506131d782613eb3565b604082019050919050565b60006131ef601d836138a7565b91506131fa82613f02565b602082019050919050565b60006132126020836138a7565b915061321d82613f2b565b602082019050919050565b60006132356031836138a7565b915061324082613f54565b604082019050919050565b6000613258602c836138a7565b915061326382613fa3565b604082019050919050565b600061327b6020836138a7565b915061328682613ff2565b602082019050919050565b600061329e6029836138a7565b91506132a98261401b565b604082019050919050565b60006132c1602f836138a7565b91506132cc8261406a565b604082019050919050565b60006132e46016836138a7565b91506132ef826140b9565b602082019050919050565b60006133076021836138a7565b9150613312826140e2565b604082019050919050565b600061332a6031836138a7565b915061333582614131565b604082019050919050565b600061334d6024836138a7565b915061335882614180565b604082019050919050565b60006133706030836138a7565b915061337b826141cf565b604082019050919050565b6000613393600b836138a7565b915061339e8261421e565b602082019050919050565b6133b2816139e8565b82525050565b60006133c48285613053565b91506133d08284613053565b91508190509392505050565b60006020820190506133f16000830184612fb4565b92915050565b600060808201905061340c6000830187612fb4565b6134196020830186612fb4565b61342660408301856133a9565b81810360608301526134388184612fd2565b905095945050505050565b60006020820190506134586000830184612fc3565b92915050565b60006020820190508181036000830152613478818461301a565b905092915050565b6000602082019050818103600083015261349981613084565b9050919050565b600060208201905081810360008301526134b9816130a7565b9050919050565b600060208201905081810360008301526134d9816130ca565b9050919050565b600060208201905081810360008301526134f9816130ed565b9050919050565b6000602082019050818103600083015261351981613110565b9050919050565b6000602082019050818103600083015261353981613133565b9050919050565b6000602082019050818103600083015261355981613156565b9050919050565b6000602082019050818103600083015261357981613179565b9050919050565b600060208201905081810360008301526135998161319c565b9050919050565b600060208201905081810360008301526135b9816131bf565b9050919050565b600060208201905081810360008301526135d9816131e2565b9050919050565b600060208201905081810360008301526135f981613205565b9050919050565b6000602082019050818103600083015261361981613228565b9050919050565b600060208201905081810360008301526136398161324b565b9050919050565b600060208201905081810360008301526136598161326e565b9050919050565b6000602082019050818103600083015261367981613291565b9050919050565b60006020820190508181036000830152613699816132b4565b9050919050565b600060208201905081810360008301526136b9816132d7565b9050919050565b600060208201905081810360008301526136d9816132fa565b9050919050565b600060208201905081810360008301526136f98161331d565b9050919050565b6000602082019050818103600083015261371981613340565b9050919050565b6000602082019050818103600083015261373981613363565b9050919050565b6000602082019050818103600083015261375981613386565b9050919050565b600060208201905061377560008301846133a9565b92915050565b600060408201905061379060008301856133a9565b61379d602083018461300b565b9392505050565b60006040820190506137b960008301856133a9565b6137c660208301846133a9565b9392505050565b60006137d76137e8565b90506137e38282613a78565b919050565b6000604051905090565b600067ffffffffffffffff82111561380d5761380c613bdf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561383957613838613bdf565b5b61384282613c27565b9050602081019050919050565b600067ffffffffffffffff82111561386a57613869613bdf565b5b61387382613c27565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ce826139e8565b91506138d9836139e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390e5761390d613b23565b5b828201905092915050565b6000613924826139e8565b915061392f836139e8565b92508261393f5761393e613b52565b5b828204905092915050565b6000613955826139e8565b9150613960836139e8565b92508282101561397357613972613b23565b5b828203905092915050565b6000613989826139c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006139fd826139e8565b9050919050565b82818337600083830152505050565b60005b83811015613a31578082015181840152602081019050613a16565b83811115613a40576000848401525b50505050565b60006002820490506001821680613a5e57607f821691505b60208210811415613a7257613a71613b81565b5b50919050565b613a8182613c27565b810181811067ffffffffffffffff82111715613aa057613a9f613bdf565b5b80604052505050565b6000613ab4826139e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ae757613ae6613b23565b5b600182019050919050565b6000613afd826139e8565b9150613b08836139e8565b925082613b1857613b17613b52565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e20616c6c2074686573652061706573000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d757374206f776e20612047656e657369732061706500000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f54686573652061706573206861766520616c7265616479206265656e20636c6160008201527f696d656400000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b6142508161397e565b811461425b57600080fd5b50565b61426781613990565b811461427257600080fd5b50565b61427e8161399c565b811461428957600080fd5b50565b614295816139e8565b81146142a057600080fd5b5056fea26469706673582212203fd91cb29f92906b7fd2327da58621d1a78534ae18f737d86b3084a6b460870964736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c506f74696f6e2050756e6b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004504b4559000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Potion Punks
Arg [1] : symbol_ (string): PKEY
Arg [2] : baseURI_ (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 506f74696f6e2050756e6b730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 504b455900000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37058:3861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20636:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21571:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40174:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23039:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22573:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38459:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38111:112;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37346:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23934:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37500:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38933:841;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37214:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37278:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40622:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24312:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38812:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38348:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37603:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21264:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38702:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39792:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37318:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20993:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36148:148;;;:::i;:::-;;35495:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38601:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21741:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23334:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24535:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32905:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40495:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23702:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36452:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20636:292;20738:4;20777:25;20762:40;;;:11;:40;;;;:105;;;;20834:33;20819:48;;;:11;:48;;;;20762:105;:158;;;;20884:36;20908:11;20884:23;:36::i;:::-;20762:158;20755:165;;20636:292;;;:::o;21571:100::-;21625:13;21658:5;21651:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21571:100;:::o;40174:301::-;40247:12;40285:9;40297:1;40285:13;;40281:155;40304:7;:14;40300:1;:18;40281:155;;;40342:11;:23;40354:7;40362:1;40354:10;;;;;;;;:::i;:::-;;;;;;;;40342:23;;;;;;;;;;;;;;;;;;;;;40339:74;;;40392:5;40385:12;;;;;40339:74;40320:3;;;;;:::i;:::-;;;;40281:155;;;;40453:4;40446:11;;40174:301;;;;:::o;23039:222::-;23115:7;23143:16;23151:7;23143;:16::i;:::-;23135:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23229:15;:24;23245:7;23229:24;;;;;;;;;;;;;;;;;;;;;23222:31;;23039:222;;;:::o;22573:399::-;22654:13;22670:23;22685:7;22670:14;:23::i;:::-;22654:39;;22718:5;22712:11;;:2;:11;;;;22704:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22799:5;22783:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22808:37;22825:5;22832:12;:10;:12::i;:::-;22808:16;:37::i;:::-;22783:62;22775:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22943:21;22952:2;22956:7;22943:8;:21::i;:::-;22643:329;22573:399;;:::o;38459:133::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38551:33:::1;38564:8;38574:9;38551:12;:33::i;:::-;38459:133:::0;;:::o;38111:112::-;38163:7;38190:16;;38183:23;;38111:112;:::o;37346:19::-;;;;;;;;;;;;;:::o;23934:306::-;24095:41;24114:12;:10;:12::i;:::-;24128:7;24095:18;:41::i;:::-;24087:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24204:28;24214:4;24220:2;24224:7;24204:9;:28::i;:::-;23934:306;;;:::o;37500:26::-;;;;;;;;;;;;;:::o;38933:841::-;38052:14;;;;;;;;;;;38044:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;39039:34:::1;39054:7;39062:10;39039:14;:34::i;:::-;39031:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39162:1;39126:11;;;;;;;;;;;:21;;;39148:10;39126:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;39118:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;39233:10;;39228:1;39209:16;;:20;;;;:::i;:::-;:34;;39201:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39315:26;39333:7;39315:17;:26::i;:::-;39307:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39423:10;39408:62;;;39452:1;39435:16;;:18;;;;:::i;:::-;39455:7;:14;39408:62;;;;;;;:::i;:::-;;;;;;;;39486:9;39481:276;39505:7;:14;39501:1;:18;39481:276;;;39585:5;39558:32;;:11;:23;39570:7;39578:1;39570:10;;;;;;;;:::i;:::-;;;;;;;;39558:23;;;;;;;;;;;;;;;;;;;;;:32;;;39555:189;;;39637:4;39611:11;:23;39623:7;39631:1;39623:10;;;;;;;;:::i;:::-;;;;;;;;39611:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;39660:16;;:18;;;;;;;;;:::i;:::-;;;;;;39697:31;39703:12;:10;:12::i;:::-;39717:7;39725:1;39717:10;;;;;;;;:::i;:::-;;;;;;;;39697:5;:31::i;:::-;39555:189;39521:3;;;;;:::i;:::-;;;;39481:276;;;;38933:841:::0;:::o;37214:31::-;;;;:::o;37278:32::-;;;;:::o;40622:281::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40725:10:::1;;40720:1;40701:16;;:20;;;;:::i;:::-;:34;;40693:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40819:5;40804:44;;;40843:1;40826:16;;:18;;;;:::i;:::-;40846:1;40804:44;;;;;;;:::i;:::-;;;;;;;;40859:36;40865:5;40876:16;;:18;;;;;;;;;:::i;:::-;;;;;40872:1;:22;;;;:::i;:::-;40859:5;:36::i;:::-;40622:281:::0;:::o;24312:151::-;24416:39;24433:4;24439:2;24443:7;24416:39;;;;;;;;;;;;:16;:39::i;:::-;24312:151;;;:::o;38812:103::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38901:6:::1;38882:16;:25;;;;38812:103:::0;:::o;38348:96::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38429:7:::1;38419;:17;;;;;;;;;;;;:::i;:::-;;38348:96:::0;:::o;37603:70::-;;;;;;;;;;;;;:::o;21264:239::-;21336:7;21356:13;21372:7;:16;21380:7;21372:16;;;;;;;;;;;;;;;;;;;;;21356:32;;21424:1;21407:19;;:5;:19;;;;21399:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21490:5;21483:12;;;21264:239;;;:::o;38702:98::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38786:6:::1;38769:14;;:23;;;;;;;;;;;;;;;;;;38702:98:::0;:::o;39792:372::-;39878:12;39916:9;39928:1;39916:13;;39912:213;39935:7;:14;39931:1;:18;39912:213;;;40008:6;39973:41;;:11;;;;;;;;;;;:19;;;39993:7;40001:1;39993:10;;;;;;;;:::i;:::-;;;;;;;;39973:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;39970:89;;;40035:8;;39970:89;40094:5;40087:12;;;;;39912:213;39951:3;;;;;:::i;:::-;;;;39912:213;;;;40142:4;40135:11;;39792:372;;;;;:::o;37318:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20993:208::-;21065:7;21110:1;21093:19;;:5;:19;;;;21085:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21177:9;:16;21187:5;21177:16;;;;;;;;;;;;;;;;21170:23;;20993:208;;;:::o;36148:148::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36255:1:::1;36218:40;;36239:6;;;;;;;;;;;36218:40;;;;;;;;;;;;36286:1;36269:6;;:19;;;;;;;;;;;;;;;;;;36148:148::o:0;35495:87::-;35541:7;35568:6;;;;;;;;;;;35561:13;;35495:87;:::o;38601:89::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38676:6:::1;38666:7;;:16;;;;;;;;;;;;;;;;;;38601:89:::0;:::o;21741:104::-;21797:13;21830:7;21823:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21741:104;:::o;23334:296::-;23449:12;:10;:12::i;:::-;23437:24;;:8;:24;;;;23429:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23550:8;23505:18;:32;23524:12;:10;:12::i;:::-;23505:32;;;;;;;;;;;;;;;:42;23538:8;23505:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23603:8;23574:48;;23589:12;:10;:12::i;:::-;23574:48;;;23613:8;23574:48;;;;;;:::i;:::-;;;;;;;;23334:296;;:::o;24535:285::-;24667:41;24686:12;:10;:12::i;:::-;24700:7;24667:18;:41::i;:::-;24659:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24773:39;24787:4;24793:2;24797:7;24806:5;24773:13;:39::i;:::-;24535:285;;;;:::o;32905:682::-;32978:13;33012:16;33020:7;33012;:16::i;:::-;33004:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33096:23;33122:10;:19;33133:7;33122:19;;;;;;;;;;;33096:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33152:18;33173:10;:8;:10::i;:::-;33152:31;;33282:1;33266:4;33260:18;:23;33256:72;;;33307:9;33300:16;;;;;;33256:72;33458:1;33438:9;33432:23;:27;33428:108;;;33507:4;33513:9;33490:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33476:48;;;;;;33428:108;33556:23;33571:7;33556:14;:23::i;:::-;33549:30;;;;32905:682;;;;:::o;40495:107::-;40547:12;40578:11;:16;40590:3;40578:16;;;;;;;;;;;;;;;;;;;;;40571:23;;40495:107;;;:::o;23702:164::-;23799:4;23823:18;:25;23842:5;23823:25;;;;;;;;;;;;;;;:35;23849:8;23823:35;;;;;;;;;;;;;;;;;;;;;;;;;23816:42;;23702:164;;;;:::o;36452:244::-;35727:12;:10;:12::i;:::-;35716:23;;:7;:5;:7::i;:::-;:23;;;35708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36561:1:::1;36541:22;;:8;:22;;;;36533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36651:8;36622:38;;36643:6;;;;;;;;;;;36622:38;;;;;;;;;;;;36680:8;36671:6;;:17;;;;;;;;;;;;;;;;;;36452:244:::0;:::o;19129:157::-;19214:4;19253:25;19238:40;;;:11;:40;;;;19231:47;;19129:157;;;:::o;26289:127::-;26354:4;26406:1;26378:30;;:7;:16;26386:7;26378:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26371:37;;26289:127;;;:::o;15929:98::-;15982:7;16009:10;16002:17;;15929:98;:::o;30184:174::-;30286:2;30259:15;:24;30275:7;30259:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30342:7;30338:2;30304:46;;30313:23;30328:7;30313:14;:23::i;:::-;30304:46;;;;;;;;;;;;30184:174;;:::o;33744:217::-;33844:16;33852:7;33844;:16::i;:::-;33836:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;33944:9;33922:10;:19;33933:7;33922:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;33744:217;;:::o;26584:348::-;26677:4;26702:16;26710:7;26702;:16::i;:::-;26694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26778:13;26794:23;26809:7;26794:14;:23::i;:::-;26778:39;;26847:5;26836:16;;:7;:16;;;:51;;;;26880:7;26856:31;;:20;26868:7;26856:11;:20::i;:::-;:31;;;26836:51;:87;;;;26891:32;26908:5;26915:7;26891:16;:32::i;:::-;26836:87;26828:96;;;26584:348;;;;:::o;29517:548::-;29642:4;29615:31;;:23;29630:7;29615:14;:23::i;:::-;:31;;;29607:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29725:1;29711:16;;:2;:16;;;;29703:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29782:39;29803:4;29809:2;29813:7;29782:20;:39::i;:::-;29887:29;29904:1;29908:7;29887:8;:29::i;:::-;29949:1;29930:9;:15;29940:4;29930:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29978:1;29961:9;:13;29971:2;29961:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30009:2;29990:7;:16;29998:7;29990:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30049:7;30045:2;30030:27;;30039:4;30030:27;;;;;;;;;;;;29517:548;;;:::o;28200:385::-;28294:1;28280:16;;:2;:16;;;;28272:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28353:16;28361:7;28353;:16::i;:::-;28352:17;28344:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28416:45;28445:1;28449:2;28453:7;28416:20;:45::i;:::-;28492:1;28475:9;:13;28485:2;28475:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28523:2;28504:7;:16;28512:7;28504:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28569:7;28565:2;28544:33;;28561:1;28544:33;;;;;;;;;;;;28200:385;;:::o;25703:272::-;25817:28;25827:4;25833:2;25837:7;25817:9;:28::i;:::-;25864:48;25887:4;25893:2;25897:7;25906:5;25864:22;:48::i;:::-;25856:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25703:272;;;;:::o;38232:107::-;38292:13;38324:7;38317:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38232:107;:::o;21917:361::-;21990:13;22024:16;22032:7;22024;:16::i;:::-;22016:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22106:21;22130:10;:8;:10::i;:::-;22106:34;;22182:1;22164:7;22158:21;:25;:112;;;;;;;;;;;;;;;;;22223:7;22232:18;:7;:16;:18::i;:::-;22206:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22158:112;22151:119;;;21917:361;;;:::o;32381:93::-;;;;:::o;30924:843::-;31045:4;31071:15;:2;:13;;;:15::i;:::-;31067:693;;;31123:2;31107:36;;;31144:12;:10;:12::i;:::-;31158:4;31164:7;31173:5;31107:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31103:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31370:1;31353:6;:13;:18;31349:341;;;31396:60;;;;;;;;;;:::i;:::-;;;;;;;;31349:341;31640:6;31634:13;31625:6;31621:2;31617:15;31610:38;31103:602;31240:45;;;31230:55;;;:6;:55;;;;31223:62;;;;;31067:693;31744:4;31737:11;;30924:843;;;;;;;:::o;16579:724::-;16635:13;16866:1;16857:5;:10;16853:53;;;16884:10;;;;;;;;;;;;;;;;;;;;;16853:53;16916:12;16931:5;16916:20;;16947:14;16972:78;16987:1;16979:4;:9;16972:78;;17005:8;;;;;:::i;:::-;;;;17036:2;17028:10;;;;;:::i;:::-;;;16972:78;;;17060:19;17092:6;17082:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17060:39;;17110:154;17126:1;17117:5;:10;17110:154;;17154:1;17144:11;;;;;:::i;:::-;;;17221:2;17213:5;:10;;;;:::i;:::-;17200:2;:24;;;;:::i;:::-;17187:39;;17170:6;17177;17170:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17250:2;17241:11;;;;;:::i;:::-;;;17110:154;;;17288:6;17274:21;;;;;16579:724;;;;:::o;8037:423::-;8097:4;8306:12;8417:7;8405:20;8397:28;;8451:1;8444:4;:8;8437:15;;;8037:423;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:143::-;1788:5;1819:6;1813:13;1804:22;;1835:33;1862:5;1835:33;:::i;:::-;1731:143;;;;:::o;1897:370::-;1968:5;2017:3;2010:4;2002:6;1998:17;1994:27;1984:122;;2025:79;;:::i;:::-;1984:122;2142:6;2129:20;2167:94;2257:3;2249:6;2242:4;2234:6;2230:17;2167:94;:::i;:::-;2158:103;;1974:293;1897:370;;;;:::o;2273:133::-;2316:5;2354:6;2341:20;2332:29;;2370:30;2394:5;2370:30;:::i;:::-;2273:133;;;;:::o;2412:137::-;2457:5;2495:6;2482:20;2473:29;;2511:32;2537:5;2511:32;:::i;:::-;2412:137;;;;:::o;2555:141::-;2611:5;2642:6;2636:13;2627:22;;2658:32;2684:5;2658:32;:::i;:::-;2555:141;;;;:::o;2715:338::-;2770:5;2819:3;2812:4;2804:6;2800:17;2796:27;2786:122;;2827:79;;:::i;:::-;2786:122;2944:6;2931:20;2969:78;3043:3;3035:6;3028:4;3020:6;3016:17;2969:78;:::i;:::-;2960:87;;2776:277;2715:338;;;;:::o;3073:340::-;3129:5;3178:3;3171:4;3163:6;3159:17;3155:27;3145:122;;3186:79;;:::i;:::-;3145:122;3303:6;3290:20;3328:79;3403:3;3395:6;3388:4;3380:6;3376:17;3328:79;:::i;:::-;3319:88;;3135:278;3073:340;;;;:::o;3419:139::-;3465:5;3503:6;3490:20;3481:29;;3519:33;3546:5;3519:33;:::i;:::-;3419:139;;;;:::o;3564:143::-;3621:5;3652:6;3646:13;3637:22;;3668:33;3695:5;3668:33;:::i;:::-;3564:143;;;;:::o;3713:329::-;3772:6;3821:2;3809:9;3800:7;3796:23;3792:32;3789:119;;;3827:79;;:::i;:::-;3789:119;3947:1;3972:53;4017:7;4008:6;3997:9;3993:22;3972:53;:::i;:::-;3962:63;;3918:117;3713:329;;;;:::o;4048:351::-;4118:6;4167:2;4155:9;4146:7;4142:23;4138:32;4135:119;;;4173:79;;:::i;:::-;4135:119;4293:1;4318:64;4374:7;4365:6;4354:9;4350:22;4318:64;:::i;:::-;4308:74;;4264:128;4048:351;;;;:::o;4405:474::-;4473:6;4481;4530:2;4518:9;4509:7;4505:23;4501:32;4498:119;;;4536:79;;:::i;:::-;4498:119;4656:1;4681:53;4726:7;4717:6;4706:9;4702:22;4681:53;:::i;:::-;4671:63;;4627:117;4783:2;4809:53;4854:7;4845:6;4834:9;4830:22;4809:53;:::i;:::-;4799:63;;4754:118;4405:474;;;;;:::o;4885:619::-;4962:6;4970;4978;5027:2;5015:9;5006:7;5002:23;4998:32;4995:119;;;5033:79;;:::i;:::-;4995:119;5153:1;5178:53;5223:7;5214:6;5203:9;5199:22;5178:53;:::i;:::-;5168:63;;5124:117;5280:2;5306:53;5351:7;5342:6;5331:9;5327:22;5306:53;:::i;:::-;5296:63;;5251:118;5408:2;5434:53;5479:7;5470:6;5459:9;5455:22;5434:53;:::i;:::-;5424:63;;5379:118;4885:619;;;;;:::o;5510:943::-;5605:6;5613;5621;5629;5678:3;5666:9;5657:7;5653:23;5649:33;5646:120;;;5685:79;;:::i;:::-;5646:120;5805:1;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5776:117;5932:2;5958:53;6003:7;5994:6;5983:9;5979:22;5958:53;:::i;:::-;5948:63;;5903:118;6060:2;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6031:118;6216:2;6205:9;6201:18;6188:32;6247:18;6239:6;6236:30;6233:117;;;6269:79;;:::i;:::-;6233:117;6374:62;6428:7;6419:6;6408:9;6404:22;6374:62;:::i;:::-;6364:72;;6159:287;5510:943;;;;;;;:::o;6459:468::-;6524:6;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:119;;;6587:79;;:::i;:::-;6549:119;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:50;6902:7;6893:6;6882:9;6878:22;6860:50;:::i;:::-;6850:60;;6805:115;6459:468;;;;;:::o;6933:474::-;7001:6;7009;7058:2;7046:9;7037:7;7033:23;7029:32;7026:119;;;7064:79;;:::i;:::-;7026:119;7184:1;7209:53;7254:7;7245:6;7234:9;7230:22;7209:53;:::i;:::-;7199:63;;7155:117;7311:2;7337:53;7382:7;7373:6;7362:9;7358:22;7337:53;:::i;:::-;7327:63;;7282:118;6933:474;;;;;:::o;7413:539::-;7497:6;7546:2;7534:9;7525:7;7521:23;7517:32;7514:119;;;7552:79;;:::i;:::-;7514:119;7700:1;7689:9;7685:17;7672:31;7730:18;7722:6;7719:30;7716:117;;;7752:79;;:::i;:::-;7716:117;7857:78;7927:7;7918:6;7907:9;7903:22;7857:78;:::i;:::-;7847:88;;7643:302;7413:539;;;;:::o;7958:684::-;8051:6;8059;8108:2;8096:9;8087:7;8083:23;8079:32;8076:119;;;8114:79;;:::i;:::-;8076:119;8262:1;8251:9;8247:17;8234:31;8292:18;8284:6;8281:30;8278:117;;;8314:79;;:::i;:::-;8278:117;8419:78;8489:7;8480:6;8469:9;8465:22;8419:78;:::i;:::-;8409:88;;8205:302;8546:2;8572:53;8617:7;8608:6;8597:9;8593:22;8572:53;:::i;:::-;8562:63;;8517:118;7958:684;;;;;:::o;8648:323::-;8704:6;8753:2;8741:9;8732:7;8728:23;8724:32;8721:119;;;8759:79;;:::i;:::-;8721:119;8879:1;8904:50;8946:7;8937:6;8926:9;8922:22;8904:50;:::i;:::-;8894:60;;8850:114;8648:323;;;;:::o;8977:327::-;9035:6;9084:2;9072:9;9063:7;9059:23;9055:32;9052:119;;;9090:79;;:::i;:::-;9052:119;9210:1;9235:52;9279:7;9270:6;9259:9;9255:22;9235:52;:::i;:::-;9225:62;;9181:116;8977:327;;;;:::o;9310:349::-;9379:6;9428:2;9416:9;9407:7;9403:23;9399:32;9396:119;;;9434:79;;:::i;:::-;9396:119;9554:1;9579:63;9634:7;9625:6;9614:9;9610:22;9579:63;:::i;:::-;9569:73;;9525:127;9310:349;;;;:::o;9665:509::-;9734:6;9783:2;9771:9;9762:7;9758:23;9754:32;9751:119;;;9789:79;;:::i;:::-;9751:119;9937:1;9926:9;9922:17;9909:31;9967:18;9959:6;9956:30;9953:117;;;9989:79;;:::i;:::-;9953:117;10094:63;10149:7;10140:6;10129:9;10125:22;10094:63;:::i;:::-;10084:73;;9880:287;9665:509;;;;:::o;10180:329::-;10239:6;10288:2;10276:9;10267:7;10263:23;10259:32;10256:119;;;10294:79;;:::i;:::-;10256:119;10414:1;10439:53;10484:7;10475:6;10464:9;10460:22;10439:53;:::i;:::-;10429:63;;10385:117;10180:329;;;;:::o;10515:351::-;10585:6;10634:2;10622:9;10613:7;10609:23;10605:32;10602:119;;;10640:79;;:::i;:::-;10602:119;10760:1;10785:64;10841:7;10832:6;10821:9;10817:22;10785:64;:::i;:::-;10775:74;;10731:128;10515:351;;;;:::o;10872:654::-;10950:6;10958;11007:2;10995:9;10986:7;10982:23;10978:32;10975:119;;;11013:79;;:::i;:::-;10975:119;11133:1;11158:53;11203:7;11194:6;11183:9;11179:22;11158:53;:::i;:::-;11148:63;;11104:117;11288:2;11277:9;11273:18;11260:32;11319:18;11311:6;11308:30;11305:117;;;11341:79;;:::i;:::-;11305:117;11446:63;11501:7;11492:6;11481:9;11477:22;11446:63;:::i;:::-;11436:73;;11231:288;10872:654;;;;;:::o;11532:118::-;11619:24;11637:5;11619:24;:::i;:::-;11614:3;11607:37;11532:118;;:::o;11656:109::-;11737:21;11752:5;11737:21;:::i;:::-;11732:3;11725:34;11656:109;;:::o;11771:360::-;11857:3;11885:38;11917:5;11885:38;:::i;:::-;11939:70;12002:6;11997:3;11939:70;:::i;:::-;11932:77;;12018:52;12063:6;12058:3;12051:4;12044:5;12040:16;12018:52;:::i;:::-;12095:29;12117:6;12095:29;:::i;:::-;12090:3;12086:39;12079:46;;11861:270;11771:360;;;;:::o;12137:147::-;12232:45;12271:5;12232:45;:::i;:::-;12227:3;12220:58;12137:147;;:::o;12290:364::-;12378:3;12406:39;12439:5;12406:39;:::i;:::-;12461:71;12525:6;12520:3;12461:71;:::i;:::-;12454:78;;12541:52;12586:6;12581:3;12574:4;12567:5;12563:16;12541:52;:::i;:::-;12618:29;12640:6;12618:29;:::i;:::-;12613:3;12609:39;12602:46;;12382:272;12290:364;;;;:::o;12660:377::-;12766:3;12794:39;12827:5;12794:39;:::i;:::-;12849:89;12931:6;12926:3;12849:89;:::i;:::-;12842:96;;12947:52;12992:6;12987:3;12980:4;12973:5;12969:16;12947:52;:::i;:::-;13024:6;13019:3;13015:16;13008:23;;12770:267;12660:377;;;;:::o;13043:366::-;13185:3;13206:67;13270:2;13265:3;13206:67;:::i;:::-;13199:74;;13282:93;13371:3;13282:93;:::i;:::-;13400:2;13395:3;13391:12;13384:19;;13043:366;;;:::o;13415:::-;13557:3;13578:67;13642:2;13637:3;13578:67;:::i;:::-;13571:74;;13654:93;13743:3;13654:93;:::i;:::-;13772:2;13767:3;13763:12;13756:19;;13415:366;;;:::o;13787:::-;13929:3;13950:67;14014:2;14009:3;13950:67;:::i;:::-;13943:74;;14026:93;14115:3;14026:93;:::i;:::-;14144:2;14139:3;14135:12;14128:19;;13787:366;;;:::o;14159:::-;14301:3;14322:67;14386:2;14381:3;14322:67;:::i;:::-;14315:74;;14398:93;14487:3;14398:93;:::i;:::-;14516:2;14511:3;14507:12;14500:19;;14159:366;;;:::o;14531:::-;14673:3;14694:67;14758:2;14753:3;14694:67;:::i;:::-;14687:74;;14770:93;14859:3;14770:93;:::i;:::-;14888:2;14883:3;14879:12;14872:19;;14531:366;;;:::o;14903:::-;15045:3;15066:67;15130:2;15125:3;15066:67;:::i;:::-;15059:74;;15142:93;15231:3;15142:93;:::i;:::-;15260:2;15255:3;15251:12;15244:19;;14903:366;;;:::o;15275:::-;15417:3;15438:67;15502:2;15497:3;15438:67;:::i;:::-;15431:74;;15514:93;15603:3;15514:93;:::i;:::-;15632:2;15627:3;15623:12;15616:19;;15275:366;;;:::o;15647:::-;15789:3;15810:67;15874:2;15869:3;15810:67;:::i;:::-;15803:74;;15886:93;15975:3;15886:93;:::i;:::-;16004:2;15999:3;15995:12;15988:19;;15647:366;;;:::o;16019:::-;16161:3;16182:67;16246:2;16241:3;16182:67;:::i;:::-;16175:74;;16258:93;16347:3;16258:93;:::i;:::-;16376:2;16371:3;16367:12;16360:19;;16019:366;;;:::o;16391:::-;16533:3;16554:67;16618:2;16613:3;16554:67;:::i;:::-;16547:74;;16630:93;16719:3;16630:93;:::i;:::-;16748:2;16743:3;16739:12;16732:19;;16391:366;;;:::o;16763:::-;16905:3;16926:67;16990:2;16985:3;16926:67;:::i;:::-;16919:74;;17002:93;17091:3;17002:93;:::i;:::-;17120:2;17115:3;17111:12;17104:19;;16763:366;;;:::o;17135:::-;17277:3;17298:67;17362:2;17357:3;17298:67;:::i;:::-;17291:74;;17374:93;17463:3;17374:93;:::i;:::-;17492:2;17487:3;17483:12;17476:19;;17135:366;;;:::o;17507:::-;17649:3;17670:67;17734:2;17729:3;17670:67;:::i;:::-;17663:74;;17746:93;17835:3;17746:93;:::i;:::-;17864:2;17859:3;17855:12;17848:19;;17507:366;;;:::o;17879:::-;18021:3;18042:67;18106:2;18101:3;18042:67;:::i;:::-;18035:74;;18118:93;18207:3;18118:93;:::i;:::-;18236:2;18231:3;18227:12;18220:19;;17879:366;;;:::o;18251:::-;18393:3;18414:67;18478:2;18473:3;18414:67;:::i;:::-;18407:74;;18490:93;18579:3;18490:93;:::i;:::-;18608:2;18603:3;18599:12;18592:19;;18251:366;;;:::o;18623:::-;18765:3;18786:67;18850:2;18845:3;18786:67;:::i;:::-;18779:74;;18862:93;18951:3;18862:93;:::i;:::-;18980:2;18975:3;18971:12;18964:19;;18623:366;;;:::o;18995:::-;19137:3;19158:67;19222:2;19217:3;19158:67;:::i;:::-;19151:74;;19234:93;19323:3;19234:93;:::i;:::-;19352:2;19347:3;19343:12;19336:19;;18995:366;;;:::o;19367:::-;19509:3;19530:67;19594:2;19589:3;19530:67;:::i;:::-;19523:74;;19606:93;19695:3;19606:93;:::i;:::-;19724:2;19719:3;19715:12;19708:19;;19367:366;;;:::o;19739:::-;19881:3;19902:67;19966:2;19961:3;19902:67;:::i;:::-;19895:74;;19978:93;20067:3;19978:93;:::i;:::-;20096:2;20091:3;20087:12;20080:19;;19739:366;;;:::o;20111:::-;20253:3;20274:67;20338:2;20333:3;20274:67;:::i;:::-;20267:74;;20350:93;20439:3;20350:93;:::i;:::-;20468:2;20463:3;20459:12;20452:19;;20111:366;;;:::o;20483:::-;20625:3;20646:67;20710:2;20705:3;20646:67;:::i;:::-;20639:74;;20722:93;20811:3;20722:93;:::i;:::-;20840:2;20835:3;20831:12;20824:19;;20483:366;;;:::o;20855:::-;20997:3;21018:67;21082:2;21077:3;21018:67;:::i;:::-;21011:74;;21094:93;21183:3;21094:93;:::i;:::-;21212:2;21207:3;21203:12;21196:19;;20855:366;;;:::o;21227:::-;21369:3;21390:67;21454:2;21449:3;21390:67;:::i;:::-;21383:74;;21466:93;21555:3;21466:93;:::i;:::-;21584:2;21579:3;21575:12;21568:19;;21227:366;;;:::o;21599:118::-;21686:24;21704:5;21686:24;:::i;:::-;21681:3;21674:37;21599:118;;:::o;21723:435::-;21903:3;21925:95;22016:3;22007:6;21925:95;:::i;:::-;21918:102;;22037:95;22128:3;22119:6;22037:95;:::i;:::-;22030:102;;22149:3;22142:10;;21723:435;;;;;:::o;22164:222::-;22257:4;22295:2;22284:9;22280:18;22272:26;;22308:71;22376:1;22365:9;22361:17;22352:6;22308:71;:::i;:::-;22164:222;;;;:::o;22392:640::-;22587:4;22625:3;22614:9;22610:19;22602:27;;22639:71;22707:1;22696:9;22692:17;22683:6;22639:71;:::i;:::-;22720:72;22788:2;22777:9;22773:18;22764:6;22720:72;:::i;:::-;22802;22870:2;22859:9;22855:18;22846:6;22802:72;:::i;:::-;22921:9;22915:4;22911:20;22906:2;22895:9;22891:18;22884:48;22949:76;23020:4;23011:6;22949:76;:::i;:::-;22941:84;;22392:640;;;;;;;:::o;23038:210::-;23125:4;23163:2;23152:9;23148:18;23140:26;;23176:65;23238:1;23227:9;23223:17;23214:6;23176:65;:::i;:::-;23038:210;;;;:::o;23254:313::-;23367:4;23405:2;23394:9;23390:18;23382:26;;23454:9;23448:4;23444:20;23440:1;23429:9;23425:17;23418:47;23482:78;23555:4;23546:6;23482:78;:::i;:::-;23474:86;;23254:313;;;;:::o;23573:419::-;23739:4;23777:2;23766:9;23762:18;23754:26;;23826:9;23820:4;23816:20;23812:1;23801:9;23797:17;23790:47;23854:131;23980:4;23854:131;:::i;:::-;23846:139;;23573:419;;;:::o;23998:::-;24164:4;24202:2;24191:9;24187:18;24179:26;;24251:9;24245:4;24241:20;24237:1;24226:9;24222:17;24215:47;24279:131;24405:4;24279:131;:::i;:::-;24271:139;;23998:419;;;:::o;24423:::-;24589:4;24627:2;24616:9;24612:18;24604:26;;24676:9;24670:4;24666:20;24662:1;24651:9;24647:17;24640:47;24704:131;24830:4;24704:131;:::i;:::-;24696:139;;24423:419;;;:::o;24848:::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25101:9;25095:4;25091:20;25087:1;25076:9;25072:17;25065:47;25129:131;25255:4;25129:131;:::i;:::-;25121:139;;24848:419;;;:::o;25273:::-;25439:4;25477:2;25466:9;25462:18;25454:26;;25526:9;25520:4;25516:20;25512:1;25501:9;25497:17;25490:47;25554:131;25680:4;25554:131;:::i;:::-;25546:139;;25273:419;;;:::o;25698:::-;25864:4;25902:2;25891:9;25887:18;25879:26;;25951:9;25945:4;25941:20;25937:1;25926:9;25922:17;25915:47;25979:131;26105:4;25979:131;:::i;:::-;25971:139;;25698:419;;;:::o;26123:::-;26289:4;26327:2;26316:9;26312:18;26304:26;;26376:9;26370:4;26366:20;26362:1;26351:9;26347:17;26340:47;26404:131;26530:4;26404:131;:::i;:::-;26396:139;;26123:419;;;:::o;26548:::-;26714:4;26752:2;26741:9;26737:18;26729:26;;26801:9;26795:4;26791:20;26787:1;26776:9;26772:17;26765:47;26829:131;26955:4;26829:131;:::i;:::-;26821:139;;26548:419;;;:::o;26973:::-;27139:4;27177:2;27166:9;27162:18;27154:26;;27226:9;27220:4;27216:20;27212:1;27201:9;27197:17;27190:47;27254:131;27380:4;27254:131;:::i;:::-;27246:139;;26973:419;;;:::o;27398:::-;27564:4;27602:2;27591:9;27587:18;27579:26;;27651:9;27645:4;27641:20;27637:1;27626:9;27622:17;27615:47;27679:131;27805:4;27679:131;:::i;:::-;27671:139;;27398:419;;;:::o;27823:::-;27989:4;28027:2;28016:9;28012:18;28004:26;;28076:9;28070:4;28066:20;28062:1;28051:9;28047:17;28040:47;28104:131;28230:4;28104:131;:::i;:::-;28096:139;;27823:419;;;:::o;28248:::-;28414:4;28452:2;28441:9;28437:18;28429:26;;28501:9;28495:4;28491:20;28487:1;28476:9;28472:17;28465:47;28529:131;28655:4;28529:131;:::i;:::-;28521:139;;28248:419;;;:::o;28673:::-;28839:4;28877:2;28866:9;28862:18;28854:26;;28926:9;28920:4;28916:20;28912:1;28901:9;28897:17;28890:47;28954:131;29080:4;28954:131;:::i;:::-;28946:139;;28673:419;;;:::o;29098:::-;29264:4;29302:2;29291:9;29287:18;29279:26;;29351:9;29345:4;29341:20;29337:1;29326:9;29322:17;29315:47;29379:131;29505:4;29379:131;:::i;:::-;29371:139;;29098:419;;;:::o;29523:::-;29689:4;29727:2;29716:9;29712:18;29704:26;;29776:9;29770:4;29766:20;29762:1;29751:9;29747:17;29740:47;29804:131;29930:4;29804:131;:::i;:::-;29796:139;;29523:419;;;:::o;29948:::-;30114:4;30152:2;30141:9;30137:18;30129:26;;30201:9;30195:4;30191:20;30187:1;30176:9;30172:17;30165:47;30229:131;30355:4;30229:131;:::i;:::-;30221:139;;29948:419;;;:::o;30373:::-;30539:4;30577:2;30566:9;30562:18;30554:26;;30626:9;30620:4;30616:20;30612:1;30601:9;30597:17;30590:47;30654:131;30780:4;30654:131;:::i;:::-;30646:139;;30373:419;;;:::o;30798:::-;30964:4;31002:2;30991:9;30987:18;30979:26;;31051:9;31045:4;31041:20;31037:1;31026:9;31022:17;31015:47;31079:131;31205:4;31079:131;:::i;:::-;31071:139;;30798:419;;;:::o;31223:::-;31389:4;31427:2;31416:9;31412:18;31404:26;;31476:9;31470:4;31466:20;31462:1;31451:9;31447:17;31440:47;31504:131;31630:4;31504:131;:::i;:::-;31496:139;;31223:419;;;:::o;31648:::-;31814:4;31852:2;31841:9;31837:18;31829:26;;31901:9;31895:4;31891:20;31887:1;31876:9;31872:17;31865:47;31929:131;32055:4;31929:131;:::i;:::-;31921:139;;31648:419;;;:::o;32073:::-;32239:4;32277:2;32266:9;32262:18;32254:26;;32326:9;32320:4;32316:20;32312:1;32301:9;32297:17;32290:47;32354:131;32480:4;32354:131;:::i;:::-;32346:139;;32073:419;;;:::o;32498:::-;32664:4;32702:2;32691:9;32687:18;32679:26;;32751:9;32745:4;32741:20;32737:1;32726:9;32722:17;32715:47;32779:131;32905:4;32779:131;:::i;:::-;32771:139;;32498:419;;;:::o;32923:::-;33089:4;33127:2;33116:9;33112:18;33104:26;;33176:9;33170:4;33166:20;33162:1;33151:9;33147:17;33140:47;33204:131;33330:4;33204:131;:::i;:::-;33196:139;;32923:419;;;:::o;33348:222::-;33441:4;33479:2;33468:9;33464:18;33456:26;;33492:71;33560:1;33549:9;33545:17;33536:6;33492:71;:::i;:::-;33348:222;;;;:::o;33576:348::-;33705:4;33743:2;33732:9;33728:18;33720:26;;33756:71;33824:1;33813:9;33809:17;33800:6;33756:71;:::i;:::-;33837:80;33913:2;33902:9;33898:18;33889:6;33837:80;:::i;:::-;33576:348;;;;;:::o;33930:332::-;34051:4;34089:2;34078:9;34074:18;34066:26;;34102:71;34170:1;34159:9;34155:17;34146:6;34102:71;:::i;:::-;34183:72;34251:2;34240:9;34236:18;34227:6;34183:72;:::i;:::-;33930:332;;;;;:::o;34268:129::-;34302:6;34329:20;;:::i;:::-;34319:30;;34358:33;34386:4;34378:6;34358:33;:::i;:::-;34268:129;;;:::o;34403:75::-;34436:6;34469:2;34463:9;34453:19;;34403:75;:::o;34484:311::-;34561:4;34651:18;34643:6;34640:30;34637:56;;;34673:18;;:::i;:::-;34637:56;34723:4;34715:6;34711:17;34703:25;;34783:4;34777;34773:15;34765:23;;34484:311;;;:::o;34801:307::-;34862:4;34952:18;34944:6;34941:30;34938:56;;;34974:18;;:::i;:::-;34938:56;35012:29;35034:6;35012:29;:::i;:::-;35004:37;;35096:4;35090;35086:15;35078:23;;34801:307;;;:::o;35114:308::-;35176:4;35266:18;35258:6;35255:30;35252:56;;;35288:18;;:::i;:::-;35252:56;35326:29;35348:6;35326:29;:::i;:::-;35318:37;;35410:4;35404;35400:15;35392:23;;35114:308;;;:::o;35428:98::-;35479:6;35513:5;35507:12;35497:22;;35428:98;;;:::o;35532:99::-;35584:6;35618:5;35612:12;35602:22;;35532:99;;;:::o;35637:168::-;35720:11;35754:6;35749:3;35742:19;35794:4;35789:3;35785:14;35770:29;;35637:168;;;;:::o;35811:169::-;35895:11;35929:6;35924:3;35917:19;35969:4;35964:3;35960:14;35945:29;;35811:169;;;;:::o;35986:148::-;36088:11;36125:3;36110:18;;35986:148;;;;:::o;36140:305::-;36180:3;36199:20;36217:1;36199:20;:::i;:::-;36194:25;;36233:20;36251:1;36233:20;:::i;:::-;36228:25;;36387:1;36319:66;36315:74;36312:1;36309:81;36306:107;;;36393:18;;:::i;:::-;36306:107;36437:1;36434;36430:9;36423:16;;36140:305;;;;:::o;36451:185::-;36491:1;36508:20;36526:1;36508:20;:::i;:::-;36503:25;;36542:20;36560:1;36542:20;:::i;:::-;36537:25;;36581:1;36571:35;;36586:18;;:::i;:::-;36571:35;36628:1;36625;36621:9;36616:14;;36451:185;;;;:::o;36642:191::-;36682:4;36702:20;36720:1;36702:20;:::i;:::-;36697:25;;36736:20;36754:1;36736:20;:::i;:::-;36731:25;;36775:1;36772;36769:8;36766:34;;;36780:18;;:::i;:::-;36766:34;36825:1;36822;36818:9;36810:17;;36642:191;;;;:::o;36839:96::-;36876:7;36905:24;36923:5;36905:24;:::i;:::-;36894:35;;36839:96;;;:::o;36941:90::-;36975:7;37018:5;37011:13;37004:21;36993:32;;36941:90;;;:::o;37037:149::-;37073:7;37113:66;37106:5;37102:78;37091:89;;37037:149;;;:::o;37192:126::-;37229:7;37269:42;37262:5;37258:54;37247:65;;37192:126;;;:::o;37324:77::-;37361:7;37390:5;37379:16;;37324:77;;;:::o;37407:121::-;37465:9;37498:24;37516:5;37498:24;:::i;:::-;37485:37;;37407:121;;;:::o;37534:154::-;37618:6;37613:3;37608;37595:30;37680:1;37671:6;37666:3;37662:16;37655:27;37534:154;;;:::o;37694:307::-;37762:1;37772:113;37786:6;37783:1;37780:13;37772:113;;;37871:1;37866:3;37862:11;37856:18;37852:1;37847:3;37843:11;37836:39;37808:2;37805:1;37801:10;37796:15;;37772:113;;;37903:6;37900:1;37897:13;37894:101;;;37983:1;37974:6;37969:3;37965:16;37958:27;37894:101;37743:258;37694:307;;;:::o;38007:320::-;38051:6;38088:1;38082:4;38078:12;38068:22;;38135:1;38129:4;38125:12;38156:18;38146:81;;38212:4;38204:6;38200:17;38190:27;;38146:81;38274:2;38266:6;38263:14;38243:18;38240:38;38237:84;;;38293:18;;:::i;:::-;38237:84;38058:269;38007:320;;;:::o;38333:281::-;38416:27;38438:4;38416:27;:::i;:::-;38408:6;38404:40;38546:6;38534:10;38531:22;38510:18;38498:10;38495:34;38492:62;38489:88;;;38557:18;;:::i;:::-;38489:88;38597:10;38593:2;38586:22;38376:238;38333:281;;:::o;38620:233::-;38659:3;38682:24;38700:5;38682:24;:::i;:::-;38673:33;;38728:66;38721:5;38718:77;38715:103;;;38798:18;;:::i;:::-;38715:103;38845:1;38838:5;38834:13;38827:20;;38620:233;;;:::o;38859:176::-;38891:1;38908:20;38926:1;38908:20;:::i;:::-;38903:25;;38942:20;38960:1;38942:20;:::i;:::-;38937:25;;38981:1;38971:35;;38986:18;;:::i;:::-;38971:35;39027:1;39024;39020:9;39015:14;;38859:176;;;;:::o;39041:180::-;39089:77;39086:1;39079:88;39186:4;39183:1;39176:15;39210:4;39207:1;39200:15;39227:180;39275:77;39272:1;39265:88;39372:4;39369:1;39362:15;39396:4;39393:1;39386:15;39413:180;39461:77;39458:1;39451:88;39558:4;39555:1;39548:15;39582:4;39579:1;39572:15;39599:180;39647:77;39644:1;39637:88;39744:4;39741:1;39734:15;39768:4;39765:1;39758:15;39785:180;39833:77;39830:1;39823:88;39930:4;39927:1;39920:15;39954:4;39951:1;39944:15;39971:117;40080:1;40077;40070:12;40094:117;40203:1;40200;40193:12;40217:117;40326:1;40323;40316:12;40340:117;40449:1;40446;40439:12;40463:117;40572:1;40569;40562:12;40586:102;40627:6;40678:2;40674:7;40669:2;40662:5;40658:14;40654:28;40644:38;;40586:102;;;:::o;40694:237::-;40834:34;40830:1;40822:6;40818:14;40811:58;40903:20;40898:2;40890:6;40886:15;40879:45;40694:237;:::o;40937:225::-;41077:34;41073:1;41065:6;41061:14;41054:58;41146:8;41141:2;41133:6;41129:15;41122:33;40937:225;:::o;41168:178::-;41308:30;41304:1;41296:6;41292:14;41285:54;41168:178;:::o;41352:223::-;41492:34;41488:1;41480:6;41476:14;41469:58;41561:6;41556:2;41548:6;41544:15;41537:31;41352:223;:::o;41581:175::-;41721:27;41717:1;41709:6;41705:14;41698:51;41581:175;:::o;41762:231::-;41902:34;41898:1;41890:6;41886:14;41879:58;41971:14;41966:2;41958:6;41954:15;41947:39;41762:231;:::o;41999:243::-;42139:34;42135:1;42127:6;42123:14;42116:58;42208:26;42203:2;42195:6;42191:15;42184:51;41999:243;:::o;42248:229::-;42388:34;42384:1;42376:6;42372:14;42365:58;42457:12;42452:2;42444:6;42440:15;42433:37;42248:229;:::o;42483:228::-;42623:34;42619:1;42611:6;42607:14;42600:58;42692:11;42687:2;42679:6;42675:15;42668:36;42483:228;:::o;42717:233::-;42857:34;42853:1;42845:6;42841:14;42834:58;42926:16;42921:2;42913:6;42909:15;42902:41;42717:233;:::o;42956:179::-;43096:31;43092:1;43084:6;43080:14;43073:55;42956:179;:::o;43141:182::-;43281:34;43277:1;43269:6;43265:14;43258:58;43141:182;:::o;43329:236::-;43469:34;43465:1;43457:6;43453:14;43446:58;43538:19;43533:2;43525:6;43521:15;43514:44;43329:236;:::o;43571:231::-;43711:34;43707:1;43699:6;43695:14;43688:58;43780:14;43775:2;43767:6;43763:15;43756:39;43571:231;:::o;43808:182::-;43948:34;43944:1;43936:6;43932:14;43925:58;43808:182;:::o;43996:228::-;44136:34;44132:1;44124:6;44120:14;44113:58;44205:11;44200:2;44192:6;44188:15;44181:36;43996:228;:::o;44230:234::-;44370:34;44366:1;44358:6;44354:14;44347:58;44439:17;44434:2;44426:6;44422:15;44415:42;44230:234;:::o;44470:172::-;44610:24;44606:1;44598:6;44594:14;44587:48;44470:172;:::o;44648:220::-;44788:34;44784:1;44776:6;44772:14;44765:58;44857:3;44852:2;44844:6;44840:15;44833:28;44648:220;:::o;44874:236::-;45014:34;45010:1;45002:6;44998:14;44991:58;45083:19;45078:2;45070:6;45066:15;45059:44;44874:236;:::o;45116:223::-;45256:34;45252:1;45244:6;45240:14;45233:58;45325:6;45320:2;45312:6;45308:15;45301:31;45116:223;:::o;45345:235::-;45485:34;45481:1;45473:6;45469:14;45462:58;45554:18;45549:2;45541:6;45537:15;45530:43;45345:235;:::o;45586:161::-;45726:13;45722:1;45714:6;45710:14;45703:37;45586:161;:::o;45753:122::-;45826:24;45844:5;45826:24;:::i;:::-;45819:5;45816:35;45806:63;;45865:1;45862;45855:12;45806:63;45753:122;:::o;45881:116::-;45951:21;45966:5;45951:21;:::i;:::-;45944:5;45941:32;45931:60;;45987:1;45984;45977:12;45931:60;45881:116;:::o;46003:120::-;46075:23;46092:5;46075:23;:::i;:::-;46068:5;46065:34;46055:62;;46113:1;46110;46103:12;46055:62;46003:120;:::o;46129:122::-;46202:24;46220:5;46202:24;:::i;:::-;46195:5;46192:35;46182:63;;46241:1;46238;46231:12;46182:63;46129:122;:::o

Swarm Source

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