ETH Price: $2,527.11 (-0.04%)

Token

Doodle Punks (DP)
 

Overview

Max Total Supply

806 DP

Holders

295

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 DP
0x386188730ff238942a6a90ced98777a0712cf750
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:
DoodlePunks

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

 
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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


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

 
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/DoodlePunks.sol

// contracts/DoodlePunks.sol
 

pragma solidity ^0.8.0;



contract DoodlePunks is ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;

    string private _baseURIextended;
    string public baseExtension = ".json";
    string public notRevealedUri;

    bool public publicIsActive = false;
    bool public onlyWhitelisted = false;
    bool public onlyAlphalisted = false;
    bool public revealed = false;

    uint256 public constant maxSupply = 9999;
    uint256 public constant maxPublicMint = 5;

    uint256 public constant publicMintPrice = 0.1 ether;
    uint256 public constant alphaMintPrice = 0.06 ether;
    uint256 public constant whitelistMintPrice = 0.08 ether;

    mapping(address => uint8) private whitelistedAddresses;
    mapping(address => uint8) private alphalistedAddresses;

    constructor() ERC721("Doodle Punks", "DP") {}

    function mintWhiteListed(uint8 numberOfTokens) external payable {
        uint256 totalSupply = totalSupply();
        require(onlyWhitelisted, "DoodlePunks: whitelisted list is not active");
        require(
            numberOfTokens <= whitelistedAddresses[msg.sender],
            "DoodlePunks: Exceeded max available to purchase"
        );
        require(
            totalSupply + numberOfTokens <= maxSupply,
            "DoodlePunks: Purchase would exceed max tokens"
        );
        require(
            whitelistMintPrice * numberOfTokens <= msg.value,
            "DoodlePunks: Ether value sent is not correct"
        );

        whitelistedAddresses[msg.sender] -= numberOfTokens;
        for (uint256 i = 1; i <= numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function mintAlphalisted(uint8 numberOfTokens) external payable {
        uint256 totalSupply = totalSupply();
        require(onlyAlphalisted, "DoodlePunks: alphalisted list is not active");
        require(
            numberOfTokens <= alphalistedAddresses[msg.sender],
            "DoodlePunks: Exceeded max available to purchase"
        );
        require(
            totalSupply + numberOfTokens <= maxSupply,
            "DoodlePunks: Purchase would exceed max tokens"
        );
        require(
            alphaMintPrice * numberOfTokens <= msg.value,
            "DoodlePunks: Ether value sent is not correct"
        );

        alphalistedAddresses[msg.sender] -= numberOfTokens;
        for (uint256 i = 1; i <= numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function mint(uint256 numberOfTokens) public payable {
        uint256 totalSupply = totalSupply();
        require(
            publicIsActive,
            "DoodlePunks: public Sale must be active to mint tokens"
        );
        require(
            numberOfTokens <= maxPublicMint,
            "DoodlePunks: Exceeded max token purchase"
        );
        require(
            totalSupply + numberOfTokens <= maxSupply,
            "DoodlePunks: Purchase would exceed max tokens"
        );
        require(
            publicMintPrice * numberOfTokens <= msg.value,
            "DoodlePunks: Ether value sent is not correct"
        );

        for (uint256 i = 1; i <= numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

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

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

    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

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

    function reserve(uint256 x) public onlyOwner {
        uint256 supply = totalSupply();
        uint256 i;
        for (i = 1; i <= x; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function whitelistNumAvailableToMint(address addr)
        external
        view
        returns (uint8)
    {
        return whitelistedAddresses[addr];
    }

    function alphalistNumAvailableToMint(address addr)
        external
        view
        returns (uint8)
    {
        return alphalistedAddresses[addr];
    }

    function setOnlyAlphalisted(bool _state) public onlyOwner {
        onlyAlphalisted = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function setPublicSale(bool newState) public onlyOwner {
        publicIsActive = newState;
    }

    function setAlphalist(address[] calldata addresses, uint8 numAllowedToMint)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            alphalistedAddresses[addresses[i]] = numAllowedToMint;
        }
    }

    function setWhitelist(address[] calldata addresses, uint8 numAllowedToMint)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelistedAddresses[addresses[i]] = numAllowedToMint;
        }
    }

    function withdraw() public payable onlyOwner {
        // =============================================================================

        // =============================================================================
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        // =============================================================================
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"alphaMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"alphalistNumAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"baseExtension","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":"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":"maxPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAlphalisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintWhiteListed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyAlphalisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"publicIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAlphalist","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyAlphalisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"whitelistNumAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000260565b506000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff021916908315150217905550348015620000cb57600080fd5b506040518060400160405280600c81526020017f446f6f646c652050756e6b7300000000000000000000000000000000000000008152506040518060400160405280600281526020017f445000000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015092919062000260565b5080600190805190602001906200016992919062000260565b5050506200018c620001806200019260201b60201c565b6200019a60201b60201c565b62000375565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026e9062000310565b90600052602060002090601f016020900481019282620002925760008555620002de565b82601f10620002ad57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002dd578251825591602001919060010190620002c0565b5b509050620002ed9190620002f1565b5090565b5b808211156200030c576000816000905550600101620002f2565b5090565b600060028204905060018216806200032957607f821691505b6020821081141562000340576200033f62000346565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61533680620003856000396000f3fe60806040526004361061027d5760003560e01c8063819b25ba1161014f578063b856f919116100c1578063d5abeb011161007a578063d5abeb011461094e578063da3ef23f14610979578063dc53fd92146109a2578063e985e9c5146109cd578063f2c4ce1e14610a0a578063f2fde38b14610a335761027d565b8063b856f9191461084d578063b88d4fde14610869578063bf45886114610892578063c6682862146108bb578063c87b56dd146108e6578063cabadaa0146109235761027d565b80639c70b512116101135780639c70b5121461076d578063a0712d6814610798578063a22cb465146107b4578063a41b7044146107dd578063a475b5dd146107f9578063a61affa9146108105761027d565b8063819b25ba1461068857806387a1325c146106b15780638da5cb5b146106ee57806395d89b411461071957806397495d71146107445761027d565b8063389219b8116101f357806355f804b3116101ac57806355f804b31461057a5780635aca1bb6146105a35780636352211e146105cc57806370a0823114610609578063715018a614610646578063748c299e1461065d5761027d565b8063389219b81461048d5780633c952764146104b65780633ccfd60b146104df57806342842e0e146104e95780634f6ccce714610512578063518302271461054f5761027d565b8063095ea7b311610245578063095ea7b31461037d5780630a8d3ff9146103a657806318160ddd146103d157806323b872dd146103fc5780632f745c591461042557806335c6aaf8146104625761027d565b806301ffc9a714610282578063033a02d6146102bf57806306fdde03146102ea578063081812fc14610315578063081c8c4414610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613d00565b610a5c565b6040516102b69190614346565b60405180910390f35b3480156102cb57600080fd5b506102d4610a6e565b6040516102e19190614346565b60405180910390f35b3480156102f657600080fd5b506102ff610a81565b60405161030c9190614361565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613d93565b610b13565b60405161034991906142df565b60405180910390f35b34801561035e57600080fd5b50610367610b98565b6040516103749190614361565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190613c43565b610c26565b005b3480156103b257600080fd5b506103bb610d3e565b6040516103c89190614346565b60405180910390f35b3480156103dd57600080fd5b506103e6610d51565b6040516103f391906146a3565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190613b3d565b610d5e565b005b34801561043157600080fd5b5061044c60048036038101906104479190613c43565b610dbe565b60405161045991906146a3565b60405180910390f35b34801561046e57600080fd5b50610477610e63565b60405161048491906146a3565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613c7f565b610e6f565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613cd7565b610fb7565b005b6104e7611050565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613b3d565b61111b565b005b34801561051e57600080fd5b5061053960048036038101906105349190613d93565b61113b565b60405161054691906146a3565b60405180910390f35b34801561055b57600080fd5b506105646111d2565b6040516105719190614346565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613d52565b6111e5565b005b3480156105af57600080fd5b506105ca60048036038101906105c59190613cd7565b61127b565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613d93565b611314565b60405161060091906142df565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613ad8565b6113c6565b60405161063d91906146a3565b60405180910390f35b34801561065257600080fd5b5061065b61147e565b005b34801561066957600080fd5b50610672611506565b60405161067f91906146a3565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613d93565b611511565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190613ad8565b6115d4565b6040516106e591906146be565b60405180910390f35b3480156106fa57600080fd5b5061070361162a565b60405161071091906142df565b60405180910390f35b34801561072557600080fd5b5061072e611654565b60405161073b9190614361565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613c7f565b6116e6565b005b34801561077957600080fd5b5061078261182e565b60405161078f9190614346565b60405180910390f35b6107b260048036038101906107ad9190613d93565b611841565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613c07565b6119c1565b005b6107f760048036038101906107f29190613dbc565b6119d7565b005b34801561080557600080fd5b5061080e611c24565b005b34801561081c57600080fd5b5061083760048036038101906108329190613ad8565b611cbd565b60405161084491906146be565b60405180910390f35b61086760048036038101906108629190613dbc565b611d13565b005b34801561087557600080fd5b50610890600480360381019061088b9190613b8c565b611f5f565b005b34801561089e57600080fd5b506108b960048036038101906108b49190613cd7565b611fc1565b005b3480156108c757600080fd5b506108d061205a565b6040516108dd9190614361565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613d93565b6120e8565b60405161091a9190614361565b60405180910390f35b34801561092f57600080fd5b50610938612241565b60405161094591906146a3565b60405180910390f35b34801561095a57600080fd5b50610963612246565b60405161097091906146a3565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190613d52565b61224c565b005b3480156109ae57600080fd5b506109b76122e2565b6040516109c491906146a3565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef9190613b01565b6122ee565b604051610a019190614346565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613d52565b612382565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613ad8565b612418565b005b6000610a6782612510565b9050919050565b600e60009054906101000a900460ff1681565b606060008054610a90906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc906149c4565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b5050505050905090565b6000610b1e8261258a565b610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490614543565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610ba5906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd1906149c4565b8015610c1e5780601f10610bf357610100808354040283529160200191610c1e565b820191906000526020600020905b815481529060010190602001808311610c0157829003601f168201915b505050505081565b6000610c3182611314565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c99906145c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc16125f6565b73ffffffffffffffffffffffffffffffffffffffff161480610cf05750610cef81610cea6125f6565b6122ee565b5b610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d26906144c3565b60405180910390fd5b610d3983836125fe565b505050565b600e60029054906101000a900460ff1681565b6000600880549050905090565b610d6f610d696125f6565b826126b7565b610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614623565b60405180910390fd5b610db9838383612795565b505050565b6000610dc9836113c6565b8210610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190614383565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b67011c37937e08000081565b610e776125f6565b73ffffffffffffffffffffffffffffffffffffffff16610e9561162a565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290614563565b60405180910390fd5b60005b83839050811015610fb1578160106000868685818110610f37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f4c9190613ad8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610fa990614a27565b915050610eee565b50505050565b610fbf6125f6565b73ffffffffffffffffffffffffffffffffffffffff16610fdd61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614563565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6110586125f6565b73ffffffffffffffffffffffffffffffffffffffff1661107661162a565b73ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390614563565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611117573d6000803e3d6000fd5b5050565b61113683838360405180602001604052806000815250611f5f565b505050565b6000611145610d51565b8210611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614643565b60405180910390fd5b600882815481106111c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600e60039054906101000a900460ff1681565b6111ed6125f6565b73ffffffffffffffffffffffffffffffffffffffff1661120b61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614563565b60405180910390fd5b80600b908051906020019061127792919061389d565b5050565b6112836125f6565b73ffffffffffffffffffffffffffffffffffffffff166112a161162a565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614563565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490614503565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906144e3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114866125f6565b73ffffffffffffffffffffffffffffffffffffffff166114a461162a565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614563565b60405180910390fd5b61150460006129f1565b565b66d529ae9e86000081565b6115196125f6565b73ffffffffffffffffffffffffffffffffffffffff1661153761162a565b73ffffffffffffffffffffffffffffffffffffffff161461158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490614563565b60405180910390fd5b6000611597610d51565b90506000600190505b8281116115cf576115bc3382846115b791906147b8565b612ab7565b80806115c790614a27565b9150506115a0565b505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611663906149c4565b80601f016020809104026020016040519081016040528092919081815260200182805461168f906149c4565b80156116dc5780601f106116b1576101008083540402835291602001916116dc565b820191906000526020600020905b8154815290600101906020018083116116bf57829003601f168201915b5050505050905090565b6116ee6125f6565b73ffffffffffffffffffffffffffffffffffffffff1661170c61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175990614563565b60405180910390fd5b60005b838390508110156118285781600f60008686858181106117ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906117c39190613ad8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061182090614a27565b915050611765565b50505050565b600e60019054906101000a900460ff1681565b600061184b610d51565b9050600e60009054906101000a900460ff1661189c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189390614483565b60405180910390fd5b60058211156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614683565b60405180910390fd5b61270f82826118ef91906147b8565b1115611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614663565b60405180910390fd5b348267016345785d8a0000611945919061483f565b1115611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d906144a3565b60405180910390fd5b6000600190505b8281116119bc576119a93382846119a491906147b8565b612ab7565b80806119b490614a27565b91505061198d565b505050565b6119d36119cc6125f6565b8383612ad5565b5050565b60006119e1610d51565b9050600e60019054906101000a900460ff16611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990614403565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe906145e3565b60405180910390fd5b61270f8260ff1682611ad991906147b8565b1115611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614663565b60405180910390fd5b348260ff1667011c37937e080000611b32919061483f565b1115611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a906144a3565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611bce91906148cd565b92506101000a81548160ff021916908360ff1602179055506000600190505b8260ff168111611c1f57611c0c338284611c0791906147b8565b612ab7565b8080611c1790614a27565b915050611bed565b505050565b611c2c6125f6565b73ffffffffffffffffffffffffffffffffffffffff16611c4a61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9790614563565b60405180910390fd5b6001600e60036101000a81548160ff021916908315150217905550565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611d1d610d51565b9050600e60029054906101000a900460ff16611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590614603565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906145e3565b60405180910390fd5b61270f8260ff1682611e1591906147b8565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614663565b60405180910390fd5b348260ff1666d529ae9e860000611e6d919061483f565b1115611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea5906144a3565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611f0991906148cd565b92506101000a81548160ff021916908360ff1602179055506000600190505b8260ff168111611f5a57611f47338284611f4291906147b8565b612ab7565b8080611f5290614a27565b915050611f28565b505050565b611f70611f6a6125f6565b836126b7565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614623565b60405180910390fd5b611fbb84848484612c42565b50505050565b611fc96125f6565b73ffffffffffffffffffffffffffffffffffffffff16611fe761162a565b73ffffffffffffffffffffffffffffffffffffffff161461203d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203490614563565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b600c8054612067906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612093906149c4565b80156120e05780601f106120b5576101008083540402835291602001916120e0565b820191906000526020600020905b8154815290600101906020018083116120c357829003601f168201915b505050505081565b60606120f38261258a565b612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906145a3565b60405180910390fd5b60001515600e60039054906101000a900460ff16151514156121e057600d805461215b906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612187906149c4565b80156121d45780601f106121a9576101008083540402835291602001916121d4565b820191906000526020600020905b8154815290600101906020018083116121b757829003601f168201915b5050505050905061223c565b60006121ea612c9e565b9050600081511161220a5760405180602001604052806000815250612238565b8061221484612d30565b600c604051602001612228939291906142ae565b6040516020818303038152906040525b9150505b919050565b600581565b61270f81565b6122546125f6565b73ffffffffffffffffffffffffffffffffffffffff1661227261162a565b73ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90614563565b60405180910390fd5b80600c90805190602001906122de92919061389d565b5050565b67016345785d8a000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238a6125f6565b73ffffffffffffffffffffffffffffffffffffffff166123a861162a565b73ffffffffffffffffffffffffffffffffffffffff16146123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614563565b60405180910390fd5b80600d908051906020019061241492919061389d565b5050565b6124206125f6565b73ffffffffffffffffffffffffffffffffffffffff1661243e61162a565b73ffffffffffffffffffffffffffffffffffffffff1614612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248b90614563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906143c3565b60405180910390fd5b61250d816129f1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612583575061258282612edd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661267183611314565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126c28261258a565b612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f890614463565b60405180910390fd5b600061270c83611314565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061277b57508373ffffffffffffffffffffffffffffffffffffffff1661276384610b13565b73ffffffffffffffffffffffffffffffffffffffff16145b8061278c575061278b81856122ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127b582611314565b73ffffffffffffffffffffffffffffffffffffffff161461280b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280290614583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614423565b60405180910390fd5b612886838383612fbf565b6128916000826125fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e19190614899565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293891906147b8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ad1828260405180602001604052806000815250612fcf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614443565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c359190614346565b60405180910390a3505050565b612c4d848484612795565b612c598484848461302a565b612c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8f906143a3565b60405180910390fd5b50505050565b6060600b8054612cad906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd9906149c4565b8015612d265780601f10612cfb57610100808354040283529160200191612d26565b820191906000526020600020905b815481529060010190602001808311612d0957829003601f168201915b5050505050905090565b60606000821415612d78576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ed8565b600082905060005b60008214612daa578080612d9390614a27565b915050600a82612da3919061480e565b9150612d80565b60008167ffffffffffffffff811115612dec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e1e5781602001600182028036833780820191505090505b5090505b60008514612ed157600182612e379190614899565b9150600a85612e469190614a70565b6030612e5291906147b8565b60f81b818381518110612e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eca919061480e565b9450612e22565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fa857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fb85750612fb7826131c1565b5b9050919050565b612fca83838361322b565b505050565b612fd9838361333f565b612fe6600084848461302a565b613025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301c906143a3565b60405180910390fd5b505050565b600061304b8473ffffffffffffffffffffffffffffffffffffffff1661350d565b156131b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130746125f6565b8786866040518563ffffffff1660e01b815260040161309694939291906142fa565b602060405180830381600087803b1580156130b057600080fd5b505af19250505080156130e157506040513d601f19601f820116820180604052508101906130de9190613d29565b60015b613164573d8060008114613111576040519150601f19603f3d011682016040523d82523d6000602084013e613116565b606091505b5060008151141561315c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613153906143a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131b9565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613236838383613520565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132795761327481613525565b6132b8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132b7576132b6838261356e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132fb576132f6816136db565b61333a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461333957613338828261381e565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a690614523565b60405180910390fd5b6133b88161258a565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef906143e3565b60405180910390fd5b61340460008383612fbf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345491906147b8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161357b846113c6565b6135859190614899565b905060006007600084815260200190815260200160002054905081811461366a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136ef9190614899565b9050600060096000848152602001908152602001600020549050600060088381548110613745577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061378d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613802577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613829836113c6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546138a9906149c4565b90600052602060002090601f0160209004810192826138cb5760008555613912565b82601f106138e457805160ff1916838001178555613912565b82800160010185558215613912579182015b828111156139115782518255916020019190600101906138f6565b5b50905061391f9190613923565b5090565b5b8082111561393c576000816000905550600101613924565b5090565b600061395361394e846146fe565b6146d9565b90508281526020810184848401111561396b57600080fd5b613976848285614982565b509392505050565b600061399161398c8461472f565b6146d9565b9050828152602081018484840111156139a957600080fd5b6139b4848285614982565b509392505050565b6000813590506139cb8161528d565b92915050565b60008083601f8401126139e357600080fd5b8235905067ffffffffffffffff8111156139fc57600080fd5b602083019150836020820283011115613a1457600080fd5b9250929050565b600081359050613a2a816152a4565b92915050565b600081359050613a3f816152bb565b92915050565b600081519050613a54816152bb565b92915050565b600082601f830112613a6b57600080fd5b8135613a7b848260208601613940565b91505092915050565b600082601f830112613a9557600080fd5b8135613aa584826020860161397e565b91505092915050565b600081359050613abd816152d2565b92915050565b600081359050613ad2816152e9565b92915050565b600060208284031215613aea57600080fd5b6000613af8848285016139bc565b91505092915050565b60008060408385031215613b1457600080fd5b6000613b22858286016139bc565b9250506020613b33858286016139bc565b9150509250929050565b600080600060608486031215613b5257600080fd5b6000613b60868287016139bc565b9350506020613b71868287016139bc565b9250506040613b8286828701613aae565b9150509250925092565b60008060008060808587031215613ba257600080fd5b6000613bb0878288016139bc565b9450506020613bc1878288016139bc565b9350506040613bd287828801613aae565b925050606085013567ffffffffffffffff811115613bef57600080fd5b613bfb87828801613a5a565b91505092959194509250565b60008060408385031215613c1a57600080fd5b6000613c28858286016139bc565b9250506020613c3985828601613a1b565b9150509250929050565b60008060408385031215613c5657600080fd5b6000613c64858286016139bc565b9250506020613c7585828601613aae565b9150509250929050565b600080600060408486031215613c9457600080fd5b600084013567ffffffffffffffff811115613cae57600080fd5b613cba868287016139d1565b93509350506020613ccd86828701613ac3565b9150509250925092565b600060208284031215613ce957600080fd5b6000613cf784828501613a1b565b91505092915050565b600060208284031215613d1257600080fd5b6000613d2084828501613a30565b91505092915050565b600060208284031215613d3b57600080fd5b6000613d4984828501613a45565b91505092915050565b600060208284031215613d6457600080fd5b600082013567ffffffffffffffff811115613d7e57600080fd5b613d8a84828501613a84565b91505092915050565b600060208284031215613da557600080fd5b6000613db384828501613aae565b91505092915050565b600060208284031215613dce57600080fd5b6000613ddc84828501613ac3565b91505092915050565b613dee81614901565b82525050565b613dfd81614913565b82525050565b6000613e0e82614775565b613e18818561478b565b9350613e28818560208601614991565b613e3181614b5d565b840191505092915050565b6000613e4782614780565b613e51818561479c565b9350613e61818560208601614991565b613e6a81614b5d565b840191505092915050565b6000613e8082614780565b613e8a81856147ad565b9350613e9a818560208601614991565b80840191505092915050565b60008154613eb3816149c4565b613ebd81866147ad565b94506001821660008114613ed85760018114613ee957613f1c565b60ff19831686528186019350613f1c565b613ef285614760565b60005b83811015613f1457815481890152600182019150602081019050613ef5565b838801955050505b50505092915050565b6000613f32602b8361479c565b9150613f3d82614b6e565b604082019050919050565b6000613f5560328361479c565b9150613f6082614bbd565b604082019050919050565b6000613f7860268361479c565b9150613f8382614c0c565b604082019050919050565b6000613f9b601c8361479c565b9150613fa682614c5b565b602082019050919050565b6000613fbe602b8361479c565b9150613fc982614c84565b604082019050919050565b6000613fe160248361479c565b9150613fec82614cd3565b604082019050919050565b600061400460198361479c565b915061400f82614d22565b602082019050919050565b6000614027602c8361479c565b915061403282614d4b565b604082019050919050565b600061404a60368361479c565b915061405582614d9a565b604082019050919050565b600061406d602c8361479c565b915061407882614de9565b604082019050919050565b600061409060388361479c565b915061409b82614e38565b604082019050919050565b60006140b3602a8361479c565b91506140be82614e87565b604082019050919050565b60006140d660298361479c565b91506140e182614ed6565b604082019050919050565b60006140f960208361479c565b915061410482614f25565b602082019050919050565b600061411c602c8361479c565b915061412782614f4e565b604082019050919050565b600061413f60208361479c565b915061414a82614f9d565b602082019050919050565b600061416260298361479c565b915061416d82614fc6565b604082019050919050565b6000614185602f8361479c565b915061419082615015565b604082019050919050565b60006141a860218361479c565b91506141b382615064565b604082019050919050565b60006141cb602f8361479c565b91506141d6826150b3565b604082019050919050565b60006141ee602b8361479c565b91506141f982615102565b604082019050919050565b600061421160318361479c565b915061421c82615151565b604082019050919050565b6000614234602c8361479c565b915061423f826151a0565b604082019050919050565b6000614257602d8361479c565b9150614262826151ef565b604082019050919050565b600061427a60288361479c565b91506142858261523e565b604082019050919050565b6142998161496b565b82525050565b6142a881614975565b82525050565b60006142ba8286613e75565b91506142c68285613e75565b91506142d28284613ea6565b9150819050949350505050565b60006020820190506142f46000830184613de5565b92915050565b600060808201905061430f6000830187613de5565b61431c6020830186613de5565b6143296040830185614290565b818103606083015261433b8184613e03565b905095945050505050565b600060208201905061435b6000830184613df4565b92915050565b6000602082019050818103600083015261437b8184613e3c565b905092915050565b6000602082019050818103600083015261439c81613f25565b9050919050565b600060208201905081810360008301526143bc81613f48565b9050919050565b600060208201905081810360008301526143dc81613f6b565b9050919050565b600060208201905081810360008301526143fc81613f8e565b9050919050565b6000602082019050818103600083015261441c81613fb1565b9050919050565b6000602082019050818103600083015261443c81613fd4565b9050919050565b6000602082019050818103600083015261445c81613ff7565b9050919050565b6000602082019050818103600083015261447c8161401a565b9050919050565b6000602082019050818103600083015261449c8161403d565b9050919050565b600060208201905081810360008301526144bc81614060565b9050919050565b600060208201905081810360008301526144dc81614083565b9050919050565b600060208201905081810360008301526144fc816140a6565b9050919050565b6000602082019050818103600083015261451c816140c9565b9050919050565b6000602082019050818103600083015261453c816140ec565b9050919050565b6000602082019050818103600083015261455c8161410f565b9050919050565b6000602082019050818103600083015261457c81614132565b9050919050565b6000602082019050818103600083015261459c81614155565b9050919050565b600060208201905081810360008301526145bc81614178565b9050919050565b600060208201905081810360008301526145dc8161419b565b9050919050565b600060208201905081810360008301526145fc816141be565b9050919050565b6000602082019050818103600083015261461c816141e1565b9050919050565b6000602082019050818103600083015261463c81614204565b9050919050565b6000602082019050818103600083015261465c81614227565b9050919050565b6000602082019050818103600083015261467c8161424a565b9050919050565b6000602082019050818103600083015261469c8161426d565b9050919050565b60006020820190506146b86000830184614290565b92915050565b60006020820190506146d3600083018461429f565b92915050565b60006146e36146f4565b90506146ef82826149f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561471957614718614b2e565b5b61472282614b5d565b9050602081019050919050565b600067ffffffffffffffff82111561474a57614749614b2e565b5b61475382614b5d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147c38261496b565b91506147ce8361496b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480357614802614aa1565b5b828201905092915050565b60006148198261496b565b91506148248361496b565b92508261483457614833614ad0565b5b828204905092915050565b600061484a8261496b565b91506148558361496b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488e5761488d614aa1565b5b828202905092915050565b60006148a48261496b565b91506148af8361496b565b9250828210156148c2576148c1614aa1565b5b828203905092915050565b60006148d882614975565b91506148e383614975565b9250828210156148f6576148f5614aa1565b5b828203905092915050565b600061490c8261494b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156149af578082015181840152602081019050614994565b838111156149be576000848401525b50505050565b600060028204905060018216806149dc57607f821691505b602082108114156149f0576149ef614aff565b5b50919050565b6149ff82614b5d565b810181811067ffffffffffffffff82111715614a1e57614a1d614b2e565b5b80604052505050565b6000614a328261496b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a6557614a64614aa1565b5b600182019050919050565b6000614a7b8261496b565b9150614a868361496b565b925082614a9657614a95614ad0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f446f6f646c6550756e6b733a2077686974656c6973746564206c69737420697360008201527f206e6f7420616374697665000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a207075626c69632053616c65206d75737420626560008201527f2061637469766520746f206d696e7420746f6b656e7300000000000000000000602082015250565b7f446f6f646c6550756e6b733a2045746865722076616c75652073656e7420697360008201527f206e6f7420636f72726563740000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a204578636565646564206d617820617661696c6160008201527f626c6520746f2070757263686173650000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a20616c7068616c6973746564206c69737420697360008201527f206e6f7420616374697665000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a20507572636861736520776f756c64206578636560008201527f6564206d617820746f6b656e7300000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a204578636565646564206d617820746f6b656e2060008201527f7075726368617365000000000000000000000000000000000000000000000000602082015250565b61529681614901565b81146152a157600080fd5b50565b6152ad81614913565b81146152b857600080fd5b50565b6152c48161491f565b81146152cf57600080fd5b50565b6152db8161496b565b81146152e657600080fd5b50565b6152f281614975565b81146152fd57600080fd5b5056fea264697066735822122021c7e569e692fb5fef946fdfb21c28eeef5ce5d4159eb862bbc919641a0e1a1764736f6c63430008040033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063819b25ba1161014f578063b856f919116100c1578063d5abeb011161007a578063d5abeb011461094e578063da3ef23f14610979578063dc53fd92146109a2578063e985e9c5146109cd578063f2c4ce1e14610a0a578063f2fde38b14610a335761027d565b8063b856f9191461084d578063b88d4fde14610869578063bf45886114610892578063c6682862146108bb578063c87b56dd146108e6578063cabadaa0146109235761027d565b80639c70b512116101135780639c70b5121461076d578063a0712d6814610798578063a22cb465146107b4578063a41b7044146107dd578063a475b5dd146107f9578063a61affa9146108105761027d565b8063819b25ba1461068857806387a1325c146106b15780638da5cb5b146106ee57806395d89b411461071957806397495d71146107445761027d565b8063389219b8116101f357806355f804b3116101ac57806355f804b31461057a5780635aca1bb6146105a35780636352211e146105cc57806370a0823114610609578063715018a614610646578063748c299e1461065d5761027d565b8063389219b81461048d5780633c952764146104b65780633ccfd60b146104df57806342842e0e146104e95780634f6ccce714610512578063518302271461054f5761027d565b8063095ea7b311610245578063095ea7b31461037d5780630a8d3ff9146103a657806318160ddd146103d157806323b872dd146103fc5780632f745c591461042557806335c6aaf8146104625761027d565b806301ffc9a714610282578063033a02d6146102bf57806306fdde03146102ea578063081812fc14610315578063081c8c4414610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613d00565b610a5c565b6040516102b69190614346565b60405180910390f35b3480156102cb57600080fd5b506102d4610a6e565b6040516102e19190614346565b60405180910390f35b3480156102f657600080fd5b506102ff610a81565b60405161030c9190614361565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613d93565b610b13565b60405161034991906142df565b60405180910390f35b34801561035e57600080fd5b50610367610b98565b6040516103749190614361565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190613c43565b610c26565b005b3480156103b257600080fd5b506103bb610d3e565b6040516103c89190614346565b60405180910390f35b3480156103dd57600080fd5b506103e6610d51565b6040516103f391906146a3565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190613b3d565b610d5e565b005b34801561043157600080fd5b5061044c60048036038101906104479190613c43565b610dbe565b60405161045991906146a3565b60405180910390f35b34801561046e57600080fd5b50610477610e63565b60405161048491906146a3565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613c7f565b610e6f565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613cd7565b610fb7565b005b6104e7611050565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613b3d565b61111b565b005b34801561051e57600080fd5b5061053960048036038101906105349190613d93565b61113b565b60405161054691906146a3565b60405180910390f35b34801561055b57600080fd5b506105646111d2565b6040516105719190614346565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613d52565b6111e5565b005b3480156105af57600080fd5b506105ca60048036038101906105c59190613cd7565b61127b565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613d93565b611314565b60405161060091906142df565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613ad8565b6113c6565b60405161063d91906146a3565b60405180910390f35b34801561065257600080fd5b5061065b61147e565b005b34801561066957600080fd5b50610672611506565b60405161067f91906146a3565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613d93565b611511565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190613ad8565b6115d4565b6040516106e591906146be565b60405180910390f35b3480156106fa57600080fd5b5061070361162a565b60405161071091906142df565b60405180910390f35b34801561072557600080fd5b5061072e611654565b60405161073b9190614361565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613c7f565b6116e6565b005b34801561077957600080fd5b5061078261182e565b60405161078f9190614346565b60405180910390f35b6107b260048036038101906107ad9190613d93565b611841565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613c07565b6119c1565b005b6107f760048036038101906107f29190613dbc565b6119d7565b005b34801561080557600080fd5b5061080e611c24565b005b34801561081c57600080fd5b5061083760048036038101906108329190613ad8565b611cbd565b60405161084491906146be565b60405180910390f35b61086760048036038101906108629190613dbc565b611d13565b005b34801561087557600080fd5b50610890600480360381019061088b9190613b8c565b611f5f565b005b34801561089e57600080fd5b506108b960048036038101906108b49190613cd7565b611fc1565b005b3480156108c757600080fd5b506108d061205a565b6040516108dd9190614361565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613d93565b6120e8565b60405161091a9190614361565b60405180910390f35b34801561092f57600080fd5b50610938612241565b60405161094591906146a3565b60405180910390f35b34801561095a57600080fd5b50610963612246565b60405161097091906146a3565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190613d52565b61224c565b005b3480156109ae57600080fd5b506109b76122e2565b6040516109c491906146a3565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef9190613b01565b6122ee565b604051610a019190614346565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613d52565b612382565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613ad8565b612418565b005b6000610a6782612510565b9050919050565b600e60009054906101000a900460ff1681565b606060008054610a90906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc906149c4565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b5050505050905090565b6000610b1e8261258a565b610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490614543565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610ba5906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd1906149c4565b8015610c1e5780601f10610bf357610100808354040283529160200191610c1e565b820191906000526020600020905b815481529060010190602001808311610c0157829003601f168201915b505050505081565b6000610c3182611314565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c99906145c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc16125f6565b73ffffffffffffffffffffffffffffffffffffffff161480610cf05750610cef81610cea6125f6565b6122ee565b5b610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d26906144c3565b60405180910390fd5b610d3983836125fe565b505050565b600e60029054906101000a900460ff1681565b6000600880549050905090565b610d6f610d696125f6565b826126b7565b610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614623565b60405180910390fd5b610db9838383612795565b505050565b6000610dc9836113c6565b8210610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190614383565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b67011c37937e08000081565b610e776125f6565b73ffffffffffffffffffffffffffffffffffffffff16610e9561162a565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290614563565b60405180910390fd5b60005b83839050811015610fb1578160106000868685818110610f37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f4c9190613ad8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610fa990614a27565b915050610eee565b50505050565b610fbf6125f6565b73ffffffffffffffffffffffffffffffffffffffff16610fdd61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614563565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6110586125f6565b73ffffffffffffffffffffffffffffffffffffffff1661107661162a565b73ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390614563565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611117573d6000803e3d6000fd5b5050565b61113683838360405180602001604052806000815250611f5f565b505050565b6000611145610d51565b8210611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614643565b60405180910390fd5b600882815481106111c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600e60039054906101000a900460ff1681565b6111ed6125f6565b73ffffffffffffffffffffffffffffffffffffffff1661120b61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614563565b60405180910390fd5b80600b908051906020019061127792919061389d565b5050565b6112836125f6565b73ffffffffffffffffffffffffffffffffffffffff166112a161162a565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614563565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490614503565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906144e3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114866125f6565b73ffffffffffffffffffffffffffffffffffffffff166114a461162a565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614563565b60405180910390fd5b61150460006129f1565b565b66d529ae9e86000081565b6115196125f6565b73ffffffffffffffffffffffffffffffffffffffff1661153761162a565b73ffffffffffffffffffffffffffffffffffffffff161461158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490614563565b60405180910390fd5b6000611597610d51565b90506000600190505b8281116115cf576115bc3382846115b791906147b8565b612ab7565b80806115c790614a27565b9150506115a0565b505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611663906149c4565b80601f016020809104026020016040519081016040528092919081815260200182805461168f906149c4565b80156116dc5780601f106116b1576101008083540402835291602001916116dc565b820191906000526020600020905b8154815290600101906020018083116116bf57829003601f168201915b5050505050905090565b6116ee6125f6565b73ffffffffffffffffffffffffffffffffffffffff1661170c61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175990614563565b60405180910390fd5b60005b838390508110156118285781600f60008686858181106117ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906117c39190613ad8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061182090614a27565b915050611765565b50505050565b600e60019054906101000a900460ff1681565b600061184b610d51565b9050600e60009054906101000a900460ff1661189c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189390614483565b60405180910390fd5b60058211156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614683565b60405180910390fd5b61270f82826118ef91906147b8565b1115611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614663565b60405180910390fd5b348267016345785d8a0000611945919061483f565b1115611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d906144a3565b60405180910390fd5b6000600190505b8281116119bc576119a93382846119a491906147b8565b612ab7565b80806119b490614a27565b91505061198d565b505050565b6119d36119cc6125f6565b8383612ad5565b5050565b60006119e1610d51565b9050600e60019054906101000a900460ff16611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990614403565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe906145e3565b60405180910390fd5b61270f8260ff1682611ad991906147b8565b1115611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614663565b60405180910390fd5b348260ff1667011c37937e080000611b32919061483f565b1115611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a906144a3565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611bce91906148cd565b92506101000a81548160ff021916908360ff1602179055506000600190505b8260ff168111611c1f57611c0c338284611c0791906147b8565b612ab7565b8080611c1790614a27565b915050611bed565b505050565b611c2c6125f6565b73ffffffffffffffffffffffffffffffffffffffff16611c4a61162a565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9790614563565b60405180910390fd5b6001600e60036101000a81548160ff021916908315150217905550565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611d1d610d51565b9050600e60029054906101000a900460ff16611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590614603565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906145e3565b60405180910390fd5b61270f8260ff1682611e1591906147b8565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614663565b60405180910390fd5b348260ff1666d529ae9e860000611e6d919061483f565b1115611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea5906144a3565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611f0991906148cd565b92506101000a81548160ff021916908360ff1602179055506000600190505b8260ff168111611f5a57611f47338284611f4291906147b8565b612ab7565b8080611f5290614a27565b915050611f28565b505050565b611f70611f6a6125f6565b836126b7565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614623565b60405180910390fd5b611fbb84848484612c42565b50505050565b611fc96125f6565b73ffffffffffffffffffffffffffffffffffffffff16611fe761162a565b73ffffffffffffffffffffffffffffffffffffffff161461203d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203490614563565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b600c8054612067906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612093906149c4565b80156120e05780601f106120b5576101008083540402835291602001916120e0565b820191906000526020600020905b8154815290600101906020018083116120c357829003601f168201915b505050505081565b60606120f38261258a565b612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906145a3565b60405180910390fd5b60001515600e60039054906101000a900460ff16151514156121e057600d805461215b906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612187906149c4565b80156121d45780601f106121a9576101008083540402835291602001916121d4565b820191906000526020600020905b8154815290600101906020018083116121b757829003601f168201915b5050505050905061223c565b60006121ea612c9e565b9050600081511161220a5760405180602001604052806000815250612238565b8061221484612d30565b600c604051602001612228939291906142ae565b6040516020818303038152906040525b9150505b919050565b600581565b61270f81565b6122546125f6565b73ffffffffffffffffffffffffffffffffffffffff1661227261162a565b73ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90614563565b60405180910390fd5b80600c90805190602001906122de92919061389d565b5050565b67016345785d8a000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238a6125f6565b73ffffffffffffffffffffffffffffffffffffffff166123a861162a565b73ffffffffffffffffffffffffffffffffffffffff16146123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614563565b60405180910390fd5b80600d908051906020019061241492919061389d565b5050565b6124206125f6565b73ffffffffffffffffffffffffffffffffffffffff1661243e61162a565b73ffffffffffffffffffffffffffffffffffffffff1614612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248b90614563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906143c3565b60405180910390fd5b61250d816129f1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612583575061258282612edd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661267183611314565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126c28261258a565b612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f890614463565b60405180910390fd5b600061270c83611314565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061277b57508373ffffffffffffffffffffffffffffffffffffffff1661276384610b13565b73ffffffffffffffffffffffffffffffffffffffff16145b8061278c575061278b81856122ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127b582611314565b73ffffffffffffffffffffffffffffffffffffffff161461280b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280290614583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614423565b60405180910390fd5b612886838383612fbf565b6128916000826125fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e19190614899565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293891906147b8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ad1828260405180602001604052806000815250612fcf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614443565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c359190614346565b60405180910390a3505050565b612c4d848484612795565b612c598484848461302a565b612c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8f906143a3565b60405180910390fd5b50505050565b6060600b8054612cad906149c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd9906149c4565b8015612d265780601f10612cfb57610100808354040283529160200191612d26565b820191906000526020600020905b815481529060010190602001808311612d0957829003601f168201915b5050505050905090565b60606000821415612d78576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ed8565b600082905060005b60008214612daa578080612d9390614a27565b915050600a82612da3919061480e565b9150612d80565b60008167ffffffffffffffff811115612dec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e1e5781602001600182028036833780820191505090505b5090505b60008514612ed157600182612e379190614899565b9150600a85612e469190614a70565b6030612e5291906147b8565b60f81b818381518110612e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eca919061480e565b9450612e22565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fa857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fb85750612fb7826131c1565b5b9050919050565b612fca83838361322b565b505050565b612fd9838361333f565b612fe6600084848461302a565b613025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301c906143a3565b60405180910390fd5b505050565b600061304b8473ffffffffffffffffffffffffffffffffffffffff1661350d565b156131b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130746125f6565b8786866040518563ffffffff1660e01b815260040161309694939291906142fa565b602060405180830381600087803b1580156130b057600080fd5b505af19250505080156130e157506040513d601f19601f820116820180604052508101906130de9190613d29565b60015b613164573d8060008114613111576040519150601f19603f3d011682016040523d82523d6000602084013e613116565b606091505b5060008151141561315c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613153906143a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131b9565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613236838383613520565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132795761327481613525565b6132b8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132b7576132b6838261356e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132fb576132f6816136db565b61333a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461333957613338828261381e565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a690614523565b60405180910390fd5b6133b88161258a565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef906143e3565b60405180910390fd5b61340460008383612fbf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345491906147b8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161357b846113c6565b6135859190614899565b905060006007600084815260200190815260200160002054905081811461366a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136ef9190614899565b9050600060096000848152602001908152602001600020549050600060088381548110613745577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061378d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613802577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613829836113c6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546138a9906149c4565b90600052602060002090601f0160209004810192826138cb5760008555613912565b82601f106138e457805160ff1916838001178555613912565b82800160010185558215613912579182015b828111156139115782518255916020019190600101906138f6565b5b50905061391f9190613923565b5090565b5b8082111561393c576000816000905550600101613924565b5090565b600061395361394e846146fe565b6146d9565b90508281526020810184848401111561396b57600080fd5b613976848285614982565b509392505050565b600061399161398c8461472f565b6146d9565b9050828152602081018484840111156139a957600080fd5b6139b4848285614982565b509392505050565b6000813590506139cb8161528d565b92915050565b60008083601f8401126139e357600080fd5b8235905067ffffffffffffffff8111156139fc57600080fd5b602083019150836020820283011115613a1457600080fd5b9250929050565b600081359050613a2a816152a4565b92915050565b600081359050613a3f816152bb565b92915050565b600081519050613a54816152bb565b92915050565b600082601f830112613a6b57600080fd5b8135613a7b848260208601613940565b91505092915050565b600082601f830112613a9557600080fd5b8135613aa584826020860161397e565b91505092915050565b600081359050613abd816152d2565b92915050565b600081359050613ad2816152e9565b92915050565b600060208284031215613aea57600080fd5b6000613af8848285016139bc565b91505092915050565b60008060408385031215613b1457600080fd5b6000613b22858286016139bc565b9250506020613b33858286016139bc565b9150509250929050565b600080600060608486031215613b5257600080fd5b6000613b60868287016139bc565b9350506020613b71868287016139bc565b9250506040613b8286828701613aae565b9150509250925092565b60008060008060808587031215613ba257600080fd5b6000613bb0878288016139bc565b9450506020613bc1878288016139bc565b9350506040613bd287828801613aae565b925050606085013567ffffffffffffffff811115613bef57600080fd5b613bfb87828801613a5a565b91505092959194509250565b60008060408385031215613c1a57600080fd5b6000613c28858286016139bc565b9250506020613c3985828601613a1b565b9150509250929050565b60008060408385031215613c5657600080fd5b6000613c64858286016139bc565b9250506020613c7585828601613aae565b9150509250929050565b600080600060408486031215613c9457600080fd5b600084013567ffffffffffffffff811115613cae57600080fd5b613cba868287016139d1565b93509350506020613ccd86828701613ac3565b9150509250925092565b600060208284031215613ce957600080fd5b6000613cf784828501613a1b565b91505092915050565b600060208284031215613d1257600080fd5b6000613d2084828501613a30565b91505092915050565b600060208284031215613d3b57600080fd5b6000613d4984828501613a45565b91505092915050565b600060208284031215613d6457600080fd5b600082013567ffffffffffffffff811115613d7e57600080fd5b613d8a84828501613a84565b91505092915050565b600060208284031215613da557600080fd5b6000613db384828501613aae565b91505092915050565b600060208284031215613dce57600080fd5b6000613ddc84828501613ac3565b91505092915050565b613dee81614901565b82525050565b613dfd81614913565b82525050565b6000613e0e82614775565b613e18818561478b565b9350613e28818560208601614991565b613e3181614b5d565b840191505092915050565b6000613e4782614780565b613e51818561479c565b9350613e61818560208601614991565b613e6a81614b5d565b840191505092915050565b6000613e8082614780565b613e8a81856147ad565b9350613e9a818560208601614991565b80840191505092915050565b60008154613eb3816149c4565b613ebd81866147ad565b94506001821660008114613ed85760018114613ee957613f1c565b60ff19831686528186019350613f1c565b613ef285614760565b60005b83811015613f1457815481890152600182019150602081019050613ef5565b838801955050505b50505092915050565b6000613f32602b8361479c565b9150613f3d82614b6e565b604082019050919050565b6000613f5560328361479c565b9150613f6082614bbd565b604082019050919050565b6000613f7860268361479c565b9150613f8382614c0c565b604082019050919050565b6000613f9b601c8361479c565b9150613fa682614c5b565b602082019050919050565b6000613fbe602b8361479c565b9150613fc982614c84565b604082019050919050565b6000613fe160248361479c565b9150613fec82614cd3565b604082019050919050565b600061400460198361479c565b915061400f82614d22565b602082019050919050565b6000614027602c8361479c565b915061403282614d4b565b604082019050919050565b600061404a60368361479c565b915061405582614d9a565b604082019050919050565b600061406d602c8361479c565b915061407882614de9565b604082019050919050565b600061409060388361479c565b915061409b82614e38565b604082019050919050565b60006140b3602a8361479c565b91506140be82614e87565b604082019050919050565b60006140d660298361479c565b91506140e182614ed6565b604082019050919050565b60006140f960208361479c565b915061410482614f25565b602082019050919050565b600061411c602c8361479c565b915061412782614f4e565b604082019050919050565b600061413f60208361479c565b915061414a82614f9d565b602082019050919050565b600061416260298361479c565b915061416d82614fc6565b604082019050919050565b6000614185602f8361479c565b915061419082615015565b604082019050919050565b60006141a860218361479c565b91506141b382615064565b604082019050919050565b60006141cb602f8361479c565b91506141d6826150b3565b604082019050919050565b60006141ee602b8361479c565b91506141f982615102565b604082019050919050565b600061421160318361479c565b915061421c82615151565b604082019050919050565b6000614234602c8361479c565b915061423f826151a0565b604082019050919050565b6000614257602d8361479c565b9150614262826151ef565b604082019050919050565b600061427a60288361479c565b91506142858261523e565b604082019050919050565b6142998161496b565b82525050565b6142a881614975565b82525050565b60006142ba8286613e75565b91506142c68285613e75565b91506142d28284613ea6565b9150819050949350505050565b60006020820190506142f46000830184613de5565b92915050565b600060808201905061430f6000830187613de5565b61431c6020830186613de5565b6143296040830185614290565b818103606083015261433b8184613e03565b905095945050505050565b600060208201905061435b6000830184613df4565b92915050565b6000602082019050818103600083015261437b8184613e3c565b905092915050565b6000602082019050818103600083015261439c81613f25565b9050919050565b600060208201905081810360008301526143bc81613f48565b9050919050565b600060208201905081810360008301526143dc81613f6b565b9050919050565b600060208201905081810360008301526143fc81613f8e565b9050919050565b6000602082019050818103600083015261441c81613fb1565b9050919050565b6000602082019050818103600083015261443c81613fd4565b9050919050565b6000602082019050818103600083015261445c81613ff7565b9050919050565b6000602082019050818103600083015261447c8161401a565b9050919050565b6000602082019050818103600083015261449c8161403d565b9050919050565b600060208201905081810360008301526144bc81614060565b9050919050565b600060208201905081810360008301526144dc81614083565b9050919050565b600060208201905081810360008301526144fc816140a6565b9050919050565b6000602082019050818103600083015261451c816140c9565b9050919050565b6000602082019050818103600083015261453c816140ec565b9050919050565b6000602082019050818103600083015261455c8161410f565b9050919050565b6000602082019050818103600083015261457c81614132565b9050919050565b6000602082019050818103600083015261459c81614155565b9050919050565b600060208201905081810360008301526145bc81614178565b9050919050565b600060208201905081810360008301526145dc8161419b565b9050919050565b600060208201905081810360008301526145fc816141be565b9050919050565b6000602082019050818103600083015261461c816141e1565b9050919050565b6000602082019050818103600083015261463c81614204565b9050919050565b6000602082019050818103600083015261465c81614227565b9050919050565b6000602082019050818103600083015261467c8161424a565b9050919050565b6000602082019050818103600083015261469c8161426d565b9050919050565b60006020820190506146b86000830184614290565b92915050565b60006020820190506146d3600083018461429f565b92915050565b60006146e36146f4565b90506146ef82826149f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561471957614718614b2e565b5b61472282614b5d565b9050602081019050919050565b600067ffffffffffffffff82111561474a57614749614b2e565b5b61475382614b5d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147c38261496b565b91506147ce8361496b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480357614802614aa1565b5b828201905092915050565b60006148198261496b565b91506148248361496b565b92508261483457614833614ad0565b5b828204905092915050565b600061484a8261496b565b91506148558361496b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488e5761488d614aa1565b5b828202905092915050565b60006148a48261496b565b91506148af8361496b565b9250828210156148c2576148c1614aa1565b5b828203905092915050565b60006148d882614975565b91506148e383614975565b9250828210156148f6576148f5614aa1565b5b828203905092915050565b600061490c8261494b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156149af578082015181840152602081019050614994565b838111156149be576000848401525b50505050565b600060028204905060018216806149dc57607f821691505b602082108114156149f0576149ef614aff565b5b50919050565b6149ff82614b5d565b810181811067ffffffffffffffff82111715614a1e57614a1d614b2e565b5b80604052505050565b6000614a328261496b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a6557614a64614aa1565b5b600182019050919050565b6000614a7b8261496b565b9150614a868361496b565b925082614a9657614a95614ad0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f446f6f646c6550756e6b733a2077686974656c6973746564206c69737420697360008201527f206e6f7420616374697665000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a207075626c69632053616c65206d75737420626560008201527f2061637469766520746f206d696e7420746f6b656e7300000000000000000000602082015250565b7f446f6f646c6550756e6b733a2045746865722076616c75652073656e7420697360008201527f206e6f7420636f72726563740000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a204578636565646564206d617820617661696c6160008201527f626c6520746f2070757263686173650000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a20616c7068616c6973746564206c69737420697360008201527f206e6f7420616374697665000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a20507572636861736520776f756c64206578636560008201527f6564206d617820746f6b656e7300000000000000000000000000000000000000602082015250565b7f446f6f646c6550756e6b733a204578636565646564206d617820746f6b656e2060008201527f7075726368617365000000000000000000000000000000000000000000000000602082015250565b61529681614901565b81146152a157600080fd5b50565b6152ad81614913565b81146152b857600080fd5b50565b6152c48161491f565b81146152cf57600080fd5b50565b6152db8161496b565b81146152e657600080fd5b50565b6152f281614975565b81146152fd57600080fd5b5056fea264697066735822122021c7e569e692fb5fef946fdfb21c28eeef5ce5d4159eb862bbc919641a0e1a1764736f6c63430008040033

Deployed Bytecode Sourcemap

44639:6987:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48188:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44857:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22256:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23815:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44820:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23338:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44940:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39026:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24565:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38694:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45232:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50658:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50442:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51200:423;;;:::i;:::-;;24975:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39216:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44982:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48425:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50551:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21950:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21680:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35471:103;;;;;;;;;;;;;:::i;:::-;;45174:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49693:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50160:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34820:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22425:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50929:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44898:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47169:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24108:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45473:842;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49910:69;;;;;;;;;;;;;:::i;:::-;;49987:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46323:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25231:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50333:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44776:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48960:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45066:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45019:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48667:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45116:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24334:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48826:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35729:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48188:229;48344:4;48373:36;48397:11;48373:23;:36::i;:::-;48366:43;;48188:229;;;:::o;44857:34::-;;;;;;;;;;;;;:::o;22256:100::-;22310:13;22343:5;22336:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22256:100;:::o;23815:221::-;23891:7;23919:16;23927:7;23919;:16::i;:::-;23911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24004:15;:24;24020:7;24004:24;;;;;;;;;;;;;;;;;;;;;23997:31;;23815:221;;;:::o;44820:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23338:411::-;23419:13;23435:23;23450:7;23435:14;:23::i;:::-;23419:39;;23483:5;23477:11;;:2;:11;;;;23469:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23577:5;23561:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23586:37;23603:5;23610:12;:10;:12::i;:::-;23586:16;:37::i;:::-;23561:62;23539:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23720:21;23729:2;23733:7;23720:8;:21::i;:::-;23338:411;;;:::o;44940:35::-;;;;;;;;;;;;;:::o;39026:113::-;39087:7;39114:10;:17;;;;39107:24;;39026:113;:::o;24565:339::-;24760:41;24779:12;:10;:12::i;:::-;24793:7;24760:18;:41::i;:::-;24752:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24868:28;24878:4;24884:2;24888:7;24868:9;:28::i;:::-;24565:339;;;:::o;38694:256::-;38791:7;38827:23;38844:5;38827:16;:23::i;:::-;38819:5;:31;38811:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38916:12;:19;38929:5;38916:19;;;;;;;;;;;;;;;:26;38936:5;38916:26;;;;;;;;;;;;38909:33;;38694:256;;;;:::o;45232:55::-;45277:10;45232:55;:::o;50658:263::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50792:9:::1;50787:127;50811:9;;:16;;50807:1;:20;50787:127;;;50886:16;50849:20;:34;50870:9;;50880:1;50870:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50849:34;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;50829:3;;;;;:::i;:::-;;;;50787:127;;;;50658:263:::0;;;:::o;50442:101::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50529:6:::1;50511:15;;:24;;;;;;;;;;;;;;;;;;50442:101:::0;:::o;51200:423::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51438:15:::1;51456:21;51438:39;;51496:10;51488:28;;:37;51517:7;51488:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35111:1;51200:423::o:0;24975:185::-;25113:39;25130:4;25136:2;25140:7;25113:39;;;;;;;;;;;;:16;:39::i;:::-;24975:185;;;:::o;39216:233::-;39291:7;39327:30;:28;:30::i;:::-;39319:5;:38;39311:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39424:10;39435:5;39424:17;;;;;;;;;;;;;;;;;;;;;;;;39417:24;;39216:233;;;:::o;44982:28::-;;;;;;;;;;;;;:::o;48425:109::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48518:8:::1;48499:16;:27;;;;;;;;;;;;:::i;:::-;;48425:109:::0;:::o;50551:99::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50634:8:::1;50617:14;;:25;;;;;;;;;;;;;;;;;;50551:99:::0;:::o;21950:239::-;22022:7;22042:13;22058:7;:16;22066:7;22058:16;;;;;;;;;;;;;;;;;;;;;22042:32;;22110:1;22093:19;;:5;:19;;;;22085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22176:5;22169:12;;;21950:239;;;:::o;21680:208::-;21752:7;21797:1;21780:19;;:5;:19;;;;21772:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21864:9;:16;21874:5;21864:16;;;;;;;;;;;;;;;;21857:23;;21680:208;;;:::o;35471:103::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35536:30:::1;35563:1;35536:18;:30::i;:::-;35471:103::o:0;45174:51::-;45215:10;45174:51;:::o;49693:209::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49749:14:::1;49766:13;:11;:13::i;:::-;49749:30;;49790:9;49819:1;49815:5;;49810:85;49827:1;49822;:6;49810:85;;49850:33;49860:10;49881:1;49872:6;:10;;;;:::i;:::-;49850:9;:33::i;:::-;49830:3;;;;;:::i;:::-;;;;49810:85;;;35111:1;;49693:209:::0;:::o;50160:165::-;50261:5;50291:20;:26;50312:4;50291:26;;;;;;;;;;;;;;;;;;;;;;;;;50284:33;;50160:165;;;:::o;34820:87::-;34866:7;34893:6;;;;;;;;;;;34886:13;;34820:87;:::o;22425:104::-;22481:13;22514:7;22507:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22425:104;:::o;50929:263::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51063:9:::1;51058:127;51082:9;;:16;;51078:1;:20;51058:127;;;51157:16;51120:20;:34;51141:9;;51151:1;51141:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51120:34;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51100:3;;;;;:::i;:::-;;;;51058:127;;;;50929:263:::0;;;:::o;44898:35::-;;;;;;;;;;;;;:::o;47169:788::-;47233:19;47255:13;:11;:13::i;:::-;47233:35;;47301:14;;;;;;;;;;;47279:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45106:1;47430:14;:31;;47408:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;45055:4;47576:14;47562:11;:28;;;;:::i;:::-;:41;;47540:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;47745:9;47727:14;45158:9;47709:32;;;;:::i;:::-;:45;;47687:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;47844:9;47856:1;47844:13;;47839:111;47864:14;47859:1;:19;47839:111;;47900:38;47910:10;47936:1;47922:11;:15;;;;:::i;:::-;47900:9;:38::i;:::-;47880:3;;;;;:::i;:::-;;;;47839:111;;;;47169:788;;:::o;24108:155::-;24203:52;24222:12;:10;:12::i;:::-;24236:8;24246;24203:18;:52::i;:::-;24108:155;;:::o;45473:842::-;45548:19;45570:13;:11;:13::i;:::-;45548:35;;45602:15;;;;;;;;;;;45594:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45716:20;:32;45737:10;45716:32;;;;;;;;;;;;;;;;;;;;;;;;;45698:50;;:14;:50;;;;45676:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;45055:4;45870:14;45856:28;;:11;:28;;;;:::i;:::-;:41;;45834:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;46042:9;46024:14;46003:35;;45277:10;46003:35;;;;:::i;:::-;:48;;45981:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;46172:14;46136:20;:32;46157:10;46136:32;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46202:9;46214:1;46202:13;;46197:111;46222:14;46217:19;;:1;:19;46197:111;;46258:38;46268:10;46294:1;46280:11;:15;;;;:::i;:::-;46258:9;:38::i;:::-;46238:3;;;;;:::i;:::-;;;;46197:111;;;;45473:842;;:::o;49910:69::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49967:4:::1;49956:8;;:15;;;;;;;;;;;;;;;;;;49910:69::o:0;49987:165::-;50088:5;50118:20;:26;50139:4;50118:26;;;;;;;;;;;;;;;;;;;;;;;;;50111:33;;49987:165;;;:::o;46323:838::-;46398:19;46420:13;:11;:13::i;:::-;46398:35;;46452:15;;;;;;;;;;;46444:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46566:20;:32;46587:10;46566:32;;;;;;;;;;;;;;;;;;;;;;;;;46548:50;;:14;:50;;;;46526:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;45055:4;46720:14;46706:28;;:11;:28;;;;:::i;:::-;:41;;46684:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;46888:9;46870:14;46853:31;;45215:10;46853:31;;;;:::i;:::-;:44;;46831:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;47018:14;46982:20;:32;47003:10;46982:32;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47048:9;47060:1;47048:13;;47043:111;47068:14;47063:19;;:1;:19;47043:111;;47104:38;47114:10;47140:1;47126:11;:15;;;;:::i;:::-;47104:9;:38::i;:::-;47084:3;;;;;:::i;:::-;;;;47043:111;;;;46323:838;;:::o;25231:328::-;25406:41;25425:12;:10;:12::i;:::-;25439:7;25406:18;:41::i;:::-;25398:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25512:39;25526:4;25532:2;25536:7;25545:5;25512:13;:39::i;:::-;25231:328;;;;:::o;50333:101::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50420:6:::1;50402:15;;:24;;;;;;;;;;;;;;;;;;50333:101:::0;:::o;44776:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48960:725::-;49078:13;49131:16;49139:7;49131;:16::i;:::-;49109:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49251:5;49239:17;;:8;;;;;;;;;;;:17;;;49235:71;;;49280:14;49273:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49235:71;49318:28;49349:10;:8;:10::i;:::-;49318:41;;49421:1;49396:14;49390:28;:32;:287;;;;;;;;;;;;;;;;;49514:14;49555:18;:7;:16;:18::i;:::-;49600:13;49471:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49390:287;49370:307;;;48960:725;;;;:::o;45066:41::-;45106:1;45066:41;:::o;45019:40::-;45055:4;45019:40;:::o;48667:151::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48793:17:::1;48777:13;:33;;;;;;;;;;;;:::i;:::-;;48667:151:::0;:::o;45116:51::-;45158:9;45116:51;:::o;24334:164::-;24431:4;24455:18;:25;24474:5;24455:25;;;;;;;;;;;;;;;:35;24481:8;24455:35;;;;;;;;;;;;;;;;;;;;;;;;;24448:42;;24334:164;;;;:::o;48826:126::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48929:15:::1;48912:14;:32;;;;;;;;;;;;:::i;:::-;;48826:126:::0;:::o;35729:201::-;35051:12;:10;:12::i;:::-;35040:23;;:7;:5;:7::i;:::-;:23;;;35032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35838:1:::1;35818:22;;:8;:22;;;;35810:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35894:28;35913:8;35894:18;:28::i;:::-;35729:201:::0;:::o;38386:224::-;38488:4;38527:35;38512:50;;;:11;:50;;;;:90;;;;38566:36;38590:11;38566:23;:36::i;:::-;38512:90;38505:97;;38386:224;;;:::o;27069:127::-;27134:4;27186:1;27158:30;;:7;:16;27166:7;27158:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27151:37;;27069:127;;;:::o;16529:98::-;16582:7;16609:10;16602:17;;16529:98;:::o;31051:174::-;31153:2;31126:15;:24;31142:7;31126:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31209:7;31205:2;31171:46;;31180:23;31195:7;31180:14;:23::i;:::-;31171:46;;;;;;;;;;;;31051:174;;:::o;27363:348::-;27456:4;27481:16;27489:7;27481;:16::i;:::-;27473:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27557:13;27573:23;27588:7;27573:14;:23::i;:::-;27557:39;;27626:5;27615:16;;:7;:16;;;:51;;;;27659:7;27635:31;;:20;27647:7;27635:11;:20::i;:::-;:31;;;27615:51;:87;;;;27670:32;27687:5;27694:7;27670:16;:32::i;:::-;27615:87;27607:96;;;27363:348;;;;:::o;30355:578::-;30514:4;30487:31;;:23;30502:7;30487:14;:23::i;:::-;:31;;;30479:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30597:1;30583:16;;:2;:16;;;;30575:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30653:39;30674:4;30680:2;30684:7;30653:20;:39::i;:::-;30757:29;30774:1;30778:7;30757:8;:29::i;:::-;30818:1;30799:9;:15;30809:4;30799:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30847:1;30830:9;:13;30840:2;30830:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30878:2;30859:7;:16;30867:7;30859:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30917:7;30913:2;30898:27;;30907:4;30898:27;;;;;;;;;;;;30355:578;;;:::o;36090:191::-;36164:16;36183:6;;;;;;;;;;;36164:25;;36209:8;36200:6;;:17;;;;;;;;;;;;;;;;;;36264:8;36233:40;;36254:8;36233:40;;;;;;;;;;;;36090:191;;:::o;28053:110::-;28129:26;28139:2;28143:7;28129:26;;;;;;;;;;;;:9;:26::i;:::-;28053:110;;:::o;31367:315::-;31522:8;31513:17;;:5;:17;;;;31505:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31609:8;31571:18;:25;31590:5;31571:25;;;;;;;;;;;;;;;:35;31597:8;31571:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31655:8;31633:41;;31648:5;31633:41;;;31665:8;31633:41;;;;;;:::i;:::-;;;;;;;;31367:315;;;:::o;26441:::-;26598:28;26608:4;26614:2;26618:7;26598:9;:28::i;:::-;26645:48;26668:4;26674:2;26678:7;26687:5;26645:22;:48::i;:::-;26637:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26441:315;;;;:::o;48542:117::-;48602:13;48635:16;48628:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48542:117;:::o;17117:723::-;17173:13;17403:1;17394:5;:10;17390:53;;;17421:10;;;;;;;;;;;;;;;;;;;;;17390:53;17453:12;17468:5;17453:20;;17484:14;17509:78;17524:1;17516:4;:9;17509:78;;17542:8;;;;;:::i;:::-;;;;17573:2;17565:10;;;;;:::i;:::-;;;17509:78;;;17597:19;17629:6;17619:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17597:39;;17647:154;17663:1;17654:5;:10;17647:154;;17691:1;17681:11;;;;;:::i;:::-;;;17758:2;17750:5;:10;;;;:::i;:::-;17737:2;:24;;;;:::i;:::-;17724:39;;17707:6;17714;17707:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17787:2;17778:11;;;;;:::i;:::-;;;17647:154;;;17825:6;17811:21;;;;;17117:723;;;;:::o;21311:305::-;21413:4;21465:25;21450:40;;;:11;:40;;;;:105;;;;21522:33;21507:48;;;:11;:48;;;;21450:105;:158;;;;21572:36;21596:11;21572:23;:36::i;:::-;21450:158;21430:178;;21311:305;;;:::o;47965:215::-;48127:45;48154:4;48160:2;48164:7;48127:26;:45::i;:::-;47965:215;;;:::o;28390:321::-;28520:18;28526:2;28530:7;28520:5;:18::i;:::-;28571:54;28602:1;28606:2;28610:7;28619:5;28571:22;:54::i;:::-;28549:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28390:321;;;:::o;32247:799::-;32402:4;32423:15;:2;:13;;;:15::i;:::-;32419:620;;;32475:2;32459:36;;;32496:12;:10;:12::i;:::-;32510:4;32516:7;32525:5;32459:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32455:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32718:1;32701:6;:13;:18;32697:272;;;32744:60;;;;;;;;;;:::i;:::-;;;;;;;;32697:272;32919:6;32913:13;32904:6;32900:2;32896:15;32889:38;32455:529;32592:41;;;32582:51;;;:6;:51;;;;32575:58;;;;;32419:620;33023:4;33016:11;;32247:799;;;;;;;:::o;19748:157::-;19833:4;19872:25;19857:40;;;:11;:40;;;;19850:47;;19748:157;;;:::o;40062:589::-;40206:45;40233:4;40239:2;40243:7;40206:26;:45::i;:::-;40284:1;40268:18;;:4;:18;;;40264:187;;;40303:40;40335:7;40303:31;:40::i;:::-;40264:187;;;40373:2;40365:10;;:4;:10;;;40361:90;;40392:47;40425:4;40431:7;40392:32;:47::i;:::-;40361:90;40264:187;40479:1;40465:16;;:2;:16;;;40461:183;;;40498:45;40535:7;40498:36;:45::i;:::-;40461:183;;;40571:4;40565:10;;:2;:10;;;40561:83;;40592:40;40620:2;40624:7;40592:27;:40::i;:::-;40561:83;40461:183;40062:589;;;:::o;29047:382::-;29141:1;29127:16;;:2;:16;;;;29119:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29200:16;29208:7;29200;:16::i;:::-;29199:17;29191:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29262:45;29291:1;29295:2;29299:7;29262:20;:45::i;:::-;29337:1;29320:9;:13;29330:2;29320:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29368:2;29349:7;:16;29357:7;29349:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29413:7;29409:2;29388:33;;29405:1;29388:33;;;;;;;;;;;;29047:382;;:::o;8510:387::-;8570:4;8778:12;8845:7;8833:20;8825:28;;8888:1;8881:4;:8;8874:15;;;8510:387;;;:::o;33618:126::-;;;;:::o;41374:164::-;41478:10;:17;;;;41451:15;:24;41467:7;41451:24;;;;;;;;;;;:44;;;;41506:10;41522:7;41506:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41374:164;:::o;42165:988::-;42431:22;42481:1;42456:22;42473:4;42456:16;:22::i;:::-;:26;;;;:::i;:::-;42431:51;;42493:18;42514:17;:26;42532:7;42514:26;;;;;;;;;;;;42493:47;;42661:14;42647:10;:28;42643:328;;42692:19;42714:12;:18;42727:4;42714:18;;;;;;;;;;;;;;;:34;42733:14;42714:34;;;;;;;;;;;;42692:56;;42798:11;42765:12;:18;42778:4;42765:18;;;;;;;;;;;;;;;:30;42784:10;42765:30;;;;;;;;;;;:44;;;;42915:10;42882:17;:30;42900:11;42882:30;;;;;;;;;;;:43;;;;42643:328;;43067:17;:26;43085:7;43067:26;;;;;;;;;;;43060:33;;;43111:12;:18;43124:4;43111:18;;;;;;;;;;;;;;;:34;43130:14;43111:34;;;;;;;;;;;43104:41;;;42165:988;;;;:::o;43448:1079::-;43701:22;43746:1;43726:10;:17;;;;:21;;;;:::i;:::-;43701:46;;43758:18;43779:15;:24;43795:7;43779:24;;;;;;;;;;;;43758:45;;44130:19;44152:10;44163:14;44152:26;;;;;;;;;;;;;;;;;;;;;;;;44130:48;;44216:11;44191:10;44202;44191:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44327:10;44296:15;:28;44312:11;44296:28;;;;;;;;;;;:41;;;;44468:15;:24;44484:7;44468:24;;;;;;;;;;;44461:31;;;44503:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43448:1079;;;;:::o;40952:221::-;41037:14;41054:20;41071:2;41054:16;:20::i;:::-;41037:37;;41112:7;41085:12;:16;41098:2;41085:16;;;;;;;;;;;;;;;:24;41102:6;41085:24;;;;;;;;;;;:34;;;;41159:6;41130:17;:26;41148:7;41130:26;;;;;;;;;;;:35;;;;40952:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1426:5;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;1580:5;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;1739:5;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;2031:5;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;2300:5;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:135::-;2443:5;2481:6;2468:20;2459:29;;2497:31;2522:5;2497:31;:::i;:::-;2449:85;;;;:::o;2540:262::-;2599:6;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2664:1;2661;2654:12;2616:2;2707:1;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2678:117;2606:196;;;;:::o;2808:407::-;2876:6;2884;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2949:1;2946;2939:12;2901:2;2992:1;3017:53;3062:7;3053:6;3042:9;3038:22;3017:53;:::i;:::-;3007:63;;2963:117;3119:2;3145:53;3190:7;3181:6;3170:9;3166:22;3145:53;:::i;:::-;3135:63;;3090:118;2891:324;;;;;:::o;3221:552::-;3298:6;3306;3314;3363:2;3351:9;3342:7;3338:23;3334:32;3331:2;;;3379:1;3376;3369:12;3331:2;3422:1;3447:53;3492:7;3483:6;3472:9;3468:22;3447:53;:::i;:::-;3437:63;;3393:117;3549:2;3575:53;3620:7;3611:6;3600:9;3596:22;3575:53;:::i;:::-;3565:63;;3520:118;3677:2;3703:53;3748:7;3739:6;3728:9;3724:22;3703:53;:::i;:::-;3693:63;;3648:118;3321:452;;;;;:::o;3779:809::-;3874:6;3882;3890;3898;3947:3;3935:9;3926:7;3922:23;3918:33;3915:2;;;3964:1;3961;3954:12;3915:2;4007:1;4032:53;4077:7;4068:6;4057:9;4053:22;4032:53;:::i;:::-;4022:63;;3978:117;4134:2;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4105:118;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4418:2;4407:9;4403:18;4390:32;4449:18;4441:6;4438:30;4435:2;;;4481:1;4478;4471:12;4435:2;4509:62;4563:7;4554:6;4543:9;4539:22;4509:62;:::i;:::-;4499:72;;4361:220;3905:683;;;;;;;:::o;4594:401::-;4659:6;4667;4716:2;4704:9;4695:7;4691:23;4687:32;4684:2;;;4732:1;4729;4722:12;4684:2;4775:1;4800:53;4845:7;4836:6;4825:9;4821:22;4800:53;:::i;:::-;4790:63;;4746:117;4902:2;4928:50;4970:7;4961:6;4950:9;4946:22;4928:50;:::i;:::-;4918:60;;4873:115;4674:321;;;;;:::o;5001:407::-;5069:6;5077;5126:2;5114:9;5105:7;5101:23;5097:32;5094:2;;;5142:1;5139;5132:12;5094:2;5185:1;5210:53;5255:7;5246:6;5235:9;5231:22;5210:53;:::i;:::-;5200:63;;5156:117;5312:2;5338:53;5383:7;5374:6;5363:9;5359:22;5338:53;:::i;:::-;5328:63;;5283:118;5084:324;;;;;:::o;5414:566::-;5507:6;5515;5523;5572:2;5560:9;5551:7;5547:23;5543:32;5540:2;;;5588:1;5585;5578:12;5540:2;5659:1;5648:9;5644:17;5631:31;5689:18;5681:6;5678:30;5675:2;;;5721:1;5718;5711:12;5675:2;5757:80;5829:7;5820:6;5809:9;5805:22;5757:80;:::i;:::-;5739:98;;;;5602:245;5886:2;5912:51;5955:7;5946:6;5935:9;5931:22;5912:51;:::i;:::-;5902:61;;5857:116;5530:450;;;;;:::o;5986:256::-;6042:6;6091:2;6079:9;6070:7;6066:23;6062:32;6059:2;;;6107:1;6104;6097:12;6059:2;6150:1;6175:50;6217:7;6208:6;6197:9;6193:22;6175:50;:::i;:::-;6165:60;;6121:114;6049:193;;;;:::o;6248:260::-;6306:6;6355:2;6343:9;6334:7;6330:23;6326:32;6323:2;;;6371:1;6368;6361:12;6323:2;6414:1;6439:52;6483:7;6474:6;6463:9;6459:22;6439:52;:::i;:::-;6429:62;;6385:116;6313:195;;;;:::o;6514:282::-;6583:6;6632:2;6620:9;6611:7;6607:23;6603:32;6600:2;;;6648:1;6645;6638:12;6600:2;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6590:206;;;;:::o;6802:375::-;6871:6;6920:2;6908:9;6899:7;6895:23;6891:32;6888:2;;;6936:1;6933;6926:12;6888:2;7007:1;6996:9;6992:17;6979:31;7037:18;7029:6;7026:30;7023:2;;;7069:1;7066;7059:12;7023:2;7097:63;7152:7;7143:6;7132:9;7128:22;7097:63;:::i;:::-;7087:73;;6950:220;6878:299;;;;:::o;7183:262::-;7242:6;7291:2;7279:9;7270:7;7266:23;7262:32;7259:2;;;7307:1;7304;7297:12;7259:2;7350:1;7375:53;7420:7;7411:6;7400:9;7396:22;7375:53;:::i;:::-;7365:63;;7321:117;7249:196;;;;:::o;7451:258::-;7508:6;7557:2;7545:9;7536:7;7532:23;7528:32;7525:2;;;7573:1;7570;7563:12;7525:2;7616:1;7641:51;7684:7;7675:6;7664:9;7660:22;7641:51;:::i;:::-;7631:61;;7587:115;7515:194;;;;:::o;7715:118::-;7802:24;7820:5;7802:24;:::i;:::-;7797:3;7790:37;7780:53;;:::o;7839:109::-;7920:21;7935:5;7920:21;:::i;:::-;7915:3;7908:34;7898:50;;:::o;7954:360::-;8040:3;8068:38;8100:5;8068:38;:::i;:::-;8122:70;8185:6;8180:3;8122:70;:::i;:::-;8115:77;;8201:52;8246:6;8241:3;8234:4;8227:5;8223:16;8201:52;:::i;:::-;8278:29;8300:6;8278:29;:::i;:::-;8273:3;8269:39;8262:46;;8044:270;;;;;:::o;8320:364::-;8408:3;8436:39;8469:5;8436:39;:::i;:::-;8491:71;8555:6;8550:3;8491:71;:::i;:::-;8484:78;;8571:52;8616:6;8611:3;8604:4;8597:5;8593:16;8571:52;:::i;:::-;8648:29;8670:6;8648:29;:::i;:::-;8643:3;8639:39;8632:46;;8412:272;;;;;:::o;8690:377::-;8796:3;8824:39;8857:5;8824:39;:::i;:::-;8879:89;8961:6;8956:3;8879:89;:::i;:::-;8872:96;;8977:52;9022:6;9017:3;9010:4;9003:5;8999:16;8977:52;:::i;:::-;9054:6;9049:3;9045:16;9038:23;;8800:267;;;;;:::o;9097:845::-;9200:3;9237:5;9231:12;9266:36;9292:9;9266:36;:::i;:::-;9318:89;9400:6;9395:3;9318:89;:::i;:::-;9311:96;;9438:1;9427:9;9423:17;9454:1;9449:137;;;;9600:1;9595:341;;;;9416:520;;9449:137;9533:4;9529:9;9518;9514:25;9509:3;9502:38;9569:6;9564:3;9560:16;9553:23;;9449:137;;9595:341;9662:38;9694:5;9662:38;:::i;:::-;9722:1;9736:154;9750:6;9747:1;9744:13;9736:154;;;9824:7;9818:14;9814:1;9809:3;9805:11;9798:35;9874:1;9865:7;9861:15;9850:26;;9772:4;9769:1;9765:12;9760:17;;9736:154;;;9919:6;9914:3;9910:16;9903:23;;9602:334;;9416:520;;9204:738;;;;;;:::o;9948:366::-;10090:3;10111:67;10175:2;10170:3;10111:67;:::i;:::-;10104:74;;10187:93;10276:3;10187:93;:::i;:::-;10305:2;10300:3;10296:12;10289:19;;10094:220;;;:::o;10320:366::-;10462:3;10483:67;10547:2;10542:3;10483:67;:::i;:::-;10476:74;;10559:93;10648:3;10559:93;:::i;:::-;10677:2;10672:3;10668:12;10661:19;;10466:220;;;:::o;10692:366::-;10834:3;10855:67;10919:2;10914:3;10855:67;:::i;:::-;10848:74;;10931:93;11020:3;10931:93;:::i;:::-;11049:2;11044:3;11040:12;11033:19;;10838:220;;;:::o;11064:366::-;11206:3;11227:67;11291:2;11286:3;11227:67;:::i;:::-;11220:74;;11303:93;11392:3;11303:93;:::i;:::-;11421:2;11416:3;11412:12;11405:19;;11210:220;;;:::o;11436:366::-;11578:3;11599:67;11663:2;11658:3;11599:67;:::i;:::-;11592:74;;11675:93;11764:3;11675:93;:::i;:::-;11793:2;11788:3;11784:12;11777:19;;11582:220;;;:::o;11808:366::-;11950:3;11971:67;12035:2;12030:3;11971:67;:::i;:::-;11964:74;;12047:93;12136:3;12047:93;:::i;:::-;12165:2;12160:3;12156:12;12149:19;;11954:220;;;:::o;12180:366::-;12322:3;12343:67;12407:2;12402:3;12343:67;:::i;:::-;12336:74;;12419:93;12508:3;12419:93;:::i;:::-;12537:2;12532:3;12528:12;12521:19;;12326:220;;;:::o;12552:366::-;12694:3;12715:67;12779:2;12774:3;12715:67;:::i;:::-;12708:74;;12791:93;12880:3;12791:93;:::i;:::-;12909:2;12904:3;12900:12;12893:19;;12698:220;;;:::o;12924:366::-;13066:3;13087:67;13151:2;13146:3;13087:67;:::i;:::-;13080:74;;13163:93;13252:3;13163:93;:::i;:::-;13281:2;13276:3;13272:12;13265:19;;13070:220;;;:::o;13296:366::-;13438:3;13459:67;13523:2;13518:3;13459:67;:::i;:::-;13452:74;;13535:93;13624:3;13535:93;:::i;:::-;13653:2;13648:3;13644:12;13637:19;;13442:220;;;:::o;13668:366::-;13810:3;13831:67;13895:2;13890:3;13831:67;:::i;:::-;13824:74;;13907:93;13996:3;13907:93;:::i;:::-;14025:2;14020:3;14016:12;14009:19;;13814:220;;;:::o;14040:366::-;14182:3;14203:67;14267:2;14262:3;14203:67;:::i;:::-;14196:74;;14279:93;14368:3;14279:93;:::i;:::-;14397:2;14392:3;14388:12;14381:19;;14186:220;;;:::o;14412:366::-;14554:3;14575:67;14639:2;14634:3;14575:67;:::i;:::-;14568:74;;14651:93;14740:3;14651:93;:::i;:::-;14769:2;14764:3;14760:12;14753:19;;14558:220;;;:::o;14784:366::-;14926:3;14947:67;15011:2;15006:3;14947:67;:::i;:::-;14940:74;;15023:93;15112:3;15023:93;:::i;:::-;15141:2;15136:3;15132:12;15125:19;;14930:220;;;:::o;15156:366::-;15298:3;15319:67;15383:2;15378:3;15319:67;:::i;:::-;15312:74;;15395:93;15484:3;15395:93;:::i;:::-;15513:2;15508:3;15504:12;15497:19;;15302:220;;;:::o;15528:366::-;15670:3;15691:67;15755:2;15750:3;15691:67;:::i;:::-;15684:74;;15767:93;15856:3;15767:93;:::i;:::-;15885:2;15880:3;15876:12;15869:19;;15674:220;;;:::o;15900:366::-;16042:3;16063:67;16127:2;16122:3;16063:67;:::i;:::-;16056:74;;16139:93;16228:3;16139:93;:::i;:::-;16257:2;16252:3;16248:12;16241:19;;16046:220;;;:::o;16272:366::-;16414:3;16435:67;16499:2;16494:3;16435:67;:::i;:::-;16428:74;;16511:93;16600:3;16511:93;:::i;:::-;16629:2;16624:3;16620:12;16613:19;;16418:220;;;:::o;16644:366::-;16786:3;16807:67;16871:2;16866:3;16807:67;:::i;:::-;16800:74;;16883:93;16972:3;16883:93;:::i;:::-;17001:2;16996:3;16992:12;16985:19;;16790:220;;;:::o;17016:366::-;17158:3;17179:67;17243:2;17238:3;17179:67;:::i;:::-;17172:74;;17255:93;17344:3;17255:93;:::i;:::-;17373:2;17368:3;17364:12;17357:19;;17162:220;;;:::o;17388:366::-;17530:3;17551:67;17615:2;17610:3;17551:67;:::i;:::-;17544:74;;17627:93;17716:3;17627:93;:::i;:::-;17745:2;17740:3;17736:12;17729:19;;17534:220;;;:::o;17760:366::-;17902:3;17923:67;17987:2;17982:3;17923:67;:::i;:::-;17916:74;;17999:93;18088:3;17999:93;:::i;:::-;18117:2;18112:3;18108:12;18101:19;;17906:220;;;:::o;18132:366::-;18274:3;18295:67;18359:2;18354:3;18295:67;:::i;:::-;18288:74;;18371:93;18460:3;18371:93;:::i;:::-;18489:2;18484:3;18480:12;18473:19;;18278:220;;;:::o;18504:366::-;18646:3;18667:67;18731:2;18726:3;18667:67;:::i;:::-;18660:74;;18743:93;18832:3;18743:93;:::i;:::-;18861:2;18856:3;18852:12;18845:19;;18650:220;;;:::o;18876:366::-;19018:3;19039:67;19103:2;19098:3;19039:67;:::i;:::-;19032:74;;19115:93;19204:3;19115:93;:::i;:::-;19233:2;19228:3;19224:12;19217:19;;19022:220;;;:::o;19248:118::-;19335:24;19353:5;19335:24;:::i;:::-;19330:3;19323:37;19313:53;;:::o;19372:112::-;19455:22;19471:5;19455:22;:::i;:::-;19450:3;19443:35;19433:51;;:::o;19490:589::-;19715:3;19737:95;19828:3;19819:6;19737:95;:::i;:::-;19730:102;;19849:95;19940:3;19931:6;19849:95;:::i;:::-;19842:102;;19961:92;20049:3;20040:6;19961:92;:::i;:::-;19954:99;;20070:3;20063:10;;19719:360;;;;;;:::o;20085:222::-;20178:4;20216:2;20205:9;20201:18;20193:26;;20229:71;20297:1;20286:9;20282:17;20273:6;20229:71;:::i;:::-;20183:124;;;;:::o;20313:640::-;20508:4;20546:3;20535:9;20531:19;20523:27;;20560:71;20628:1;20617:9;20613:17;20604:6;20560:71;:::i;:::-;20641:72;20709:2;20698:9;20694:18;20685:6;20641:72;:::i;:::-;20723;20791:2;20780:9;20776:18;20767:6;20723:72;:::i;:::-;20842:9;20836:4;20832:20;20827:2;20816:9;20812:18;20805:48;20870:76;20941:4;20932:6;20870:76;:::i;:::-;20862:84;;20513:440;;;;;;;:::o;20959:210::-;21046:4;21084:2;21073:9;21069:18;21061:26;;21097:65;21159:1;21148:9;21144:17;21135:6;21097:65;:::i;:::-;21051:118;;;;:::o;21175:313::-;21288:4;21326:2;21315:9;21311:18;21303:26;;21375:9;21369:4;21365:20;21361:1;21350:9;21346:17;21339:47;21403:78;21476:4;21467:6;21403:78;:::i;:::-;21395:86;;21293:195;;;;:::o;21494:419::-;21660:4;21698:2;21687:9;21683:18;21675:26;;21747:9;21741:4;21737:20;21733:1;21722:9;21718:17;21711:47;21775:131;21901:4;21775:131;:::i;:::-;21767:139;;21665:248;;;:::o;21919:419::-;22085:4;22123:2;22112:9;22108:18;22100:26;;22172:9;22166:4;22162:20;22158:1;22147:9;22143:17;22136:47;22200:131;22326:4;22200:131;:::i;:::-;22192:139;;22090:248;;;:::o;22344:419::-;22510:4;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:131;22751:4;22625:131;:::i;:::-;22617:139;;22515:248;;;:::o;22769:419::-;22935:4;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22940:248;;;:::o;23194:419::-;23360:4;23398:2;23387:9;23383:18;23375:26;;23447:9;23441:4;23437:20;23433:1;23422:9;23418:17;23411:47;23475:131;23601:4;23475:131;:::i;:::-;23467:139;;23365:248;;;:::o;23619:419::-;23785:4;23823:2;23812:9;23808:18;23800:26;;23872:9;23866:4;23862:20;23858:1;23847:9;23843:17;23836:47;23900:131;24026:4;23900:131;:::i;:::-;23892:139;;23790:248;;;:::o;24044:419::-;24210:4;24248:2;24237:9;24233:18;24225:26;;24297:9;24291:4;24287:20;24283:1;24272:9;24268:17;24261:47;24325:131;24451:4;24325:131;:::i;:::-;24317:139;;24215:248;;;:::o;24469:419::-;24635:4;24673:2;24662:9;24658:18;24650:26;;24722:9;24716:4;24712:20;24708:1;24697:9;24693:17;24686:47;24750:131;24876:4;24750:131;:::i;:::-;24742:139;;24640:248;;;:::o;24894:419::-;25060:4;25098:2;25087:9;25083:18;25075:26;;25147:9;25141:4;25137:20;25133:1;25122:9;25118:17;25111:47;25175:131;25301:4;25175:131;:::i;:::-;25167:139;;25065:248;;;:::o;25319:419::-;25485:4;25523:2;25512:9;25508:18;25500:26;;25572:9;25566:4;25562:20;25558:1;25547:9;25543:17;25536:47;25600:131;25726:4;25600:131;:::i;:::-;25592:139;;25490:248;;;:::o;25744:419::-;25910:4;25948:2;25937:9;25933:18;25925:26;;25997:9;25991:4;25987:20;25983:1;25972:9;25968:17;25961:47;26025:131;26151:4;26025:131;:::i;:::-;26017:139;;25915:248;;;:::o;26169:419::-;26335:4;26373:2;26362:9;26358:18;26350:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26450:131;26576:4;26450:131;:::i;:::-;26442:139;;26340:248;;;:::o;26594:419::-;26760:4;26798:2;26787:9;26783:18;26775:26;;26847:9;26841:4;26837:20;26833:1;26822:9;26818:17;26811:47;26875:131;27001:4;26875:131;:::i;:::-;26867:139;;26765:248;;;:::o;27019:419::-;27185:4;27223:2;27212:9;27208:18;27200:26;;27272:9;27266:4;27262:20;27258:1;27247:9;27243:17;27236:47;27300:131;27426:4;27300:131;:::i;:::-;27292:139;;27190:248;;;:::o;27444:419::-;27610:4;27648:2;27637:9;27633:18;27625:26;;27697:9;27691:4;27687:20;27683:1;27672:9;27668:17;27661:47;27725:131;27851:4;27725:131;:::i;:::-;27717:139;;27615:248;;;:::o;27869:419::-;28035:4;28073:2;28062:9;28058:18;28050:26;;28122:9;28116:4;28112:20;28108:1;28097:9;28093:17;28086:47;28150:131;28276:4;28150:131;:::i;:::-;28142:139;;28040:248;;;:::o;28294:419::-;28460:4;28498:2;28487:9;28483:18;28475:26;;28547:9;28541:4;28537:20;28533:1;28522:9;28518:17;28511:47;28575:131;28701:4;28575:131;:::i;:::-;28567:139;;28465:248;;;:::o;28719:419::-;28885:4;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28890:248;;;:::o;29144:419::-;29310:4;29348:2;29337:9;29333:18;29325:26;;29397:9;29391:4;29387:20;29383:1;29372:9;29368:17;29361:47;29425:131;29551:4;29425:131;:::i;:::-;29417:139;;29315:248;;;:::o;29569:419::-;29735:4;29773:2;29762:9;29758:18;29750:26;;29822:9;29816:4;29812:20;29808:1;29797:9;29793:17;29786:47;29850:131;29976:4;29850:131;:::i;:::-;29842:139;;29740:248;;;:::o;29994:419::-;30160:4;30198:2;30187:9;30183:18;30175:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30275:131;30401:4;30275:131;:::i;:::-;30267:139;;30165:248;;;:::o;30419:419::-;30585:4;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30590:248;;;:::o;30844:419::-;31010:4;31048:2;31037:9;31033:18;31025:26;;31097:9;31091:4;31087:20;31083:1;31072:9;31068:17;31061:47;31125:131;31251:4;31125:131;:::i;:::-;31117:139;;31015:248;;;:::o;31269:419::-;31435:4;31473:2;31462:9;31458:18;31450:26;;31522:9;31516:4;31512:20;31508:1;31497:9;31493:17;31486:47;31550:131;31676:4;31550:131;:::i;:::-;31542:139;;31440:248;;;:::o;31694:419::-;31860:4;31898:2;31887:9;31883:18;31875:26;;31947:9;31941:4;31937:20;31933:1;31922:9;31918:17;31911:47;31975:131;32101:4;31975:131;:::i;:::-;31967:139;;31865:248;;;:::o;32119:222::-;32212:4;32250:2;32239:9;32235:18;32227:26;;32263:71;32331:1;32320:9;32316:17;32307:6;32263:71;:::i;:::-;32217:124;;;;:::o;32347:214::-;32436:4;32474:2;32463:9;32459:18;32451:26;;32487:67;32551:1;32540:9;32536:17;32527:6;32487:67;:::i;:::-;32441:120;;;;:::o;32567:129::-;32601:6;32628:20;;:::i;:::-;32618:30;;32657:33;32685:4;32677:6;32657:33;:::i;:::-;32608:88;;;:::o;32702:75::-;32735:6;32768:2;32762:9;32752:19;;32742:35;:::o;32783:307::-;32844:4;32934:18;32926:6;32923:30;32920:2;;;32956:18;;:::i;:::-;32920:2;32994:29;33016:6;32994:29;:::i;:::-;32986:37;;33078:4;33072;33068:15;33060:23;;32849:241;;;:::o;33096:308::-;33158:4;33248:18;33240:6;33237:30;33234:2;;;33270:18;;:::i;:::-;33234:2;33308:29;33330:6;33308:29;:::i;:::-;33300:37;;33392:4;33386;33382:15;33374:23;;33163:241;;;:::o;33410:141::-;33459:4;33482:3;33474:11;;33505:3;33502:1;33495:14;33539:4;33536:1;33526:18;33518:26;;33464:87;;;:::o;33557:98::-;33608:6;33642:5;33636:12;33626:22;;33615:40;;;:::o;33661:99::-;33713:6;33747:5;33741:12;33731:22;;33720:40;;;:::o;33766:168::-;33849:11;33883:6;33878:3;33871:19;33923:4;33918:3;33914:14;33899:29;;33861:73;;;;:::o;33940:169::-;34024:11;34058:6;34053:3;34046:19;34098:4;34093:3;34089:14;34074:29;;34036:73;;;;:::o;34115:148::-;34217:11;34254:3;34239:18;;34229:34;;;;:::o;34269:305::-;34309:3;34328:20;34346:1;34328:20;:::i;:::-;34323:25;;34362:20;34380:1;34362:20;:::i;:::-;34357:25;;34516:1;34448:66;34444:74;34441:1;34438:81;34435:2;;;34522:18;;:::i;:::-;34435:2;34566:1;34563;34559:9;34552:16;;34313:261;;;;:::o;34580:185::-;34620:1;34637:20;34655:1;34637:20;:::i;:::-;34632:25;;34671:20;34689:1;34671:20;:::i;:::-;34666:25;;34710:1;34700:2;;34715:18;;:::i;:::-;34700:2;34757:1;34754;34750:9;34745:14;;34622:143;;;;:::o;34771:348::-;34811:7;34834:20;34852:1;34834:20;:::i;:::-;34829:25;;34868:20;34886:1;34868:20;:::i;:::-;34863:25;;35056:1;34988:66;34984:74;34981:1;34978:81;34973:1;34966:9;34959:17;34955:105;34952:2;;;35063:18;;:::i;:::-;34952:2;35111:1;35108;35104:9;35093:20;;34819:300;;;;:::o;35125:191::-;35165:4;35185:20;35203:1;35185:20;:::i;:::-;35180:25;;35219:20;35237:1;35219:20;:::i;:::-;35214:25;;35258:1;35255;35252:8;35249:2;;;35263:18;;:::i;:::-;35249:2;35308:1;35305;35301:9;35293:17;;35170:146;;;;:::o;35322:185::-;35360:4;35380:18;35396:1;35380:18;:::i;:::-;35375:23;;35412:18;35428:1;35412:18;:::i;:::-;35407:23;;35449:1;35446;35443:8;35440:2;;;35454:18;;:::i;:::-;35440:2;35499:1;35496;35492:9;35484:17;;35365:142;;;;:::o;35513:96::-;35550:7;35579:24;35597:5;35579:24;:::i;:::-;35568:35;;35558:51;;;:::o;35615:90::-;35649:7;35692:5;35685:13;35678:21;35667:32;;35657:48;;;:::o;35711:149::-;35747:7;35787:66;35780:5;35776:78;35765:89;;35755:105;;;:::o;35866:126::-;35903:7;35943:42;35936:5;35932:54;35921:65;;35911:81;;;:::o;35998:77::-;36035:7;36064:5;36053:16;;36043:32;;;:::o;36081:86::-;36116:7;36156:4;36149:5;36145:16;36134:27;;36124:43;;;:::o;36173:154::-;36257:6;36252:3;36247;36234:30;36319:1;36310:6;36305:3;36301:16;36294:27;36224:103;;;:::o;36333:307::-;36401:1;36411:113;36425:6;36422:1;36419:13;36411:113;;;36510:1;36505:3;36501:11;36495:18;36491:1;36486:3;36482:11;36475:39;36447:2;36444:1;36440:10;36435:15;;36411:113;;;36542:6;36539:1;36536:13;36533:2;;;36622:1;36613:6;36608:3;36604:16;36597:27;36533:2;36382:258;;;;:::o;36646:320::-;36690:6;36727:1;36721:4;36717:12;36707:22;;36774:1;36768:4;36764:12;36795:18;36785:2;;36851:4;36843:6;36839:17;36829:27;;36785:2;36913;36905:6;36902:14;36882:18;36879:38;36876:2;;;36932:18;;:::i;:::-;36876:2;36697:269;;;;:::o;36972:281::-;37055:27;37077:4;37055:27;:::i;:::-;37047:6;37043:40;37185:6;37173:10;37170:22;37149:18;37137:10;37134:34;37131:62;37128:2;;;37196:18;;:::i;:::-;37128:2;37236:10;37232:2;37225:22;37015:238;;;:::o;37259:233::-;37298:3;37321:24;37339:5;37321:24;:::i;:::-;37312:33;;37367:66;37360:5;37357:77;37354:2;;;37437:18;;:::i;:::-;37354:2;37484:1;37477:5;37473:13;37466:20;;37302:190;;;:::o;37498:176::-;37530:1;37547:20;37565:1;37547:20;:::i;:::-;37542:25;;37581:20;37599:1;37581:20;:::i;:::-;37576:25;;37620:1;37610:2;;37625:18;;:::i;:::-;37610:2;37666:1;37663;37659:9;37654:14;;37532:142;;;;:::o;37680:180::-;37728:77;37725:1;37718:88;37825:4;37822:1;37815:15;37849:4;37846:1;37839:15;37866:180;37914:77;37911:1;37904:88;38011:4;38008:1;38001:15;38035:4;38032:1;38025:15;38052:180;38100:77;38097:1;38090:88;38197:4;38194:1;38187:15;38221:4;38218:1;38211:15;38238:180;38286:77;38283:1;38276:88;38383:4;38380:1;38373:15;38407:4;38404:1;38397:15;38424:102;38465:6;38516:2;38512:7;38507:2;38500:5;38496:14;38492:28;38482:38;;38472:54;;;:::o;38532:230::-;38672:34;38668:1;38660:6;38656:14;38649:58;38741:13;38736:2;38728:6;38724:15;38717:38;38638:124;:::o;38768:237::-;38908:34;38904:1;38896:6;38892:14;38885:58;38977:20;38972:2;38964:6;38960:15;38953:45;38874:131;:::o;39011:225::-;39151:34;39147:1;39139:6;39135:14;39128:58;39220:8;39215:2;39207:6;39203:15;39196:33;39117:119;:::o;39242:178::-;39382:30;39378:1;39370:6;39366:14;39359:54;39348:72;:::o;39426:230::-;39566:34;39562:1;39554:6;39550:14;39543:58;39635:13;39630:2;39622:6;39618:15;39611:38;39532:124;:::o;39662:223::-;39802:34;39798:1;39790:6;39786:14;39779:58;39871:6;39866:2;39858:6;39854:15;39847:31;39768:117;:::o;39891:175::-;40031:27;40027:1;40019:6;40015:14;40008:51;39997:69;:::o;40072:231::-;40212:34;40208:1;40200:6;40196:14;40189:58;40281:14;40276:2;40268:6;40264:15;40257:39;40178:125;:::o;40309:241::-;40449:34;40445:1;40437:6;40433:14;40426:58;40518:24;40513:2;40505:6;40501:15;40494:49;40415:135;:::o;40556:231::-;40696:34;40692:1;40684:6;40680:14;40673:58;40765:14;40760:2;40752:6;40748:15;40741:39;40662:125;:::o;40793:243::-;40933:34;40929:1;40921:6;40917:14;40910:58;41002:26;40997:2;40989:6;40985:15;40978:51;40899:137;:::o;41042:229::-;41182:34;41178:1;41170:6;41166:14;41159:58;41251:12;41246:2;41238:6;41234:15;41227:37;41148:123;:::o;41277:228::-;41417:34;41413:1;41405:6;41401:14;41394:58;41486:11;41481:2;41473:6;41469:15;41462:36;41383:122;:::o;41511:182::-;41651:34;41647:1;41639:6;41635:14;41628:58;41617:76;:::o;41699:231::-;41839:34;41835:1;41827:6;41823:14;41816:58;41908:14;41903:2;41895:6;41891:15;41884:39;41805:125;:::o;41936:182::-;42076:34;42072:1;42064:6;42060:14;42053:58;42042:76;:::o;42124:228::-;42264:34;42260:1;42252:6;42248:14;42241:58;42333:11;42328:2;42320:6;42316:15;42309:36;42230:122;:::o;42358:234::-;42498:34;42494:1;42486:6;42482:14;42475:58;42567:17;42562:2;42554:6;42550:15;42543:42;42464:128;:::o;42598:220::-;42738:34;42734:1;42726:6;42722:14;42715:58;42807:3;42802:2;42794:6;42790:15;42783:28;42704:114;:::o;42824:234::-;42964:34;42960:1;42952:6;42948:14;42941:58;43033:17;43028:2;43020:6;43016:15;43009:42;42930:128;:::o;43064:230::-;43204:34;43200:1;43192:6;43188:14;43181:58;43273:13;43268:2;43260:6;43256:15;43249:38;43170:124;:::o;43300:236::-;43440:34;43436:1;43428:6;43424:14;43417:58;43509:19;43504:2;43496:6;43492:15;43485:44;43406:130;:::o;43542:231::-;43682:34;43678:1;43670:6;43666:14;43659:58;43751:14;43746:2;43738:6;43734:15;43727:39;43648:125;:::o;43779:232::-;43919:34;43915:1;43907:6;43903:14;43896:58;43988:15;43983:2;43975:6;43971:15;43964:40;43885:126;:::o;44017:227::-;44157:34;44153:1;44145:6;44141:14;44134:58;44226:10;44221:2;44213:6;44209:15;44202:35;44123:121;:::o;44250:122::-;44323:24;44341:5;44323:24;:::i;:::-;44316:5;44313:35;44303:2;;44362:1;44359;44352:12;44303:2;44293:79;:::o;44378:116::-;44448:21;44463:5;44448:21;:::i;:::-;44441:5;44438:32;44428:2;;44484:1;44481;44474:12;44428:2;44418:76;:::o;44500:120::-;44572:23;44589:5;44572:23;:::i;:::-;44565:5;44562:34;44552:2;;44610:1;44607;44600:12;44552:2;44542:78;:::o;44626:122::-;44699:24;44717:5;44699:24;:::i;:::-;44692:5;44689:35;44679:2;;44738:1;44735;44728:12;44679:2;44669:79;:::o;44754:118::-;44825:22;44841:5;44825:22;:::i;:::-;44818:5;44815:33;44805:2;;44862:1;44859;44852:12;44805:2;44795:77;:::o

Swarm Source

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