ETH Price: $3,604.96 (+4.41%)
 

Overview

Max Total Supply

13 PoP

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
vinegaroon.eth
Balance
3 PoP
0x9de913b2e5b0f3986bffa510201107d8a07cd542
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:
PunksOfPicasso

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

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

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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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


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;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

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

}


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 { }
}
// <3

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// salute to the COVIDPunks team



// Welcome To Punks Of Picasso!
// Pixedlabs.ai DEV team



pragma solidity ^0.8.0;

contract PunksOfPicasso is Ownable, ERC721Enumerable, ReentrancyGuard {
  using Counters for Counters.Counter;
  using Strings for uint256;

  // defining global variables
  bool private _isSaleActive = false;
  string public imageHash;
  uint256 public constant MAX_MINT_AT_ONCE = 20;

  uint256 private _price = 0.08 ether; // 80000000000000000
  
  string public punkcontractURI;
  
  constructor() ERC721("PunksOfPicasso", "PoP") {}

  uint256[10000] private _availablePoPs;
  uint256 private _numAvailablePoP = 10000;
  uint256 private _availableGift = 200;
  uint256 private _giftsMinted = 0; // giftsGiven

  uint256 private _lastTokenIdMintedInInitialSet = 10000; // ->?

  function numTotalPunks() public view virtual returns (uint256) {
    return 10000;
  }

  function mintPoP(uint256 _numToMint) public payable nonReentrant() {
    require(_isSaleActive, "Sale is not active.");
    uint256 totalSupply = totalSupply();
    require(totalSupply + _numToMint <= numTotalPunks(), "Required amount of PoP is not left.");
    uint256 costForMintingPunks = _price * _numToMint;
    require(msg.value >= costForMintingPunks, "Not enough amount. Please offer more ETH.");
    if (msg.value > costForMintingPunks) {
      payable(msg.sender).transfer(msg.value - costForMintingPunks);
    }
    _mint(_numToMint);
  }

  // internal minting function
  function _mint(uint256 _numToMint) internal {
    require(_numToMint <= MAX_MINT_AT_ONCE, "Minting more than 20 at once, is not allowed. Please try it partially.");

    uint256 tNumAvailableTokens = _numAvailablePoP; // temp variable to update
    for (uint256 i = 0; i < _numToMint; i++) {
      uint256 newTokenId = useRandomAvailableToken(_numToMint, i);
      _safeMint(msg.sender, newTokenId);
      tNumAvailableTokens--;
    }
    _numAvailablePoP = tNumAvailableTokens;
  }

  // internal minting function
  function _giftMint(address _to, uint256 _numToMint) internal {
    require(_numToMint <= 5, "Gifting too many at once.");
    uint256 tNumAvailableTokens = _numAvailablePoP;
    for (uint256 i = 0; i < _numToMint; i++) {
      uint256 newTokenId = useRandomAvailableToken(_numToMint, i);
      _safeMint(_to, newTokenId);
      tNumAvailableTokens--;
    }
    _numAvailablePoP = tNumAvailableTokens;
  }


  function useRandomAvailableToken(uint256 _numToFetch, uint256 _i)
    internal
    returns (uint256)
  {
    uint256 randomNum =
      uint256(
        keccak256(
          abi.encode(
            msg.sender,
            tx.gasprice,
            block.number,
            block.timestamp,
            blockhash(block.number - 1),
            _numToFetch,
            _i
          )
        )
      );
    uint256 randomIndex = randomNum % _numAvailablePoP;
    return useAvailableTokenAtIndex(randomIndex);
  }

  function useAvailableTokenAtIndex(uint256 indexToUse)
    internal
    returns (uint256)
  {
    uint256 valAtIndex = _availablePoPs[indexToUse];
    uint256 result;
    if (valAtIndex == 0) {
      // This means the index itself is still an available token
      result = indexToUse;
    } else {
      // This means the index itself is not an available token, but the val at that index is.
      result = valAtIndex;
    }

    uint256 lastIndex = _numAvailablePoP - 1;
    if (indexToUse != lastIndex) {
      // Replace the value at indexToUse, now that it's been used.
      // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
      uint256 lastValInArray = _availablePoPs[lastIndex];
      if (lastValInArray == 0) {
        // This means the index itself is still an available token
        _availablePoPs[indexToUse] = lastIndex;
      } else {
        // This means the index itself is not an available token, but the val at that index is.
        _availablePoPs[indexToUse] = lastValInArray;
      }
    }

    _numAvailablePoP--;
    return result;
  }
  
  function isSaleActive() public view returns (bool){
      return _isSaleActive;
  }

  function getPrice() public view returns (uint256){
    return _price;
  }

  function contractURI() public view returns (string memory){
    return punkcontractURI;
  }

  function getCostForMintingPunks(uint256 _numToMint)
    public
    view
    returns (uint256)
  {
    require(
      totalSupply() + _numToMint <= numTotalPunks(),
      "There are not this many punks left."
    );
    require(
      _numToMint <= MAX_MINT_AT_ONCE,
      "You cannot mint that many punks."
    );
    return _numToMint * _price;  
  }

  function getPunksBelongingToOwner(address _owner)
    external
    view
    returns (uint256[] memory)
  {
    uint256 numPunks = balanceOf(_owner);
    if (numPunks == 0) {
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](numPunks);
      for (uint256 i = 0; i < numPunks; i++) {
        result[i] = tokenOfOwnerByIndex(_owner, i);
      }
      return result;
    }
  }

  /*
   * For developers
   */

  // metadata URI
  string private _baseTokenURI;

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

  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
    string memory base = _baseURI();
    string memory _tokenURI = Strings.toString(_tokenId);
    string memory ending = ".json";

    // If there is no base URI, return the token URI.
    if (bytes(base).length == 0) {
      return _tokenURI;
    }

    return string(abi.encodePacked(base, _tokenURI, ending));
  }
  

  /*
   * For Owners
   */



  function giftByOwners(address _to, uint256 _giftAmount) public onlyOwner {
    uint256 giftAmountToMint = _giftAmount;
    uint256 remainingGift = _availableGift - _giftAmount;
    uint256 remainingPunks = numTotalPunks() - totalSupply();
    require(giftAmountToMint > 0 && giftAmountToMint <= remainingGift, "Not enough reserve left for gift");
    require(totalSupply() + giftAmountToMint <= numTotalPunks(), "There aren't this many punks left.");
    require(remainingPunks > 0, "There isn't any punk left.");
    require(giftAmountToMint <= remainingPunks, "There isn't enough punk left for gift.");
    _availableGift = _availableGift - giftAmountToMint;
    _giftsMinted = _giftsMinted + giftAmountToMint;
    _giftMint(_to, giftAmountToMint);
  }

  function setGiftLimit(uint256 _newGiftLimit) public onlyOwner() {
    _availableGift = _newGiftLimit;
  }

  function setPrice(uint256 _newPrice) public onlyOwner() {
    _price = _newPrice;
  }

  function switchSaleState() public onlyOwner{
      _isSaleActive = !_isSaleActive;
  }

  // URIs
  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  function setContractURI(string memory _contractURI) external onlyOwner {
    punkcontractURI = _contractURI;
  }
  
  function setImageHash(string memory _imageHash) external onlyOwner {
    imageHash = _imageHash;
  }

  function withdraw() public onlyOwner {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual override(ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC721Enumerable)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_AT_ONCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToMint","type":"uint256"}],"name":"getCostForMintingPunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getPunksBelongingToOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_giftAmount","type":"uint256"}],"name":"giftByOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToMint","type":"uint256"}],"name":"mintPoP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTotalPunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkcontractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGiftLimit","type":"uint256"}],"name":"setGiftLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageHash","type":"string"}],"name":"setImageHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff02191690831515021790555067011c37937e080000600e556127106127205560c861272155600061272255612710612723553480156200005257600080fd5b506040518060400160405280600e81526020017f50756e6b734f665069636173736f0000000000000000000000000000000000008152506040518060400160405280600381526020017f506f5000000000000000000000000000000000000000000000000000000000008152506000620000d1620001b160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350816001908051906020019062000187929190620001b9565b508060029080519060200190620001a0929190620001b9565b5050506001600b81905550620002ce565b600033905090565b828054620001c79062000269565b90600052602060002090601f016020900481019282620001eb576000855562000237565b82601f106200020657805160ff191683800117855562000237565b8280016001018555821562000237579182015b828111156200023657825182559160200191906001019062000219565b5b5090506200024691906200024a565b5090565b5b80821115620002655760008160009055506001016200024b565b5090565b600060028204905060018216806200028257607f821691505b602082108114156200029957620002986200029f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61507f80620002de6000396000f3fe60806040526004361061021a5760003560e01c80635b5a493d11610123578063a22cb465116100ab578063e8a3d4851161006f578063e8a3d485146107c2578063e8e732a1146107ed578063e985e9c51461082a578063efc4f1dc14610867578063f2fde38b1461087e5761021a565b8063a22cb465146106da578063b88d4fde14610703578063bc4eda101461072c578063c87b56dd14610769578063e7e7f8cc146107a65761021a565b80638da5cb5b116100f25780638da5cb5b1461060757806391b7f5ed14610632578063938e3d7b1461065b57806395d89b411461068457806398d5fdca146106af5761021a565b80635b5a493d1461054b5780636352211e1461057657806370a08231146105b3578063715018a6146105f05761021a565b806318160ddd116101a657806342842e0e1161017557806342842e0e146104665780634f6ccce71461048f57806351605d80146104cc57806355f804b3146104f7578063564566a8146105205761021a565b806318160ddd146103be57806323b872dd146103e95780632f745c59146104125780633ccfd60b1461044f5761021a565b806306d120d5116101ed57806306d120d5146102d957806306fdde0314610304578063081812fc1461032f578063095ea7b31461036c5780630f1610d0146103955761021a565b806301ffc9a71461021f57806304299b2a1461025c57806305394dcc14610285578063066141e3146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613955565b6108a7565b6040516102539190614745565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906139a7565b6108b9565b005b34801561029157600080fd5b5061029a61094f565b6040516102a79190614b42565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906139e8565b610954565b005b3480156102e557600080fd5b506102ee6109db565b6040516102fb9190614760565b60405180910390f35b34801561031057600080fd5b50610319610a69565b6040516103269190614760565b60405180910390f35b34801561033b57600080fd5b50610356600480360381019061035191906139e8565b610afb565b604051610363919061464d565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613919565b610b80565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190613919565b610c98565b005b3480156103ca57600080fd5b506103d3610eb8565b6040516103e09190614b42565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613813565b610ec5565b005b34801561041e57600080fd5b5061043960048036038101906104349190613919565b610f25565b6040516104469190614b42565b60405180910390f35b34801561045b57600080fd5b50610464610fca565b005b34801561047257600080fd5b5061048d60048036038101906104889190613813565b6110f5565b005b34801561049b57600080fd5b506104b660048036038101906104b191906139e8565b611115565b6040516104c39190614b42565b60405180910390f35b3480156104d857600080fd5b506104e16111ac565b6040516104ee9190614760565b60405180910390f35b34801561050357600080fd5b5061051e600480360381019061051991906139a7565b61123a565b005b34801561052c57600080fd5b506105356112d1565b6040516105429190614745565b60405180910390f35b34801561055757600080fd5b506105606112e8565b60405161056d9190614b42565b60405180910390f35b34801561058257600080fd5b5061059d600480360381019061059891906139e8565b6112f2565b6040516105aa919061464d565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906137ae565b6113a4565b6040516105e79190614b42565b60405180910390f35b3480156105fc57600080fd5b5061060561145c565b005b34801561061357600080fd5b5061061c611596565b604051610629919061464d565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906139e8565b6115bf565b005b34801561066757600080fd5b50610682600480360381019061067d91906139a7565b611645565b005b34801561069057600080fd5b506106996116db565b6040516106a69190614760565b60405180910390f35b3480156106bb57600080fd5b506106c461176d565b6040516106d19190614b42565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc91906138dd565b611777565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613862565b6118f8565b005b34801561073857600080fd5b50610753600480360381019061074e91906139e8565b61195a565b6040516107609190614b42565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906139e8565b611a11565b60405161079d9190614760565b60405180910390f35b6107c060048036038101906107bb91906139e8565b611aaa565b005b3480156107ce57600080fd5b506107d7611c6e565b6040516107e49190614760565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906137ae565b611d00565b6040516108219190614723565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906137d7565b611e7c565b60405161085e9190614745565b60405180910390f35b34801561087357600080fd5b5061087c611f10565b005b34801561088a57600080fd5b506108a560048036038101906108a091906137ae565b611fb8565b005b60006108b282612161565b9050919050565b6108c16121db565b73ffffffffffffffffffffffffffffffffffffffff166108df611596565b73ffffffffffffffffffffffffffffffffffffffff1614610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c906149e2565b60405180910390fd5b80600d908051906020019061094b9291906135d2565b5050565b601481565b61095c6121db565b73ffffffffffffffffffffffffffffffffffffffff1661097a611596565b73ffffffffffffffffffffffffffffffffffffffff16146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906149e2565b60405180910390fd5b806127218190555050565b600f80546109e890614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1490614e74565b8015610a615780601f10610a3657610100808354040283529160200191610a61565b820191906000526020600020905b815481529060010190602001808311610a4457829003601f168201915b505050505081565b606060018054610a7890614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa490614e74565b8015610af15780601f10610ac657610100808354040283529160200191610af1565b820191906000526020600020905b815481529060010190602001808311610ad457829003601f168201915b5050505050905090565b6000610b06826121e3565b610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c906149a2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8b826112f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf390614a62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c1b6121db565b73ffffffffffffffffffffffffffffffffffffffff161480610c4a5750610c4981610c446121db565b611e7c565b5b610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c80906148e2565b60405180910390fd5b610c93838361224f565b505050565b610ca06121db565b73ffffffffffffffffffffffffffffffffffffffff16610cbe611596565b73ffffffffffffffffffffffffffffffffffffffff1614610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b906149e2565b60405180910390fd5b600081905060008261272154610d2a9190614d56565b90506000610d36610eb8565b610d3e6112e8565b610d489190614d56565b9050600083118015610d5a5750818311155b610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090614822565b60405180910390fd5b610da16112e8565b83610daa610eb8565b610db49190614c75565b1115610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90614b02565b60405180910390fd5b60008111610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906148a2565b60405180910390fd5b80831115610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290614a42565b60405180910390fd5b8261272154610e8a9190614d56565b612721819055508261272254610ea09190614c75565b61272281905550610eb18584612308565b5050505050565b6000600980549050905090565b610ed6610ed06121db565b826123a7565b610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c90614ac2565b60405180910390fd5b610f20838383612485565b505050565b6000610f30836113a4565b8210610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890614782565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fd26121db565b73ffffffffffffffffffffffffffffffffffffffff16610ff0611596565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906149e2565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161106c90614638565b60006040518083038185875af1925050503d80600081146110a9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ae565b606091505b50509050806110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614aa2565b60405180910390fd5b50565b611110838383604051806020016040528060008152506118f8565b505050565b600061111f610eb8565b8210611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790614ae2565b60405180910390fd5b6009828154811061119a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d80546111b990614e74565b80601f01602080910402602001604051908101604052809291908181526020018280546111e590614e74565b80156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b6112426121db565b73ffffffffffffffffffffffffffffffffffffffff16611260611596565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906149e2565b60405180910390fd5b8061272490805190602001906112cd9291906135d2565b5050565b6000600c60009054906101000a900460ff16905090565b6000612710905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614922565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614902565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114646121db565b73ffffffffffffffffffffffffffffffffffffffff16611482611596565b73ffffffffffffffffffffffffffffffffffffffff16146114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf906149e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115c76121db565b73ffffffffffffffffffffffffffffffffffffffff166115e5611596565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906149e2565b60405180910390fd5b80600e8190555050565b61164d6121db565b73ffffffffffffffffffffffffffffffffffffffff1661166b611596565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906149e2565b60405180910390fd5b80600f90805190602001906116d79291906135d2565b5050565b6060600280546116ea90614e74565b80601f016020809104026020016040519081016040528092919081815260200182805461171690614e74565b80156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b5050505050905090565b6000600e54905090565b61177f6121db565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490614882565b60405180910390fd5b80600660006117fa6121db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a76121db565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ec9190614745565b60405180910390a35050565b6119096119036121db565b836123a7565b611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614ac2565b60405180910390fd5b611954848484846126e1565b50505050565b60006119646112e8565b8261196d610eb8565b6119779190614c75565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614a82565b60405180910390fd5b60148211156119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390614982565b60405180910390fd5b600e5482611a0a9190614cfc565b9050919050565b60606000611a1d61273d565b90506000611a2a846127d0565b905060006040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152509050600083511415611a7b57819350505050611aa5565b828282604051602001611a9093929190614607565b60405160208183030381529060405293505050505b919050565b6002600b541415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b22565b60405180910390fd5b6002600b81905550600c60009054906101000a900460ff16611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614a22565b60405180910390fd5b6000611b51610eb8565b9050611b5b6112e8565b8282611b679190614c75565b1115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906147c2565b60405180910390fd5b600082600e54611bb89190614cfc565b905080341015611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490614962565b60405180910390fd5b80341115611c58573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611c2b9190614d56565b9081150290604051600060405180830381858888f19350505050158015611c56573d6000803e3d6000fd5b505b611c618361297d565b50506001600b8190555050565b6060600f8054611c7d90614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614e74565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b5050505050905090565b60606000611d0d836113a4565b90506000811415611d9057600067ffffffffffffffff811115611d59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d875781602001602082028036833780820191505090505b50915050611e77565b60008167ffffffffffffffff811115611dd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e005781602001602082028036833780820191505090505b50905060005b82811015611e7057611e188582610f25565b828281518110611e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e6890614ea6565b915050611e06565b5080925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f186121db565b73ffffffffffffffffffffffffffffffffffffffff16611f36611596565b73ffffffffffffffffffffffffffffffffffffffff1614611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906149e2565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b611fc06121db565b73ffffffffffffffffffffffffffffffffffffffff16611fde611596565b73ffffffffffffffffffffffffffffffffffffffff1614612034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202b906149e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b906147e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121d457506121d382612a1b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c2836112f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600581111561234c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612343906149c2565b60405180910390fd5b600061272054905060005b8281101561239957600061236b8483612afd565b90506123778582612b6b565b828061238290614e4a565b93505050808061239190614ea6565b915050612357565b508061272081905550505050565b60006123b2826121e3565b6123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e8906148c2565b60405180910390fd5b60006123fc836112f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246b57508373ffffffffffffffffffffffffffffffffffffffff1661245384610afb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247c575061247b8185611e7c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a5826112f2565b73ffffffffffffffffffffffffffffffffffffffff16146124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614a02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614862565b60405180910390fd5b612576838383612b89565b61258160008261224f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d19190614d56565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126289190614c75565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126ec848484612485565b6126f884848484612b99565b612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906147a2565b60405180910390fd5b50505050565b6060612724805461274d90614e74565b80601f016020809104026020016040519081016040528092919081815260200182805461277990614e74565b80156127c65780601f1061279b576101008083540402835291602001916127c6565b820191906000526020600020905b8154815290600101906020018083116127a957829003601f168201915b5050505050905090565b60606000821415612818576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612978565b600082905060005b6000821461284a57808061283390614ea6565b915050600a826128439190614ccb565b9150612820565b60008167ffffffffffffffff81111561288c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128be5781602001600182028036833780820191505090505b5090505b60008514612971576001826128d79190614d56565b9150600a856128e69190614eef565b60306128f29190614c75565b60f81b81838151811061292e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561296a9190614ccb565b94506128c2565b8093505050505b919050565b60148111156129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614842565b60405180910390fd5b600061272054905060005b82811015612a0e5760006129e08483612afd565b90506129ec3382612b6b565b82806129f790614e4a565b935050508080612a0690614ea6565b9150506129cc565b5080612720819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af65750612af582612d30565b5b9050919050565b600080333a4342600143612b119190614d56565b408888604051602001612b2a97969594939291906146b4565b6040516020818303038152906040528051906020012060001c905060006127205482612b569190614eef565b9050612b6181612d9a565b9250505092915050565b612b85828260405180602001604052806000815250612f05565b5050565b612b94838383612f60565b505050565b6000612bba8473ffffffffffffffffffffffffffffffffffffffff16613074565b15612d23578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612be36121db565b8786866040518563ffffffff1660e01b8152600401612c059493929190614668565b602060405180830381600087803b158015612c1f57600080fd5b505af1925050508015612c5057506040513d601f19601f82011682018060405250810190612c4d919061397e565b60015b612cd3573d8060008114612c80576040519150601f19603f3d011682016040523d82523d6000602084013e612c85565b606091505b50600081511415612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906147a2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d28565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806010836127108110612dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050600080821415612dee57839050612df2565b8190505b6000600161272054612e049190614d56565b9050808514612ee15760006010826127108110612e4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000811415612e9d57816010876127108110612e93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550612edf565b806010876127108110612ed9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b6127206000815480929190612ef590614e4a565b9190505550819350505050919050565b612f0f8383613087565b612f1c6000848484612b99565b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f52906147a2565b60405180910390fd5b505050565b612f6b838383613255565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fae57612fa98161325a565b612fed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fec57612feb83826132a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130305761302b81613410565b61306f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461306e5761306d8282613553565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee90614942565b60405180910390fd5b613100816121e3565b15613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313790614802565b60405180910390fd5b61314c60008383612b89565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461319c9190614c75565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132b0846113a4565b6132ba9190614d56565b905060006008600084815260200190815260200160002054905081811461339f576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506134249190614d56565b90506000600a600084815260200190815260200160002054905060006009838154811061347a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106134c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613537577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061355e836113a4565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546135de90614e74565b90600052602060002090601f0160209004810192826136005760008555613647565b82601f1061361957805160ff1916838001178555613647565b82800160010185558215613647579182015b8281111561364657825182559160200191906001019061362b565b5b5090506136549190613658565b5090565b5b80821115613671576000816000905550600101613659565b5090565b600061368861368384614b8e565b614b5d565b9050828152602081018484840111156136a057600080fd5b6136ab848285614e08565b509392505050565b60006136c66136c184614bbe565b614b5d565b9050828152602081018484840111156136de57600080fd5b6136e9848285614e08565b509392505050565b60008135905061370081614fed565b92915050565b60008135905061371581615004565b92915050565b60008135905061372a8161501b565b92915050565b60008151905061373f8161501b565b92915050565b600082601f83011261375657600080fd5b8135613766848260208601613675565b91505092915050565b600082601f83011261378057600080fd5b81356137908482602086016136b3565b91505092915050565b6000813590506137a881615032565b92915050565b6000602082840312156137c057600080fd5b60006137ce848285016136f1565b91505092915050565b600080604083850312156137ea57600080fd5b60006137f8858286016136f1565b9250506020613809858286016136f1565b9150509250929050565b60008060006060848603121561382857600080fd5b6000613836868287016136f1565b9350506020613847868287016136f1565b925050604061385886828701613799565b9150509250925092565b6000806000806080858703121561387857600080fd5b6000613886878288016136f1565b9450506020613897878288016136f1565b93505060406138a887828801613799565b925050606085013567ffffffffffffffff8111156138c557600080fd5b6138d187828801613745565b91505092959194509250565b600080604083850312156138f057600080fd5b60006138fe858286016136f1565b925050602061390f85828601613706565b9150509250929050565b6000806040838503121561392c57600080fd5b600061393a858286016136f1565b925050602061394b85828601613799565b9150509250929050565b60006020828403121561396757600080fd5b60006139758482850161371b565b91505092915050565b60006020828403121561399057600080fd5b600061399e84828501613730565b91505092915050565b6000602082840312156139b957600080fd5b600082013567ffffffffffffffff8111156139d357600080fd5b6139df8482850161376f565b91505092915050565b6000602082840312156139fa57600080fd5b6000613a0884828501613799565b91505092915050565b6000613a1d83836145e9565b60208301905092915050565b613a3281614d8a565b82525050565b6000613a4382614bfe565b613a4d8185614c2c565b9350613a5883614bee565b8060005b83811015613a89578151613a708882613a11565b9750613a7b83614c1f565b925050600181019050613a5c565b5085935050505092915050565b613a9f81614d9c565b82525050565b613aae81614da8565b82525050565b6000613abf82614c09565b613ac98185614c3d565b9350613ad9818560208601614e17565b613ae281614fdc565b840191505092915050565b6000613af882614c14565b613b028185614c59565b9350613b12818560208601614e17565b613b1b81614fdc565b840191505092915050565b6000613b3182614c14565b613b3b8185614c6a565b9350613b4b818560208601614e17565b80840191505092915050565b6000613b64602b83614c59565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613bca603283614c59565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613c30602383614c59565b91507f526571756972656420616d6f756e74206f6620506f50206973206e6f74206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c96602683614c59565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cfc601c83614c59565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d3c602083614c59565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f7220676966746000830152602082019050919050565b6000613d7c604683614c59565b91507f4d696e74696e67206d6f7265207468616e203230206174206f6e63652c20697360008301527f206e6f7420616c6c6f7765642e20506c6561736520747279206974207061727460208301527f69616c6c792e00000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613e08602483614c59565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e6e601983614c59565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613eae601a83614c59565b91507f54686572652069736e277420616e792070756e6b206c6566742e0000000000006000830152602082019050919050565b6000613eee602c83614c59565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f54603883614c59565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fba602a83614c59565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614020602983614c59565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614086602083614c59565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140c6602983614c59565b91507f4e6f7420656e6f75676820616d6f756e742e20506c65617365206f666665722060008301527f6d6f7265204554482e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061412c602083614c59565b91507f596f752063616e6e6f74206d696e742074686174206d616e792070756e6b732e6000830152602082019050919050565b600061416c602c83614c59565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141d2601983614c59565b91507f47696674696e6720746f6f206d616e79206174206f6e63652e000000000000006000830152602082019050919050565b6000614212602083614c59565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614252602983614c59565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b8601383614c59565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b60006142f8602683614c59565b91507f54686572652069736e277420656e6f7567682070756e6b206c65667420666f7260008301527f20676966742e00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435e602183614c59565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c4602383614c59565b91507f546865726520617265206e6f742074686973206d616e792070756e6b73206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061442a600083614c4e565b9150600082019050919050565b6000614444601083614c59565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000614484603183614c59565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144ea602c83614c59565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614550602283614c59565b91507f5468657265206172656e27742074686973206d616e792070756e6b73206c656660008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145b6601f83614c59565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6145f281614dfe565b82525050565b61460181614dfe565b82525050565b60006146138286613b26565b915061461f8285613b26565b915061462b8284613b26565b9150819050949350505050565b60006146438261441d565b9150819050919050565b60006020820190506146626000830184613a29565b92915050565b600060808201905061467d6000830187613a29565b61468a6020830186613a29565b61469760408301856145f8565b81810360608301526146a98184613ab4565b905095945050505050565b600060e0820190506146c9600083018a613a29565b6146d660208301896145f8565b6146e360408301886145f8565b6146f060608301876145f8565b6146fd6080830186613aa5565b61470a60a08301856145f8565b61471760c08301846145f8565b98975050505050505050565b6000602082019050818103600083015261473d8184613a38565b905092915050565b600060208201905061475a6000830184613a96565b92915050565b6000602082019050818103600083015261477a8184613aed565b905092915050565b6000602082019050818103600083015261479b81613b57565b9050919050565b600060208201905081810360008301526147bb81613bbd565b9050919050565b600060208201905081810360008301526147db81613c23565b9050919050565b600060208201905081810360008301526147fb81613c89565b9050919050565b6000602082019050818103600083015261481b81613cef565b9050919050565b6000602082019050818103600083015261483b81613d2f565b9050919050565b6000602082019050818103600083015261485b81613d6f565b9050919050565b6000602082019050818103600083015261487b81613dfb565b9050919050565b6000602082019050818103600083015261489b81613e61565b9050919050565b600060208201905081810360008301526148bb81613ea1565b9050919050565b600060208201905081810360008301526148db81613ee1565b9050919050565b600060208201905081810360008301526148fb81613f47565b9050919050565b6000602082019050818103600083015261491b81613fad565b9050919050565b6000602082019050818103600083015261493b81614013565b9050919050565b6000602082019050818103600083015261495b81614079565b9050919050565b6000602082019050818103600083015261497b816140b9565b9050919050565b6000602082019050818103600083015261499b8161411f565b9050919050565b600060208201905081810360008301526149bb8161415f565b9050919050565b600060208201905081810360008301526149db816141c5565b9050919050565b600060208201905081810360008301526149fb81614205565b9050919050565b60006020820190508181036000830152614a1b81614245565b9050919050565b60006020820190508181036000830152614a3b816142ab565b9050919050565b60006020820190508181036000830152614a5b816142eb565b9050919050565b60006020820190508181036000830152614a7b81614351565b9050919050565b60006020820190508181036000830152614a9b816143b7565b9050919050565b60006020820190508181036000830152614abb81614437565b9050919050565b60006020820190508181036000830152614adb81614477565b9050919050565b60006020820190508181036000830152614afb816144dd565b9050919050565b60006020820190508181036000830152614b1b81614543565b9050919050565b60006020820190508181036000830152614b3b816145a9565b9050919050565b6000602082019050614b5760008301846145f8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b8457614b83614fad565b5b8060405250919050565b600067ffffffffffffffff821115614ba957614ba8614fad565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bd957614bd8614fad565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c8082614dfe565b9150614c8b83614dfe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc057614cbf614f20565b5b828201905092915050565b6000614cd682614dfe565b9150614ce183614dfe565b925082614cf157614cf0614f4f565b5b828204905092915050565b6000614d0782614dfe565b9150614d1283614dfe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d4b57614d4a614f20565b5b828202905092915050565b6000614d6182614dfe565b9150614d6c83614dfe565b925082821015614d7f57614d7e614f20565b5b828203905092915050565b6000614d9582614dde565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e35578082015181840152602081019050614e1a565b83811115614e44576000848401525b50505050565b6000614e5582614dfe565b91506000821415614e6957614e68614f20565b5b600182039050919050565b60006002820490506001821680614e8c57607f821691505b60208210811415614ea057614e9f614f7e565b5b50919050565b6000614eb182614dfe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ee457614ee3614f20565b5b600182019050919050565b6000614efa82614dfe565b9150614f0583614dfe565b925082614f1557614f14614f4f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ff681614d8a565b811461500157600080fd5b50565b61500d81614d9c565b811461501857600080fd5b50565b61502481614db2565b811461502f57600080fd5b50565b61503b81614dfe565b811461504657600080fd5b5056fea2646970667358221220e01ff7d6b6fec0d6bd2c87f13d5d8baa72456c4e826fa7733c320b2e3a22772064736f6c63430008000033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80635b5a493d11610123578063a22cb465116100ab578063e8a3d4851161006f578063e8a3d485146107c2578063e8e732a1146107ed578063e985e9c51461082a578063efc4f1dc14610867578063f2fde38b1461087e5761021a565b8063a22cb465146106da578063b88d4fde14610703578063bc4eda101461072c578063c87b56dd14610769578063e7e7f8cc146107a65761021a565b80638da5cb5b116100f25780638da5cb5b1461060757806391b7f5ed14610632578063938e3d7b1461065b57806395d89b411461068457806398d5fdca146106af5761021a565b80635b5a493d1461054b5780636352211e1461057657806370a08231146105b3578063715018a6146105f05761021a565b806318160ddd116101a657806342842e0e1161017557806342842e0e146104665780634f6ccce71461048f57806351605d80146104cc57806355f804b3146104f7578063564566a8146105205761021a565b806318160ddd146103be57806323b872dd146103e95780632f745c59146104125780633ccfd60b1461044f5761021a565b806306d120d5116101ed57806306d120d5146102d957806306fdde0314610304578063081812fc1461032f578063095ea7b31461036c5780630f1610d0146103955761021a565b806301ffc9a71461021f57806304299b2a1461025c57806305394dcc14610285578063066141e3146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613955565b6108a7565b6040516102539190614745565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906139a7565b6108b9565b005b34801561029157600080fd5b5061029a61094f565b6040516102a79190614b42565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906139e8565b610954565b005b3480156102e557600080fd5b506102ee6109db565b6040516102fb9190614760565b60405180910390f35b34801561031057600080fd5b50610319610a69565b6040516103269190614760565b60405180910390f35b34801561033b57600080fd5b50610356600480360381019061035191906139e8565b610afb565b604051610363919061464d565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613919565b610b80565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190613919565b610c98565b005b3480156103ca57600080fd5b506103d3610eb8565b6040516103e09190614b42565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613813565b610ec5565b005b34801561041e57600080fd5b5061043960048036038101906104349190613919565b610f25565b6040516104469190614b42565b60405180910390f35b34801561045b57600080fd5b50610464610fca565b005b34801561047257600080fd5b5061048d60048036038101906104889190613813565b6110f5565b005b34801561049b57600080fd5b506104b660048036038101906104b191906139e8565b611115565b6040516104c39190614b42565b60405180910390f35b3480156104d857600080fd5b506104e16111ac565b6040516104ee9190614760565b60405180910390f35b34801561050357600080fd5b5061051e600480360381019061051991906139a7565b61123a565b005b34801561052c57600080fd5b506105356112d1565b6040516105429190614745565b60405180910390f35b34801561055757600080fd5b506105606112e8565b60405161056d9190614b42565b60405180910390f35b34801561058257600080fd5b5061059d600480360381019061059891906139e8565b6112f2565b6040516105aa919061464d565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906137ae565b6113a4565b6040516105e79190614b42565b60405180910390f35b3480156105fc57600080fd5b5061060561145c565b005b34801561061357600080fd5b5061061c611596565b604051610629919061464d565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906139e8565b6115bf565b005b34801561066757600080fd5b50610682600480360381019061067d91906139a7565b611645565b005b34801561069057600080fd5b506106996116db565b6040516106a69190614760565b60405180910390f35b3480156106bb57600080fd5b506106c461176d565b6040516106d19190614b42565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc91906138dd565b611777565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613862565b6118f8565b005b34801561073857600080fd5b50610753600480360381019061074e91906139e8565b61195a565b6040516107609190614b42565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906139e8565b611a11565b60405161079d9190614760565b60405180910390f35b6107c060048036038101906107bb91906139e8565b611aaa565b005b3480156107ce57600080fd5b506107d7611c6e565b6040516107e49190614760565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906137ae565b611d00565b6040516108219190614723565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906137d7565b611e7c565b60405161085e9190614745565b60405180910390f35b34801561087357600080fd5b5061087c611f10565b005b34801561088a57600080fd5b506108a560048036038101906108a091906137ae565b611fb8565b005b60006108b282612161565b9050919050565b6108c16121db565b73ffffffffffffffffffffffffffffffffffffffff166108df611596565b73ffffffffffffffffffffffffffffffffffffffff1614610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c906149e2565b60405180910390fd5b80600d908051906020019061094b9291906135d2565b5050565b601481565b61095c6121db565b73ffffffffffffffffffffffffffffffffffffffff1661097a611596565b73ffffffffffffffffffffffffffffffffffffffff16146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906149e2565b60405180910390fd5b806127218190555050565b600f80546109e890614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1490614e74565b8015610a615780601f10610a3657610100808354040283529160200191610a61565b820191906000526020600020905b815481529060010190602001808311610a4457829003601f168201915b505050505081565b606060018054610a7890614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa490614e74565b8015610af15780601f10610ac657610100808354040283529160200191610af1565b820191906000526020600020905b815481529060010190602001808311610ad457829003601f168201915b5050505050905090565b6000610b06826121e3565b610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c906149a2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8b826112f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf390614a62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c1b6121db565b73ffffffffffffffffffffffffffffffffffffffff161480610c4a5750610c4981610c446121db565b611e7c565b5b610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c80906148e2565b60405180910390fd5b610c93838361224f565b505050565b610ca06121db565b73ffffffffffffffffffffffffffffffffffffffff16610cbe611596565b73ffffffffffffffffffffffffffffffffffffffff1614610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b906149e2565b60405180910390fd5b600081905060008261272154610d2a9190614d56565b90506000610d36610eb8565b610d3e6112e8565b610d489190614d56565b9050600083118015610d5a5750818311155b610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090614822565b60405180910390fd5b610da16112e8565b83610daa610eb8565b610db49190614c75565b1115610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90614b02565b60405180910390fd5b60008111610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906148a2565b60405180910390fd5b80831115610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290614a42565b60405180910390fd5b8261272154610e8a9190614d56565b612721819055508261272254610ea09190614c75565b61272281905550610eb18584612308565b5050505050565b6000600980549050905090565b610ed6610ed06121db565b826123a7565b610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c90614ac2565b60405180910390fd5b610f20838383612485565b505050565b6000610f30836113a4565b8210610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890614782565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fd26121db565b73ffffffffffffffffffffffffffffffffffffffff16610ff0611596565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906149e2565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161106c90614638565b60006040518083038185875af1925050503d80600081146110a9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ae565b606091505b50509050806110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614aa2565b60405180910390fd5b50565b611110838383604051806020016040528060008152506118f8565b505050565b600061111f610eb8565b8210611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790614ae2565b60405180910390fd5b6009828154811061119a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d80546111b990614e74565b80601f01602080910402602001604051908101604052809291908181526020018280546111e590614e74565b80156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b6112426121db565b73ffffffffffffffffffffffffffffffffffffffff16611260611596565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906149e2565b60405180910390fd5b8061272490805190602001906112cd9291906135d2565b5050565b6000600c60009054906101000a900460ff16905090565b6000612710905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614922565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614902565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114646121db565b73ffffffffffffffffffffffffffffffffffffffff16611482611596565b73ffffffffffffffffffffffffffffffffffffffff16146114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf906149e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115c76121db565b73ffffffffffffffffffffffffffffffffffffffff166115e5611596565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906149e2565b60405180910390fd5b80600e8190555050565b61164d6121db565b73ffffffffffffffffffffffffffffffffffffffff1661166b611596565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906149e2565b60405180910390fd5b80600f90805190602001906116d79291906135d2565b5050565b6060600280546116ea90614e74565b80601f016020809104026020016040519081016040528092919081815260200182805461171690614e74565b80156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b5050505050905090565b6000600e54905090565b61177f6121db565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490614882565b60405180910390fd5b80600660006117fa6121db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a76121db565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ec9190614745565b60405180910390a35050565b6119096119036121db565b836123a7565b611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614ac2565b60405180910390fd5b611954848484846126e1565b50505050565b60006119646112e8565b8261196d610eb8565b6119779190614c75565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614a82565b60405180910390fd5b60148211156119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390614982565b60405180910390fd5b600e5482611a0a9190614cfc565b9050919050565b60606000611a1d61273d565b90506000611a2a846127d0565b905060006040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152509050600083511415611a7b57819350505050611aa5565b828282604051602001611a9093929190614607565b60405160208183030381529060405293505050505b919050565b6002600b541415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b22565b60405180910390fd5b6002600b81905550600c60009054906101000a900460ff16611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614a22565b60405180910390fd5b6000611b51610eb8565b9050611b5b6112e8565b8282611b679190614c75565b1115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906147c2565b60405180910390fd5b600082600e54611bb89190614cfc565b905080341015611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490614962565b60405180910390fd5b80341115611c58573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611c2b9190614d56565b9081150290604051600060405180830381858888f19350505050158015611c56573d6000803e3d6000fd5b505b611c618361297d565b50506001600b8190555050565b6060600f8054611c7d90614e74565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614e74565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b5050505050905090565b60606000611d0d836113a4565b90506000811415611d9057600067ffffffffffffffff811115611d59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d875781602001602082028036833780820191505090505b50915050611e77565b60008167ffffffffffffffff811115611dd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e005781602001602082028036833780820191505090505b50905060005b82811015611e7057611e188582610f25565b828281518110611e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e6890614ea6565b915050611e06565b5080925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f186121db565b73ffffffffffffffffffffffffffffffffffffffff16611f36611596565b73ffffffffffffffffffffffffffffffffffffffff1614611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906149e2565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b611fc06121db565b73ffffffffffffffffffffffffffffffffffffffff16611fde611596565b73ffffffffffffffffffffffffffffffffffffffff1614612034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202b906149e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b906147e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121d457506121d382612a1b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c2836112f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600581111561234c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612343906149c2565b60405180910390fd5b600061272054905060005b8281101561239957600061236b8483612afd565b90506123778582612b6b565b828061238290614e4a565b93505050808061239190614ea6565b915050612357565b508061272081905550505050565b60006123b2826121e3565b6123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e8906148c2565b60405180910390fd5b60006123fc836112f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246b57508373ffffffffffffffffffffffffffffffffffffffff1661245384610afb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247c575061247b8185611e7c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a5826112f2565b73ffffffffffffffffffffffffffffffffffffffff16146124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614a02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614862565b60405180910390fd5b612576838383612b89565b61258160008261224f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d19190614d56565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126289190614c75565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126ec848484612485565b6126f884848484612b99565b612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906147a2565b60405180910390fd5b50505050565b6060612724805461274d90614e74565b80601f016020809104026020016040519081016040528092919081815260200182805461277990614e74565b80156127c65780601f1061279b576101008083540402835291602001916127c6565b820191906000526020600020905b8154815290600101906020018083116127a957829003601f168201915b5050505050905090565b60606000821415612818576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612978565b600082905060005b6000821461284a57808061283390614ea6565b915050600a826128439190614ccb565b9150612820565b60008167ffffffffffffffff81111561288c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128be5781602001600182028036833780820191505090505b5090505b60008514612971576001826128d79190614d56565b9150600a856128e69190614eef565b60306128f29190614c75565b60f81b81838151811061292e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561296a9190614ccb565b94506128c2565b8093505050505b919050565b60148111156129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614842565b60405180910390fd5b600061272054905060005b82811015612a0e5760006129e08483612afd565b90506129ec3382612b6b565b82806129f790614e4a565b935050508080612a0690614ea6565b9150506129cc565b5080612720819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af65750612af582612d30565b5b9050919050565b600080333a4342600143612b119190614d56565b408888604051602001612b2a97969594939291906146b4565b6040516020818303038152906040528051906020012060001c905060006127205482612b569190614eef565b9050612b6181612d9a565b9250505092915050565b612b85828260405180602001604052806000815250612f05565b5050565b612b94838383612f60565b505050565b6000612bba8473ffffffffffffffffffffffffffffffffffffffff16613074565b15612d23578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612be36121db565b8786866040518563ffffffff1660e01b8152600401612c059493929190614668565b602060405180830381600087803b158015612c1f57600080fd5b505af1925050508015612c5057506040513d601f19601f82011682018060405250810190612c4d919061397e565b60015b612cd3573d8060008114612c80576040519150601f19603f3d011682016040523d82523d6000602084013e612c85565b606091505b50600081511415612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906147a2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d28565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806010836127108110612dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050600080821415612dee57839050612df2565b8190505b6000600161272054612e049190614d56565b9050808514612ee15760006010826127108110612e4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000811415612e9d57816010876127108110612e93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550612edf565b806010876127108110612ed9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b6127206000815480929190612ef590614e4a565b9190505550819350505050919050565b612f0f8383613087565b612f1c6000848484612b99565b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f52906147a2565b60405180910390fd5b505050565b612f6b838383613255565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fae57612fa98161325a565b612fed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fec57612feb83826132a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130305761302b81613410565b61306f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461306e5761306d8282613553565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee90614942565b60405180910390fd5b613100816121e3565b15613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313790614802565b60405180910390fd5b61314c60008383612b89565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461319c9190614c75565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132b0846113a4565b6132ba9190614d56565b905060006008600084815260200190815260200160002054905081811461339f576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506134249190614d56565b90506000600a600084815260200190815260200160002054905060006009838154811061347a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106134c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613537577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061355e836113a4565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546135de90614e74565b90600052602060002090601f0160209004810192826136005760008555613647565b82601f1061361957805160ff1916838001178555613647565b82800160010185558215613647579182015b8281111561364657825182559160200191906001019061362b565b5b5090506136549190613658565b5090565b5b80821115613671576000816000905550600101613659565b5090565b600061368861368384614b8e565b614b5d565b9050828152602081018484840111156136a057600080fd5b6136ab848285614e08565b509392505050565b60006136c66136c184614bbe565b614b5d565b9050828152602081018484840111156136de57600080fd5b6136e9848285614e08565b509392505050565b60008135905061370081614fed565b92915050565b60008135905061371581615004565b92915050565b60008135905061372a8161501b565b92915050565b60008151905061373f8161501b565b92915050565b600082601f83011261375657600080fd5b8135613766848260208601613675565b91505092915050565b600082601f83011261378057600080fd5b81356137908482602086016136b3565b91505092915050565b6000813590506137a881615032565b92915050565b6000602082840312156137c057600080fd5b60006137ce848285016136f1565b91505092915050565b600080604083850312156137ea57600080fd5b60006137f8858286016136f1565b9250506020613809858286016136f1565b9150509250929050565b60008060006060848603121561382857600080fd5b6000613836868287016136f1565b9350506020613847868287016136f1565b925050604061385886828701613799565b9150509250925092565b6000806000806080858703121561387857600080fd5b6000613886878288016136f1565b9450506020613897878288016136f1565b93505060406138a887828801613799565b925050606085013567ffffffffffffffff8111156138c557600080fd5b6138d187828801613745565b91505092959194509250565b600080604083850312156138f057600080fd5b60006138fe858286016136f1565b925050602061390f85828601613706565b9150509250929050565b6000806040838503121561392c57600080fd5b600061393a858286016136f1565b925050602061394b85828601613799565b9150509250929050565b60006020828403121561396757600080fd5b60006139758482850161371b565b91505092915050565b60006020828403121561399057600080fd5b600061399e84828501613730565b91505092915050565b6000602082840312156139b957600080fd5b600082013567ffffffffffffffff8111156139d357600080fd5b6139df8482850161376f565b91505092915050565b6000602082840312156139fa57600080fd5b6000613a0884828501613799565b91505092915050565b6000613a1d83836145e9565b60208301905092915050565b613a3281614d8a565b82525050565b6000613a4382614bfe565b613a4d8185614c2c565b9350613a5883614bee565b8060005b83811015613a89578151613a708882613a11565b9750613a7b83614c1f565b925050600181019050613a5c565b5085935050505092915050565b613a9f81614d9c565b82525050565b613aae81614da8565b82525050565b6000613abf82614c09565b613ac98185614c3d565b9350613ad9818560208601614e17565b613ae281614fdc565b840191505092915050565b6000613af882614c14565b613b028185614c59565b9350613b12818560208601614e17565b613b1b81614fdc565b840191505092915050565b6000613b3182614c14565b613b3b8185614c6a565b9350613b4b818560208601614e17565b80840191505092915050565b6000613b64602b83614c59565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613bca603283614c59565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613c30602383614c59565b91507f526571756972656420616d6f756e74206f6620506f50206973206e6f74206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c96602683614c59565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cfc601c83614c59565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d3c602083614c59565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f7220676966746000830152602082019050919050565b6000613d7c604683614c59565b91507f4d696e74696e67206d6f7265207468616e203230206174206f6e63652c20697360008301527f206e6f7420616c6c6f7765642e20506c6561736520747279206974207061727460208301527f69616c6c792e00000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613e08602483614c59565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e6e601983614c59565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613eae601a83614c59565b91507f54686572652069736e277420616e792070756e6b206c6566742e0000000000006000830152602082019050919050565b6000613eee602c83614c59565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f54603883614c59565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fba602a83614c59565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614020602983614c59565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614086602083614c59565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140c6602983614c59565b91507f4e6f7420656e6f75676820616d6f756e742e20506c65617365206f666665722060008301527f6d6f7265204554482e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061412c602083614c59565b91507f596f752063616e6e6f74206d696e742074686174206d616e792070756e6b732e6000830152602082019050919050565b600061416c602c83614c59565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141d2601983614c59565b91507f47696674696e6720746f6f206d616e79206174206f6e63652e000000000000006000830152602082019050919050565b6000614212602083614c59565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614252602983614c59565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b8601383614c59565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b60006142f8602683614c59565b91507f54686572652069736e277420656e6f7567682070756e6b206c65667420666f7260008301527f20676966742e00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435e602183614c59565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c4602383614c59565b91507f546865726520617265206e6f742074686973206d616e792070756e6b73206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061442a600083614c4e565b9150600082019050919050565b6000614444601083614c59565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000614484603183614c59565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144ea602c83614c59565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614550602283614c59565b91507f5468657265206172656e27742074686973206d616e792070756e6b73206c656660008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145b6601f83614c59565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6145f281614dfe565b82525050565b61460181614dfe565b82525050565b60006146138286613b26565b915061461f8285613b26565b915061462b8284613b26565b9150819050949350505050565b60006146438261441d565b9150819050919050565b60006020820190506146626000830184613a29565b92915050565b600060808201905061467d6000830187613a29565b61468a6020830186613a29565b61469760408301856145f8565b81810360608301526146a98184613ab4565b905095945050505050565b600060e0820190506146c9600083018a613a29565b6146d660208301896145f8565b6146e360408301886145f8565b6146f060608301876145f8565b6146fd6080830186613aa5565b61470a60a08301856145f8565b61471760c08301846145f8565b98975050505050505050565b6000602082019050818103600083015261473d8184613a38565b905092915050565b600060208201905061475a6000830184613a96565b92915050565b6000602082019050818103600083015261477a8184613aed565b905092915050565b6000602082019050818103600083015261479b81613b57565b9050919050565b600060208201905081810360008301526147bb81613bbd565b9050919050565b600060208201905081810360008301526147db81613c23565b9050919050565b600060208201905081810360008301526147fb81613c89565b9050919050565b6000602082019050818103600083015261481b81613cef565b9050919050565b6000602082019050818103600083015261483b81613d2f565b9050919050565b6000602082019050818103600083015261485b81613d6f565b9050919050565b6000602082019050818103600083015261487b81613dfb565b9050919050565b6000602082019050818103600083015261489b81613e61565b9050919050565b600060208201905081810360008301526148bb81613ea1565b9050919050565b600060208201905081810360008301526148db81613ee1565b9050919050565b600060208201905081810360008301526148fb81613f47565b9050919050565b6000602082019050818103600083015261491b81613fad565b9050919050565b6000602082019050818103600083015261493b81614013565b9050919050565b6000602082019050818103600083015261495b81614079565b9050919050565b6000602082019050818103600083015261497b816140b9565b9050919050565b6000602082019050818103600083015261499b8161411f565b9050919050565b600060208201905081810360008301526149bb8161415f565b9050919050565b600060208201905081810360008301526149db816141c5565b9050919050565b600060208201905081810360008301526149fb81614205565b9050919050565b60006020820190508181036000830152614a1b81614245565b9050919050565b60006020820190508181036000830152614a3b816142ab565b9050919050565b60006020820190508181036000830152614a5b816142eb565b9050919050565b60006020820190508181036000830152614a7b81614351565b9050919050565b60006020820190508181036000830152614a9b816143b7565b9050919050565b60006020820190508181036000830152614abb81614437565b9050919050565b60006020820190508181036000830152614adb81614477565b9050919050565b60006020820190508181036000830152614afb816144dd565b9050919050565b60006020820190508181036000830152614b1b81614543565b9050919050565b60006020820190508181036000830152614b3b816145a9565b9050919050565b6000602082019050614b5760008301846145f8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b8457614b83614fad565b5b8060405250919050565b600067ffffffffffffffff821115614ba957614ba8614fad565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bd957614bd8614fad565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c8082614dfe565b9150614c8b83614dfe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc057614cbf614f20565b5b828201905092915050565b6000614cd682614dfe565b9150614ce183614dfe565b925082614cf157614cf0614f4f565b5b828204905092915050565b6000614d0782614dfe565b9150614d1283614dfe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d4b57614d4a614f20565b5b828202905092915050565b6000614d6182614dfe565b9150614d6c83614dfe565b925082821015614d7f57614d7e614f20565b5b828203905092915050565b6000614d9582614dde565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e35578082015181840152602081019050614e1a565b83811115614e44576000848401525b50505050565b6000614e5582614dfe565b91506000821415614e6957614e68614f20565b5b600182039050919050565b60006002820490506001821680614e8c57607f821691505b60208210811415614ea057614e9f614f7e565b5b50919050565b6000614eb182614dfe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ee457614ee3614f20565b5b600182019050919050565b6000614efa82614dfe565b9150614f0583614dfe565b925082614f1557614f14614f4f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ff681614d8a565b811461500157600080fd5b50565b61500d81614d9c565b811461501857600080fd5b50565b61502481614db2565b811461502f57600080fd5b50565b61503b81614dfe565b811461504657600080fd5b5056fea2646970667358221220e01ff7d6b6fec0d6bd2c87f13d5d8baa72456c4e826fa7733c320b2e3a22772064736f6c63430008000033

Deployed Bytecode Sourcemap

45923:7790:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53517:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53041:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46169:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52504:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46286:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27946:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29406:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28943:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51733:765;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40317:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30296:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39985:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53149:161;;;;;;;;;;;;;:::i;:::-;;30672:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40507:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46141:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52815:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49974:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46627:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27640:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27370:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19311:148;;;;;;;;;;;;;:::i;:::-;;18660:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52919:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28115:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50065:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29699:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30894:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50245:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51253:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46721:559;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50146:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50616:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30065:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52710:88;;;;;;;;;;;;;:::i;:::-;;19614:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53517:193;53645:4;53668:36;53692:11;53668:23;:36::i;:::-;53661:43;;53517:193;;;:::o;53041:102::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53127:10:::1;53115:9;:22;;;;;;;;;;;;:::i;:::-;;53041:102:::0;:::o;46169:45::-;46212:2;46169:45;:::o;52504:107::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52592:13:::1;52575:14;:30;;;;52504:107:::0;:::o;46286:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27946:100::-;28000:13;28033:5;28026:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27946:100;:::o;29406:221::-;29482:7;29510:16;29518:7;29510;:16::i;:::-;29502:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29595:15;:24;29611:7;29595:24;;;;;;;;;;;;;;;;;;;;;29588:31;;29406:221;;;:::o;28943:397::-;29024:13;29040:23;29055:7;29040:14;:23::i;:::-;29024:39;;29088:5;29082:11;;:2;:11;;;;29074:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29168:5;29152:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29177:37;29194:5;29201:12;:10;:12::i;:::-;29177:16;:37::i;:::-;29152:62;29144:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29311:21;29320:2;29324:7;29311:8;:21::i;:::-;28943:397;;;:::o;51733:765::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51813:24:::1;51840:11;51813:38;;51858:21;51899:11;51882:14;;:28;;;;:::i;:::-;51858:52;;51917:22;51960:13;:11;:13::i;:::-;51942:15;:13;:15::i;:::-;:31;;;;:::i;:::-;51917:56;;52007:1;51988:16;:20;:57;;;;;52032:13;52012:16;:33;;51988:57;51980:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;52133:15;:13;:15::i;:::-;52113:16;52097:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:51;;52089:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52219:1;52202:14;:18;52194:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52286:14;52266:16;:34;;52258:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52384:16;52367:14;;:33;;;;:::i;:::-;52350:14;:50;;;;52437:16;52422:12;;:31;;;;:::i;:::-;52407:12;:46;;;;52460:32;52470:3;52475:16;52460:9;:32::i;:::-;18951:1;;;51733:765:::0;;:::o;40317:113::-;40378:7;40405:10;:17;;;;40398:24;;40317:113;:::o;30296:305::-;30457:41;30476:12;:10;:12::i;:::-;30490:7;30457:18;:41::i;:::-;30449:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30565:28;30575:4;30581:2;30585:7;30565:9;:28::i;:::-;30296:305;;;:::o;39985:256::-;40082:7;40118:23;40135:5;40118:16;:23::i;:::-;40110:5;:31;40102:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40207:12;:19;40220:5;40207:19;;;;;;;;;;;;;;;:26;40227:5;40207:26;;;;;;;;;;;;40200:33;;39985:256;;;;:::o;53149:161::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53194:12:::1;53212:10;:15;;53235:21;53212:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53193:68;;;53276:7;53268:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;18951:1;53149:161::o:0;30672:151::-;30776:39;30793:4;30799:2;30803:7;30776:39;;;;;;;;;;;;:16;:39::i;:::-;30672:151;;;:::o;40507:233::-;40582:7;40618:30;:28;:30::i;:::-;40610:5;:38;40602:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40715:10;40726:5;40715:17;;;;;;;;;;;;;;;;;;;;;;;;40708:24;;40507:233;;;:::o;46141:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52815:98::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52900:7:::1;52884:13;:23;;;;;;;;;;;;:::i;:::-;;52815:98:::0;:::o;49974:85::-;50019:4;50040:13;;;;;;;;;;;50033:20;;49974:85;:::o;46627:88::-;46681:7;46704:5;46697:12;;46627:88;:::o;27640:239::-;27712:7;27732:13;27748:7;:16;27756:7;27748:16;;;;;;;;;;;;;;;;;;;;;27732:32;;27800:1;27783:19;;:5;:19;;;;27775:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27866:5;27859:12;;;27640:239;;;:::o;27370:208::-;27442:7;27487:1;27470:19;;:5;:19;;;;27462:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27554:9;:16;27564:5;27554:16;;;;;;;;;;;;;;;;27547:23;;27370:208;;;:::o;19311:148::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19418:1:::1;19381:40;;19402:6;::::0;::::1;;;;;;;;19381:40;;;;;;;;;;;;19449:1;19432:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;19311:148::o:0;18660:87::-;18706:7;18733:6;;;;;;;;;;;18726:13;;18660:87;:::o;52617:::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52689:9:::1;52680:6;:18;;;;52617:87:::0;:::o;52919:114::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53015:12:::1;52997:15;:30;;;;;;;;;;;;:::i;:::-;;52919:114:::0;:::o;28115:104::-;28171:13;28204:7;28197:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28115:104;:::o;50065:75::-;50106:7;50128:6;;50121:13;;50065:75;:::o;29699:295::-;29814:12;:10;:12::i;:::-;29802:24;;:8;:24;;;;29794:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29914:8;29869:18;:32;29888:12;:10;:12::i;:::-;29869:32;;;;;;;;;;;;;;;:42;29902:8;29869:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29967:8;29938:48;;29953:12;:10;:12::i;:::-;29938:48;;;29977:8;29938:48;;;;;;:::i;:::-;;;;;;;;29699:295;;:::o;30894:285::-;31026:41;31045:12;:10;:12::i;:::-;31059:7;31026:18;:41::i;:::-;31018:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31132:39;31146:4;31152:2;31156:7;31165:5;31132:13;:39::i;:::-;30894:285;;;;:::o;50245:365::-;50333:7;50398:15;:13;:15::i;:::-;50384:10;50368:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:45;;50352:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;46212:2;50489:10;:30;;50473:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;50596:6;;50583:10;:19;;;;:::i;:::-;50576:26;;50245:365;;;:::o;51253:434::-;51339:13;51364:18;51385:10;:8;:10::i;:::-;51364:31;;51402:23;51428:26;51445:8;51428:16;:26::i;:::-;51402:52;;51461:20;:30;;;;;;;;;;;;;;;;;;;51581:1;51565:4;51559:18;:23;51555:62;;;51600:9;51593:16;;;;;;;51555:62;51656:4;51662:9;51673:6;51639:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51625:56;;;;;51253:434;;;;:::o;46721:559::-;21543:1;22140:7;;:19;;22132:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21543:1;22273:7;:18;;;;46803:13:::1;;;;;;;;;;;46795:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;46847:19;46869:13;:11;:13::i;:::-;46847:35;;46925:15;:13;:15::i;:::-;46911:10;46897:11;:24;;;;:::i;:::-;:43;;46889:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;46987:27;47026:10;47017:6;;:19;;;;:::i;:::-;46987:49;;47064:19;47051:9;:32;;47043:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;47152:19;47140:9;:31;47136:115;;;47190:10;47182:28;;:61;47223:19;47211:9;:31;;;;:::i;:::-;47182:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47136:115;47257:17;47263:10;47257:5;:17::i;:::-;22304:1;;21499::::0;22452:7;:22;;;;46721:559;:::o;50146:93::-;50190:13;50218:15;50211:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50146:93;:::o;50616:427::-;50704:16;50732;50751:17;50761:6;50751:9;:17::i;:::-;50732:36;;50791:1;50779:8;:13;50775:263;;;50824:1;50810:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50803:23;;;;;50775:263;50849:23;50889:8;50875:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50849:49;;50912:9;50907:102;50931:8;50927:1;:12;50907:102;;;50969:30;50989:6;50997:1;50969:19;:30::i;:::-;50957:6;50964:1;50957:9;;;;;;;;;;;;;;;;;;;;;:42;;;;;50941:3;;;;;:::i;:::-;;;;50907:102;;;;51024:6;51017:13;;;;50616:427;;;;:::o;30065:164::-;30162:4;30186:18;:25;30205:5;30186:25;;;;;;;;;;;;;;;:35;30212:8;30186:35;;;;;;;;;;;;;;;;;;;;;;;;;30179:42;;30065:164;;;;:::o;52710:88::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52779:13:::1;;;;;;;;;;;52778:14;52762:13;;:30;;;;;;;;;;;;;;;;;;52710:88::o:0;19614:244::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19723:1:::1;19703:22;;:8;:22;;;;19695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19813:8;19784:38;;19805:6;::::0;::::1;;;;;;;;19784:38;;;;;;;;;;;;19842:8;19833:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;19614:244:::0;:::o;39664:237::-;39766:4;39805:35;39790:50;;;:11;:50;;;;:103;;;;39857:36;39881:11;39857:23;:36::i;:::-;39790:103;39783:110;;39664:237;;;:::o;601:98::-;654:7;681:10;674:17;;601:98;:::o;32646:127::-;32711:4;32763:1;32735:30;;:7;:16;32743:7;32735:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32728:37;;32646:127;;;:::o;36523:174::-;36625:2;36598:15;:24;36614:7;36598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36681:7;36677:2;36643:46;;36652:23;36667:7;36652:14;:23::i;:::-;36643:46;;;;;;;;;;;;36523:174;;:::o;47848:413::-;47938:1;47924:10;:15;;47916:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47976:27;48006:16;;47976:46;;48034:9;48029:182;48053:10;48049:1;:14;48029:182;;;48079:18;48100:38;48124:10;48136:1;48100:23;:38::i;:::-;48079:59;;48147:26;48157:3;48162:10;48147:9;:26::i;:::-;48182:21;;;;;:::i;:::-;;;;48029:182;48065:3;;;;;:::i;:::-;;;;48029:182;;;;48236:19;48217:16;:38;;;;47848:413;;;:::o;32940:348::-;33033:4;33058:16;33066:7;33058;:16::i;:::-;33050:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33134:13;33150:23;33165:7;33150:14;:23::i;:::-;33134:39;;33203:5;33192:16;;:7;:16;;;:51;;;;33236:7;33212:31;;:20;33224:7;33212:11;:20::i;:::-;:31;;;33192:51;:87;;;;33247:32;33264:5;33271:7;33247:16;:32::i;:::-;33192:87;33184:96;;;32940:348;;;;:::o;35861:544::-;35986:4;35959:31;;:23;35974:7;35959:14;:23::i;:::-;:31;;;35951:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:1;36055:16;;:2;:16;;;;36047:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36125:39;36146:4;36152:2;36156:7;36125:20;:39::i;:::-;36229:29;36246:1;36250:7;36229:8;:29::i;:::-;36290:1;36271:9;:15;36281:4;36271:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36319:1;36302:9;:13;36312:2;36302:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36350:2;36331:7;:16;36339:7;36331:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36389:7;36385:2;36370:27;;36379:4;36370:27;;;;;;;;;;;;35861:544;;;:::o;32061:272::-;32175:28;32185:4;32191:2;32195:7;32175:9;:28::i;:::-;32222:48;32245:4;32251:2;32255:7;32264:5;32222:22;:48::i;:::-;32214:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:272;;;;:::o;51139:108::-;51199:13;51228;51221:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51139:108;:::o;23995:723::-;24051:13;24281:1;24272:5;:10;24268:53;;;24299:10;;;;;;;;;;;;;;;;;;;;;24268:53;24331:12;24346:5;24331:20;;24362:14;24387:78;24402:1;24394:4;:9;24387:78;;24420:8;;;;;:::i;:::-;;;;24451:2;24443:10;;;;;:::i;:::-;;;24387:78;;;24475:19;24507:6;24497:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24475:39;;24525:154;24541:1;24532:5;:10;24525:154;;24569:1;24559:11;;;;;:::i;:::-;;;24636:2;24628:5;:10;;;;:::i;:::-;24615:2;:24;;;;:::i;:::-;24602:39;;24585:6;24592;24585:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24665:2;24656:11;;;;;:::i;:::-;;;24525:154;;;24703:6;24689:21;;;;;23995:723;;;;:::o;47318:492::-;46212:2;47377:10;:30;;47369:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47491:27;47521:16;;47491:46;;47576:9;47571:189;47595:10;47591:1;:14;47571:189;;;47621:18;47642:38;47666:10;47678:1;47642:23;:38::i;:::-;47621:59;;47689:33;47699:10;47711;47689:9;:33::i;:::-;47731:21;;;;;:::i;:::-;;;;47571:189;47607:3;;;;;:::i;:::-;;;;47571:189;;;;47785:19;47766:16;:38;;;;47318:492;;:::o;27014:292::-;27116:4;27155:25;27140:40;;;:11;:40;;;;:105;;;;27212:33;27197:48;;;:11;:48;;;;27140:105;:158;;;;27262:36;27286:11;27262:23;:36::i;:::-;27140:158;27133:165;;27014:292;;;:::o;48269:530::-;48363:7;48382:17;48474:10;48499:11;48525:12;48552:15;48607:1;48592:12;:16;;;;:::i;:::-;48582:27;48624:11;48650:2;48449:216;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48427:249;;;;;;48409:276;;48382:303;;48692:19;48726:16;;48714:9;:28;;;;:::i;:::-;48692:50;;48756:37;48781:11;48756:24;:37::i;:::-;48749:44;;;;48269:530;;;;:::o;33630:110::-;33706:26;33716:2;33720:7;33706:26;;;;;;;;;;;;:9;:26::i;:::-;33630:110;;:::o;53316:195::-;53460:45;53487:4;53493:2;53497:7;53460:26;:45::i;:::-;53316:195;;;:::o;37262:843::-;37383:4;37409:15;:2;:13;;;:15::i;:::-;37405:693;;;37461:2;37445:36;;;37482:12;:10;:12::i;:::-;37496:4;37502:7;37511:5;37445:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37441:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:1;37691:6;:13;:18;37687:341;;;37734:60;;;;;;;;;;:::i;:::-;;;;;;;;37687:341;37978:6;37972:13;37963:6;37959:2;37955:15;37948:38;37441:602;37578:45;;;37568:55;;;:6;:55;;;;37561:62;;;;;37405:693;38082:4;38075:11;;37262:843;;;;;;;:::o;9492:157::-;9577:4;9616:25;9601:40;;;:11;:40;;;;9594:47;;9492:157;;;:::o;48805:1161::-;48887:7;48906:18;48927:14;48942:10;48927:26;;;;;;;;;;;;;;;;;48906:47;;48960:14;48999:1;48985:10;:15;48981:260;;;49086:10;49077:19;;48981:260;;;49223:10;49214:19;;48981:260;49249:17;49288:1;49269:16;;:20;;;;:::i;:::-;49249:40;;49314:9;49300:10;:23;49296:618;;49529:22;49554:14;49569:9;49554:25;;;;;;;;;;;;;;;;;49529:50;;49610:1;49592:14;:19;49588:319;;;49721:9;49692:14;49707:10;49692:26;;;;;;;;;;;;;;;;:38;;;;49588:319;;;49883:14;49854;49869:10;49854:26;;;;;;;;;;;;;;;;:43;;;;49588:319;49296:618;;49922:16;;:18;;;;;;;;;:::i;:::-;;;;;;49954:6;49947:13;;;;;48805:1161;;;:::o;33967:250::-;34063:18;34069:2;34073:7;34063:5;:18::i;:::-;34100:54;34131:1;34135:2;34139:7;34148:5;34100:22;:54::i;:::-;34092:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;33967:250;;;:::o;41353:555::-;41463:45;41490:4;41496:2;41500:7;41463:26;:45::i;:::-;41541:1;41525:18;;:4;:18;;;41521:187;;;41560:40;41592:7;41560:31;:40::i;:::-;41521:187;;;41630:2;41622:10;;:4;:10;;;41618:90;;41649:47;41682:4;41688:7;41649:32;:47::i;:::-;41618:90;41521:187;41736:1;41722:16;;:2;:16;;;41718:183;;;41755:45;41792:7;41755:36;:45::i;:::-;41718:183;;;41828:4;41822:10;;:2;:10;;;41818:83;;41849:40;41877:2;41881:7;41849:27;:40::i;:::-;41818:83;41718:183;41353:555;;;:::o;10364:422::-;10424:4;10632:12;10743:7;10731:20;10723:28;;10777:1;10770:4;:8;10763:15;;;10364:422;;;:::o;34553:382::-;34647:1;34633:16;;:2;:16;;;;34625:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34706:16;34714:7;34706;:16::i;:::-;34705:17;34697:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34768:45;34797:1;34801:2;34805:7;34768:20;:45::i;:::-;34843:1;34826:9;:13;34836:2;34826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34874:2;34855:7;:16;34863:7;34855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34919:7;34915:2;34894:33;;34911:1;34894:33;;;;;;;;;;;;34553:382;;:::o;38716:93::-;;;;:::o;42631:164::-;42735:10;:17;;;;42708:15;:24;42724:7;42708:24;;;;;;;;;;;:44;;;;42763:10;42779:7;42763:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42631:164;:::o;43422:988::-;43688:22;43738:1;43713:22;43730:4;43713:16;:22::i;:::-;:26;;;;:::i;:::-;43688:51;;43750:18;43771:17;:26;43789:7;43771:26;;;;;;;;;;;;43750:47;;43918:14;43904:10;:28;43900:328;;43949:19;43971:12;:18;43984:4;43971:18;;;;;;;;;;;;;;;:34;43990:14;43971:34;;;;;;;;;;;;43949:56;;44055:11;44022:12;:18;44035:4;44022:18;;;;;;;;;;;;;;;:30;44041:10;44022:30;;;;;;;;;;;:44;;;;44172:10;44139:17;:30;44157:11;44139:30;;;;;;;;;;;:43;;;;43900:328;;44324:17;:26;44342:7;44324:26;;;;;;;;;;;44317:33;;;44368:12;:18;44381:4;44368:18;;;;;;;;;;;;;;;:34;44387:14;44368:34;;;;;;;;;;;44361:41;;;43422:988;;;;:::o;44705:1079::-;44958:22;45003:1;44983:10;:17;;;;:21;;;;:::i;:::-;44958:46;;45015:18;45036:15;:24;45052:7;45036:24;;;;;;;;;;;;45015:45;;45387:19;45409:10;45420:14;45409:26;;;;;;;;;;;;;;;;;;;;;;;;45387:48;;45473:11;45448:10;45459;45448:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45584:10;45553:15;:28;45569:11;45553:28;;;;;;;;;;;:41;;;;45725:15;:24;45741:7;45725:24;;;;;;;;;;;45718:31;;;45760:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44705:1079;;;;:::o;42209:221::-;42294:14;42311:20;42328:2;42311:16;:20::i;:::-;42294:37;;42369:7;42342:12;:16;42355:2;42342:16;;;;;;;;;;;;;;;:24;42359:6;42342:24;;;;;;;;;;;:34;;;;42416:6;42387:17;:26;42405:7;42387:26;;;;;;;;;;;:35;;;;42209:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:179::-;;6174:46;6216:3;6208:6;6174:46;:::i;:::-;6252:4;6247:3;6243:14;6229:28;;6164:99;;;;:::o;6269:118::-;6356:24;6374:5;6356:24;:::i;:::-;6351:3;6344:37;6334:53;;:::o;6423:732::-;;6571:54;6619:5;6571:54;:::i;:::-;6641:86;6720:6;6715:3;6641:86;:::i;:::-;6634:93;;6751:56;6801:5;6751:56;:::i;:::-;6830:7;6861:1;6846:284;6871:6;6868:1;6865:13;6846:284;;;6947:6;6941:13;6974:63;7033:3;7018:13;6974:63;:::i;:::-;6967:70;;7060:60;7113:6;7060:60;:::i;:::-;7050:70;;6906:224;6893:1;6890;6886:9;6881:14;;6846:284;;;6850:14;7146:3;7139:10;;6547:608;;;;;;;:::o;7161:109::-;7242:21;7257:5;7242:21;:::i;:::-;7237:3;7230:34;7220:50;;:::o;7276:118::-;7363:24;7381:5;7363:24;:::i;:::-;7358:3;7351:37;7341:53;;:::o;7400:360::-;;7514:38;7546:5;7514:38;:::i;:::-;7568:70;7631:6;7626:3;7568:70;:::i;:::-;7561:77;;7647:52;7692:6;7687:3;7680:4;7673:5;7669:16;7647:52;:::i;:::-;7724:29;7746:6;7724:29;:::i;:::-;7719:3;7715:39;7708:46;;7490:270;;;;;:::o;7766:364::-;;7882:39;7915:5;7882:39;:::i;:::-;7937:71;8001:6;7996:3;7937:71;:::i;:::-;7930:78;;8017:52;8062:6;8057:3;8050:4;8043:5;8039:16;8017:52;:::i;:::-;8094:29;8116:6;8094:29;:::i;:::-;8089:3;8085:39;8078:46;;7858:272;;;;;:::o;8136:377::-;;8270:39;8303:5;8270:39;:::i;:::-;8325:89;8407:6;8402:3;8325:89;:::i;:::-;8318:96;;8423:52;8468:6;8463:3;8456:4;8449:5;8445:16;8423:52;:::i;:::-;8500:6;8495:3;8491:16;8484:23;;8246:267;;;;;:::o;8519:375::-;;8682:67;8746:2;8741:3;8682:67;:::i;:::-;8675:74;;8779:34;8775:1;8770:3;8766:11;8759:55;8845:13;8840:2;8835:3;8831:12;8824:35;8885:2;8880:3;8876:12;8869:19;;8665:229;;;:::o;8900:382::-;;9063:67;9127:2;9122:3;9063:67;:::i;:::-;9056:74;;9160:34;9156:1;9151:3;9147:11;9140:55;9226:20;9221:2;9216:3;9212:12;9205:42;9273:2;9268:3;9264:12;9257:19;;9046:236;;;:::o;9288:367::-;;9451:67;9515:2;9510:3;9451:67;:::i;:::-;9444:74;;9548:34;9544:1;9539:3;9535:11;9528:55;9614:5;9609:2;9604:3;9600:12;9593:27;9646:2;9641:3;9637:12;9630:19;;9434:221;;;:::o;9661:370::-;;9824:67;9888:2;9883:3;9824:67;:::i;:::-;9817:74;;9921:34;9917:1;9912:3;9908:11;9901:55;9987:8;9982:2;9977:3;9973:12;9966:30;10022:2;10017:3;10013:12;10006:19;;9807:224;;;:::o;10037:326::-;;10200:67;10264:2;10259:3;10200:67;:::i;:::-;10193:74;;10297:30;10293:1;10288:3;10284:11;10277:51;10354:2;10349:3;10345:12;10338:19;;10183:180;;;:::o;10369:330::-;;10532:67;10596:2;10591:3;10532:67;:::i;:::-;10525:74;;10629:34;10625:1;10620:3;10616:11;10609:55;10690:2;10685:3;10681:12;10674:19;;10515:184;;;:::o;10705:436::-;;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10965:34;10961:1;10956:3;10952:11;10945:55;11031:34;11026:2;11021:3;11017:12;11010:56;11097:8;11092:2;11087:3;11083:12;11076:30;11132:2;11127:3;11123:12;11116:19;;10851:290;;;:::o;11147:368::-;;11310:67;11374:2;11369:3;11310:67;:::i;:::-;11303:74;;11407:34;11403:1;11398:3;11394:11;11387:55;11473:6;11468:2;11463:3;11459:12;11452:28;11506:2;11501:3;11497:12;11490:19;;11293:222;;;:::o;11521:323::-;;11684:67;11748:2;11743:3;11684:67;:::i;:::-;11677:74;;11781:27;11777:1;11772:3;11768:11;11761:48;11835:2;11830:3;11826:12;11819:19;;11667:177;;;:::o;11850:324::-;;12013:67;12077:2;12072:3;12013:67;:::i;:::-;12006:74;;12110:28;12106:1;12101:3;12097:11;12090:49;12165:2;12160:3;12156:12;12149:19;;11996:178;;;:::o;12180:376::-;;12343:67;12407:2;12402:3;12343:67;:::i;:::-;12336:74;;12440:34;12436:1;12431:3;12427:11;12420:55;12506:14;12501:2;12496:3;12492:12;12485:36;12547:2;12542:3;12538:12;12531:19;;12326:230;;;:::o;12562:388::-;;12725:67;12789:2;12784:3;12725:67;:::i;:::-;12718:74;;12822:34;12818:1;12813:3;12809:11;12802:55;12888:26;12883:2;12878:3;12874:12;12867:48;12941:2;12936:3;12932:12;12925:19;;12708:242;;;:::o;12956:374::-;;13119:67;13183:2;13178:3;13119:67;:::i;:::-;13112:74;;13216:34;13212:1;13207:3;13203:11;13196:55;13282:12;13277:2;13272:3;13268:12;13261:34;13321:2;13316:3;13312:12;13305:19;;13102:228;;;:::o;13336:373::-;;13499:67;13563:2;13558:3;13499:67;:::i;:::-;13492:74;;13596:34;13592:1;13587:3;13583:11;13576:55;13662:11;13657:2;13652:3;13648:12;13641:33;13700:2;13695:3;13691:12;13684:19;;13482:227;;;:::o;13715:330::-;;13878:67;13942:2;13937:3;13878:67;:::i;:::-;13871:74;;13975:34;13971:1;13966:3;13962:11;13955:55;14036:2;14031:3;14027:12;14020:19;;13861:184;;;:::o;14051:373::-;;14214:67;14278:2;14273:3;14214:67;:::i;:::-;14207:74;;14311:34;14307:1;14302:3;14298:11;14291:55;14377:11;14372:2;14367:3;14363:12;14356:33;14415:2;14410:3;14406:12;14399:19;;14197:227;;;:::o;14430:330::-;;14593:67;14657:2;14652:3;14593:67;:::i;:::-;14586:74;;14690:34;14686:1;14681:3;14677:11;14670:55;14751:2;14746:3;14742:12;14735:19;;14576:184;;;:::o;14766:376::-;;14929:67;14993:2;14988:3;14929:67;:::i;:::-;14922:74;;15026:34;15022:1;15017:3;15013:11;15006:55;15092:14;15087:2;15082:3;15078:12;15071:36;15133:2;15128:3;15124:12;15117:19;;14912:230;;;:::o;15148:323::-;;15311:67;15375:2;15370:3;15311:67;:::i;:::-;15304:74;;15408:27;15404:1;15399:3;15395:11;15388:48;15462:2;15457:3;15453:12;15446:19;;15294:177;;;:::o;15477:330::-;;15640:67;15704:2;15699:3;15640:67;:::i;:::-;15633:74;;15737:34;15733:1;15728:3;15724:11;15717:55;15798:2;15793:3;15789:12;15782:19;;15623:184;;;:::o;15813:373::-;;15976:67;16040:2;16035:3;15976:67;:::i;:::-;15969:74;;16073:34;16069:1;16064:3;16060:11;16053:55;16139:11;16134:2;16129:3;16125:12;16118:33;16177:2;16172:3;16168:12;16161:19;;15959:227;;;:::o;16192:317::-;;16355:67;16419:2;16414:3;16355:67;:::i;:::-;16348:74;;16452:21;16448:1;16443:3;16439:11;16432:42;16500:2;16495:3;16491:12;16484:19;;16338:171;;;:::o;16515:370::-;;16678:67;16742:2;16737:3;16678:67;:::i;:::-;16671:74;;16775:34;16771:1;16766:3;16762:11;16755:55;16841:8;16836:2;16831:3;16827:12;16820:30;16876:2;16871:3;16867:12;16860:19;;16661:224;;;:::o;16891:365::-;;17054:67;17118:2;17113:3;17054:67;:::i;:::-;17047:74;;17151:34;17147:1;17142:3;17138:11;17131:55;17217:3;17212:2;17207:3;17203:12;17196:25;17247:2;17242:3;17238:12;17231:19;;17037:219;;;:::o;17262:367::-;;17425:67;17489:2;17484:3;17425:67;:::i;:::-;17418:74;;17522:34;17518:1;17513:3;17509:11;17502:55;17588:5;17583:2;17578:3;17574:12;17567:27;17620:2;17615:3;17611:12;17604:19;;17408:221;;;:::o;17635:297::-;;17815:83;17896:1;17891:3;17815:83;:::i;:::-;17808:90;;17924:1;17919:3;17915:11;17908:18;;17798:134;;;:::o;17938:314::-;;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18198:18;18194:1;18189:3;18185:11;18178:39;18243:2;18238:3;18234:12;18227:19;;18084:168;;;:::o;18258:381::-;;18421:67;18485:2;18480:3;18421:67;:::i;:::-;18414:74;;18518:34;18514:1;18509:3;18505:11;18498:55;18584:19;18579:2;18574:3;18570:12;18563:41;18630:2;18625:3;18621:12;18614:19;;18404:235;;;:::o;18645:376::-;;18808:67;18872:2;18867:3;18808:67;:::i;:::-;18801:74;;18905:34;18901:1;18896:3;18892:11;18885:55;18971:14;18966:2;18961:3;18957:12;18950:36;19012:2;19007:3;19003:12;18996:19;;18791:230;;;:::o;19027:366::-;;19190:67;19254:2;19249:3;19190:67;:::i;:::-;19183:74;;19287:34;19283:1;19278:3;19274:11;19267:55;19353:4;19348:2;19343:3;19339:12;19332:26;19384:2;19379:3;19375:12;19368:19;;19173:220;;;:::o;19399:329::-;;19562:67;19626:2;19621:3;19562:67;:::i;:::-;19555:74;;19659:33;19655:1;19650:3;19646:11;19639:54;19719:2;19714:3;19710:12;19703:19;;19545:183;;;:::o;19734:108::-;19811:24;19829:5;19811:24;:::i;:::-;19806:3;19799:37;19789:53;;:::o;19848:118::-;19935:24;19953:5;19935:24;:::i;:::-;19930:3;19923:37;19913:53;;:::o;19972:595::-;;20222:95;20313:3;20304:6;20222:95;:::i;:::-;20215:102;;20334:95;20425:3;20416:6;20334:95;:::i;:::-;20327:102;;20446:95;20537:3;20528:6;20446:95;:::i;:::-;20439:102;;20558:3;20551:10;;20204:363;;;;;;:::o;20573:379::-;;20779:147;20922:3;20779:147;:::i;:::-;20772:154;;20943:3;20936:10;;20761:191;;;:::o;20958:222::-;;21089:2;21078:9;21074:18;21066:26;;21102:71;21170:1;21159:9;21155:17;21146:6;21102:71;:::i;:::-;21056:124;;;;:::o;21186:640::-;;21419:3;21408:9;21404:19;21396:27;;21433:71;21501:1;21490:9;21486:17;21477:6;21433:71;:::i;:::-;21514:72;21582:2;21571:9;21567:18;21558:6;21514:72;:::i;:::-;21596;21664:2;21653:9;21649:18;21640:6;21596:72;:::i;:::-;21715:9;21709:4;21705:20;21700:2;21689:9;21685:18;21678:48;21743:76;21814:4;21805:6;21743:76;:::i;:::-;21735:84;;21386:440;;;;;;;:::o;21832:886::-;;22131:3;22120:9;22116:19;22108:27;;22145:71;22213:1;22202:9;22198:17;22189:6;22145:71;:::i;:::-;22226:72;22294:2;22283:9;22279:18;22270:6;22226:72;:::i;:::-;22308;22376:2;22365:9;22361:18;22352:6;22308:72;:::i;:::-;22390;22458:2;22447:9;22443:18;22434:6;22390:72;:::i;:::-;22472:73;22540:3;22529:9;22525:19;22516:6;22472:73;:::i;:::-;22555;22623:3;22612:9;22608:19;22599:6;22555:73;:::i;:::-;22638;22706:3;22695:9;22691:19;22682:6;22638:73;:::i;:::-;22098:620;;;;;;;;;;:::o;22724:373::-;;22905:2;22894:9;22890:18;22882:26;;22954:9;22948:4;22944:20;22940:1;22929:9;22925:17;22918:47;22982:108;23085:4;23076:6;22982:108;:::i;:::-;22974:116;;22872:225;;;;:::o;23103:210::-;;23228:2;23217:9;23213:18;23205:26;;23241:65;23303:1;23292:9;23288:17;23279:6;23241:65;:::i;:::-;23195:118;;;;:::o;23319:313::-;;23470:2;23459:9;23455:18;23447:26;;23519:9;23513:4;23509:20;23505:1;23494:9;23490:17;23483:47;23547:78;23620:4;23611:6;23547:78;:::i;:::-;23539:86;;23437:195;;;;:::o;23638:419::-;;23842:2;23831:9;23827:18;23819:26;;23891:9;23885:4;23881:20;23877:1;23866:9;23862:17;23855:47;23919:131;24045:4;23919:131;:::i;:::-;23911:139;;23809:248;;;:::o;24063:419::-;;24267:2;24256:9;24252:18;24244:26;;24316:9;24310:4;24306:20;24302:1;24291:9;24287:17;24280:47;24344:131;24470:4;24344:131;:::i;:::-;24336:139;;24234:248;;;:::o;24488:419::-;;24692:2;24681:9;24677:18;24669:26;;24741:9;24735:4;24731:20;24727:1;24716:9;24712:17;24705:47;24769:131;24895:4;24769:131;:::i;:::-;24761:139;;24659:248;;;:::o;24913:419::-;;25117:2;25106:9;25102:18;25094:26;;25166:9;25160:4;25156:20;25152:1;25141:9;25137:17;25130:47;25194:131;25320:4;25194:131;:::i;:::-;25186:139;;25084:248;;;:::o;25338:419::-;;25542:2;25531:9;25527:18;25519:26;;25591:9;25585:4;25581:20;25577:1;25566:9;25562:17;25555:47;25619:131;25745:4;25619:131;:::i;:::-;25611:139;;25509:248;;;:::o;25763:419::-;;25967:2;25956:9;25952:18;25944:26;;26016:9;26010:4;26006:20;26002:1;25991:9;25987:17;25980:47;26044:131;26170:4;26044:131;:::i;:::-;26036:139;;25934:248;;;:::o;26188:419::-;;26392:2;26381:9;26377:18;26369:26;;26441:9;26435:4;26431:20;26427:1;26416:9;26412:17;26405:47;26469:131;26595:4;26469:131;:::i;:::-;26461:139;;26359:248;;;:::o;26613:419::-;;26817:2;26806:9;26802:18;26794:26;;26866:9;26860:4;26856:20;26852:1;26841:9;26837:17;26830:47;26894:131;27020:4;26894:131;:::i;:::-;26886:139;;26784:248;;;:::o;27038:419::-;;27242:2;27231:9;27227:18;27219:26;;27291:9;27285:4;27281:20;27277:1;27266:9;27262:17;27255:47;27319:131;27445:4;27319:131;:::i;:::-;27311:139;;27209:248;;;:::o;27463:419::-;;27667:2;27656:9;27652:18;27644:26;;27716:9;27710:4;27706:20;27702:1;27691:9;27687:17;27680:47;27744:131;27870:4;27744:131;:::i;:::-;27736:139;;27634:248;;;:::o;27888:419::-;;28092:2;28081:9;28077:18;28069:26;;28141:9;28135:4;28131:20;28127:1;28116:9;28112:17;28105:47;28169:131;28295:4;28169:131;:::i;:::-;28161:139;;28059:248;;;:::o;28313:419::-;;28517:2;28506:9;28502:18;28494:26;;28566:9;28560:4;28556:20;28552:1;28541:9;28537:17;28530:47;28594:131;28720:4;28594:131;:::i;:::-;28586:139;;28484:248;;;:::o;28738:419::-;;28942:2;28931:9;28927:18;28919:26;;28991:9;28985:4;28981:20;28977:1;28966:9;28962:17;28955:47;29019:131;29145:4;29019:131;:::i;:::-;29011:139;;28909:248;;;:::o;29163:419::-;;29367:2;29356:9;29352:18;29344:26;;29416:9;29410:4;29406:20;29402:1;29391:9;29387:17;29380:47;29444:131;29570:4;29444:131;:::i;:::-;29436:139;;29334:248;;;:::o;29588:419::-;;29792:2;29781:9;29777:18;29769:26;;29841:9;29835:4;29831:20;29827:1;29816:9;29812:17;29805:47;29869:131;29995:4;29869:131;:::i;:::-;29861:139;;29759:248;;;:::o;30013:419::-;;30217:2;30206:9;30202:18;30194:26;;30266:9;30260:4;30256:20;30252:1;30241:9;30237:17;30230:47;30294:131;30420:4;30294:131;:::i;:::-;30286:139;;30184:248;;;:::o;30438:419::-;;30642:2;30631:9;30627:18;30619:26;;30691:9;30685:4;30681:20;30677:1;30666:9;30662:17;30655:47;30719:131;30845:4;30719:131;:::i;:::-;30711:139;;30609:248;;;:::o;30863:419::-;;31067:2;31056:9;31052:18;31044:26;;31116:9;31110:4;31106:20;31102:1;31091:9;31087:17;31080:47;31144:131;31270:4;31144:131;:::i;:::-;31136:139;;31034:248;;;:::o;31288:419::-;;31492:2;31481:9;31477:18;31469:26;;31541:9;31535:4;31531:20;31527:1;31516:9;31512:17;31505:47;31569:131;31695:4;31569:131;:::i;:::-;31561:139;;31459:248;;;:::o;31713:419::-;;31917:2;31906:9;31902:18;31894:26;;31966:9;31960:4;31956:20;31952:1;31941:9;31937:17;31930:47;31994:131;32120:4;31994:131;:::i;:::-;31986:139;;31884:248;;;:::o;32138:419::-;;32342:2;32331:9;32327:18;32319:26;;32391:9;32385:4;32381:20;32377:1;32366:9;32362:17;32355:47;32419:131;32545:4;32419:131;:::i;:::-;32411:139;;32309:248;;;:::o;32563:419::-;;32767:2;32756:9;32752:18;32744:26;;32816:9;32810:4;32806:20;32802:1;32791:9;32787:17;32780:47;32844:131;32970:4;32844:131;:::i;:::-;32836:139;;32734:248;;;:::o;32988:419::-;;33192:2;33181:9;33177:18;33169:26;;33241:9;33235:4;33231:20;33227:1;33216:9;33212:17;33205:47;33269:131;33395:4;33269:131;:::i;:::-;33261:139;;33159:248;;;:::o;33413:419::-;;33617:2;33606:9;33602:18;33594:26;;33666:9;33660:4;33656:20;33652:1;33641:9;33637:17;33630:47;33694:131;33820:4;33694:131;:::i;:::-;33686:139;;33584:248;;;:::o;33838:419::-;;34042:2;34031:9;34027:18;34019:26;;34091:9;34085:4;34081:20;34077:1;34066:9;34062:17;34055:47;34119:131;34245:4;34119:131;:::i;:::-;34111:139;;34009:248;;;:::o;34263:419::-;;34467:2;34456:9;34452:18;34444:26;;34516:9;34510:4;34506:20;34502:1;34491:9;34487:17;34480:47;34544:131;34670:4;34544:131;:::i;:::-;34536:139;;34434:248;;;:::o;34688:419::-;;34892:2;34881:9;34877:18;34869:26;;34941:9;34935:4;34931:20;34927:1;34916:9;34912:17;34905:47;34969:131;35095:4;34969:131;:::i;:::-;34961:139;;34859:248;;;:::o;35113:419::-;;35317:2;35306:9;35302:18;35294:26;;35366:9;35360:4;35356:20;35352:1;35341:9;35337:17;35330:47;35394:131;35520:4;35394:131;:::i;:::-;35386:139;;35284:248;;;:::o;35538:419::-;;35742:2;35731:9;35727:18;35719:26;;35791:9;35785:4;35781:20;35777:1;35766:9;35762:17;35755:47;35819:131;35945:4;35819:131;:::i;:::-;35811:139;;35709:248;;;:::o;35963:419::-;;36167:2;36156:9;36152:18;36144:26;;36216:9;36210:4;36206:20;36202:1;36191:9;36187:17;36180:47;36244:131;36370:4;36244:131;:::i;:::-;36236:139;;36134:248;;;:::o;36388:222::-;;36519:2;36508:9;36504:18;36496:26;;36532:71;36600:1;36589:9;36585:17;36576:6;36532:71;:::i;:::-;36486:124;;;;:::o;36616:283::-;;36682:2;36676:9;36666:19;;36724:4;36716:6;36712:17;36831:6;36819:10;36816:22;36795:18;36783:10;36780:34;36777:62;36774:2;;;36842:18;;:::i;:::-;36774:2;36882:10;36878:2;36871:22;36656:243;;;;:::o;36905:331::-;;37056:18;37048:6;37045:30;37042:2;;;37078:18;;:::i;:::-;37042:2;37163:4;37159:9;37152:4;37144:6;37140:17;37136:33;37128:41;;37224:4;37218;37214:15;37206:23;;36971:265;;;:::o;37242:332::-;;37394:18;37386:6;37383:30;37380:2;;;37416:18;;:::i;:::-;37380:2;37501:4;37497:9;37490:4;37482:6;37478:17;37474:33;37466:41;;37562:4;37556;37552:15;37544:23;;37309:265;;;:::o;37580:132::-;;37670:3;37662:11;;37700:4;37695:3;37691:14;37683:22;;37652:60;;;:::o;37718:114::-;;37819:5;37813:12;37803:22;;37792:40;;;:::o;37838:98::-;;37923:5;37917:12;37907:22;;37896:40;;;:::o;37942:99::-;;38028:5;38022:12;38012:22;;38001:40;;;:::o;38047:113::-;;38149:4;38144:3;38140:14;38132:22;;38122:38;;;:::o;38166:184::-;;38299:6;38294:3;38287:19;38339:4;38334:3;38330:14;38315:29;;38277:73;;;;:::o;38356:168::-;;38473:6;38468:3;38461:19;38513:4;38508:3;38504:14;38489:29;;38451:73;;;;:::o;38530:147::-;;38668:3;38653:18;;38643:34;;;;:::o;38683:169::-;;38801:6;38796:3;38789:19;38841:4;38836:3;38832:14;38817:29;;38779:73;;;;:::o;38858:148::-;;38997:3;38982:18;;38972:34;;;;:::o;39012:305::-;;39071:20;39089:1;39071:20;:::i;:::-;39066:25;;39105:20;39123:1;39105:20;:::i;:::-;39100:25;;39259:1;39191:66;39187:74;39184:1;39181:81;39178:2;;;39265:18;;:::i;:::-;39178:2;39309:1;39306;39302:9;39295:16;;39056:261;;;;:::o;39323:185::-;;39380:20;39398:1;39380:20;:::i;:::-;39375:25;;39414:20;39432:1;39414:20;:::i;:::-;39409:25;;39453:1;39443:2;;39458:18;;:::i;:::-;39443:2;39500:1;39497;39493:9;39488:14;;39365:143;;;;:::o;39514:348::-;;39577:20;39595:1;39577:20;:::i;:::-;39572:25;;39611:20;39629:1;39611:20;:::i;:::-;39606:25;;39799:1;39731:66;39727:74;39724:1;39721:81;39716:1;39709:9;39702:17;39698:105;39695:2;;;39806:18;;:::i;:::-;39695:2;39854:1;39851;39847:9;39836:20;;39562:300;;;;:::o;39868:191::-;;39928:20;39946:1;39928:20;:::i;:::-;39923:25;;39962:20;39980:1;39962:20;:::i;:::-;39957:25;;40001:1;39998;39995:8;39992:2;;;40006:18;;:::i;:::-;39992:2;40051:1;40048;40044:9;40036:17;;39913:146;;;;:::o;40065:96::-;;40131:24;40149:5;40131:24;:::i;:::-;40120:35;;40110:51;;;:::o;40167:90::-;;40244:5;40237:13;40230:21;40219:32;;40209:48;;;:::o;40263:77::-;;40329:5;40318:16;;40308:32;;;:::o;40346:149::-;;40422:66;40415:5;40411:78;40400:89;;40390:105;;;:::o;40501:126::-;;40578:42;40571:5;40567:54;40556:65;;40546:81;;;:::o;40633:77::-;;40699:5;40688:16;;40678:32;;;:::o;40716:154::-;40800:6;40795:3;40790;40777:30;40862:1;40853:6;40848:3;40844:16;40837:27;40767:103;;;:::o;40876:307::-;40944:1;40954:113;40968:6;40965:1;40962:13;40954:113;;;41053:1;41048:3;41044:11;41038:18;41034:1;41029:3;41025:11;41018:39;40990:2;40987:1;40983:10;40978:15;;40954:113;;;41085:6;41082:1;41079:13;41076:2;;;41165:1;41156:6;41151:3;41147:16;41140:27;41076:2;40925:258;;;;:::o;41189:171::-;;41251:24;41269:5;41251:24;:::i;:::-;41242:33;;41297:4;41290:5;41287:15;41284:2;;;41305:18;;:::i;:::-;41284:2;41352:1;41345:5;41341:13;41334:20;;41232:128;;;:::o;41366:320::-;;41447:1;41441:4;41437:12;41427:22;;41494:1;41488:4;41484:12;41515:18;41505:2;;41571:4;41563:6;41559:17;41549:27;;41505:2;41633;41625:6;41622:14;41602:18;41599:38;41596:2;;;41652:18;;:::i;:::-;41596:2;41417:269;;;;:::o;41692:233::-;;41754:24;41772:5;41754:24;:::i;:::-;41745:33;;41800:66;41793:5;41790:77;41787:2;;;41870:18;;:::i;:::-;41787:2;41917:1;41910:5;41906:13;41899:20;;41735:190;;;:::o;41931:176::-;;41980:20;41998:1;41980:20;:::i;:::-;41975:25;;42014:20;42032:1;42014:20;:::i;:::-;42009:25;;42053:1;42043:2;;42058:18;;:::i;:::-;42043:2;42099:1;42096;42092:9;42087:14;;41965:142;;;;:::o;42113:180::-;42161:77;42158:1;42151:88;42258:4;42255:1;42248:15;42282:4;42279:1;42272:15;42299:180;42347:77;42344:1;42337:88;42444:4;42441:1;42434:15;42468:4;42465:1;42458:15;42485:180;42533:77;42530:1;42523:88;42630:4;42627:1;42620:15;42654:4;42651:1;42644:15;42671:180;42719:77;42716:1;42709:88;42816:4;42813:1;42806:15;42840:4;42837:1;42830:15;42857:102;;42949:2;42945:7;42940:2;42933:5;42929:14;42925:28;42915:38;;42905:54;;;:::o;42965:122::-;43038:24;43056:5;43038:24;:::i;:::-;43031:5;43028:35;43018:2;;43077:1;43074;43067:12;43018:2;43008:79;:::o;43093:116::-;43163:21;43178:5;43163:21;:::i;:::-;43156:5;43153:32;43143:2;;43199:1;43196;43189:12;43143:2;43133:76;:::o;43215:120::-;43287:23;43304:5;43287:23;:::i;:::-;43280:5;43277:34;43267:2;;43325:1;43322;43315:12;43267:2;43257:78;:::o;43341:122::-;43414:24;43432:5;43414:24;:::i;:::-;43407:5;43404:35;43394:2;;43453:1;43450;43443:12;43394:2;43384:79;:::o

Swarm Source

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