ETH Price: $3,326.36 (-1.02%)

Token

GossApeGirl (GG)
 

Overview

Max Total Supply

7,000 GG

Holders

2,961

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 GG
0x2b1b60e1f520b2561885f51ef6160d854846b3b6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The GossApe Girl is a collection of 7,000 unique GossApe Girl NFTs living on the Ethereum blockchain. Our mission is to represent inclusivity, equality and beauty to the NFT space.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GossApeGirl

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// 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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721.sol

// 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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721Receiver.sol

// 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: node_modules\@openzeppelin\contracts\token\ERC721\extensions\IERC721Metadata.sol

// 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: node_modules\@openzeppelin\contracts\utils\Address.sol

// 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: node_modules\@openzeppelin\contracts\utils\Context.sol

// 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: node_modules\@openzeppelin\contracts\utils\Strings.sol

// 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: node_modules\@openzeppelin\contracts\utils\introspection\ERC165.sol

// 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\ERC721.sol

// 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\Ownable.sol

// 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\utils\cryptography\MerkleProof.sol

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: contracts\GossapeGirl.sol


pragma solidity ^0.8.0;




contract GossApeGirl is ERC721, Ownable  {
    //static variables
    uint256 public mintPrice = 0.049 ether;
    uint256 public mintPriceWhitelist = 0.03 ether;
    uint256 public maxSupply = 7000;
    uint256 public whitelistMaxPerTransaction = 5;
    uint256 public whitelistMaxPerWallet = 5;
    uint256 public publicMaxPerTransaction = 5;

    //state variables
    uint256 public whitelistStartSaleTimestamp = 0;
    uint256 public publicStartSaleTimestamp = 0; 

    //whitelisting variables
    bytes32 public root;

    //contract variables
    string public _baseURI_;

    //trackers
    uint256 public totalSupply = 0;
    mapping(address => uint256) public whitelistWalletMints;

    //withdraw wallet
    address payable public withdrawTo = payable(0x2C9bc65010D5ECC8d2F7dCe5DC492bE506593DfB);

    constructor() ERC721("GossApeGirl", "GG") {
        
    }

    //minting
    function mintMany(address _address, uint256 quantity) private {
        for (uint256 i = 0; i < quantity; i++) {
            mint(_address);
        }
    }
    function mint(address _address) internal {
        uint256 tokenId = totalSupply + 1;
        _safeMint(_address, tokenId);
        totalSupply++;
    }

    function whitelistMint(uint quantity, bytes32[] memory proof) public payable
    {
        require(totalSupply + quantity <= maxSupply, "Quantity exceeds max supply");
        require(quantity <= whitelistMaxPerTransaction, "Quantity exceeds max per transaction");

        require(isContract(msg.sender) == false, "Cannot mint from a contract");
        require(whitelistStartSaleTimestamp > 0 && block.timestamp - whitelistStartSaleTimestamp > 0, "Minting is not started");
        require(msg.value == mintPriceWhitelist * quantity, "Not enough ethers sent");
        require(whitelistWalletMints[msg.sender] + quantity <= whitelistMaxPerWallet,"Quantity exceeds max whitelist mints per wallet");

        require(verify(getLeaf(msg.sender), proof), "Invalid merkle proof");

        whitelistWalletMints[msg.sender] += quantity;
        mintMany(msg.sender, quantity);
    }

    function publicMint(uint quantity) public payable
    {
        require(totalSupply + quantity <= maxSupply, "Quantity exceeds max supply");
        require(quantity <= publicMaxPerTransaction, "Quantity exceeds max per transaction");

        require(isContract(msg.sender) == false, "Cannot mint from a contract");
        require(publicStartSaleTimestamp > 0 && block.timestamp - publicStartSaleTimestamp > 0, "Minting is not started");
        require(msg.value == mintPrice * quantity, "Not enough ethers sent");

        mintMany(msg.sender, quantity);
    }

    function ownerMint(address _address, uint quantity) public payable onlyOwner 
    {
        require(totalSupply + quantity <= maxSupply, "Quantity exceeds max supply");

        mintMany(_address, quantity);
    }

    //whitelisting
    function setMerkleRoot(bytes32 merkleroot) onlyOwner public 
    {
        root = merkleroot;
    }

    function verify(bytes32 leaf, bytes32[] memory proof) private view returns (bool)
    {
        return MerkleProof.verify(proof, root, leaf);
    }

    function getLeaf(address _address) private pure returns (bytes32)
    {
        return keccak256(abi.encodePacked(_address));
    }

    //owner functions
    function withdraw() onlyOwner public  {
        uint256 balance = address(this).balance;
        payable(withdrawTo).transfer(balance);
    }

    function setWithdrawTo(address _address) onlyOwner public  {
        withdrawTo = payable(_address);
    }

    function setMaxSupply(uint256 value) onlyOwner public  {
        maxSupply = value;
    }

    function setWhitelistStartSaleTimestamp(uint256 value) onlyOwner public  {
        whitelistStartSaleTimestamp = value;
    }

    function setPublicStartSaleTimestamp(uint256 value) onlyOwner public  {
        publicStartSaleTimestamp = value;
    }

    function setWhitelistMaxPerTransaction(uint256 value) onlyOwner public  {
        whitelistMaxPerTransaction = value;
    }

    function setPublicMaxPerTransaction(uint256 value) onlyOwner public  {
        publicMaxPerTransaction = value;
    }

    function setWhitelistMaxPerWallet(uint256 value) onlyOwner public  {
        whitelistMaxPerWallet = value;
    }

    function setMintPrice(uint256 priceWei) onlyOwner public  {
        mintPrice = priceWei;
    }

    function setMintPriceWhitelist(uint256 priceWei) onlyOwner public  {
        mintPriceWhitelist = priceWei;
    }

    function setBaseTokenURI(string memory uri) onlyOwner public {
        _baseURI_ = uri;
    }

    //helpers
    function isContract(address _address) private view returns (bool){
        uint32 size;
        assembly {
            size := extcodesize(_address)
        }
        return (size > 0);
    }

    function baseTokenURI() public view returns (string memory) {
        return _baseURI_;
    }

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

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":"_baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPriceWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicStartSaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceWei","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceWei","type":"uint256"}],"name":"setMintPriceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPublicMaxPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPublicStartSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setWhitelistMaxPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setWhitelistMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setWhitelistStartSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWithdrawTo","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":"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":"whitelistMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistStartSaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistWalletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTo","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405266ae153d89fe8000600755666a94d74f430000600855611b586009556005600a556005600b556005600c556000600d556000600e556000601155732c9bc65010d5ecc8d2f7dce5dc492be506593dfb601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a057600080fd5b506040518060400160405280600b81526020017f476f73734170654769726c0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f474700000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012592919062000235565b5080600190805190602001906200013e92919062000235565b50505062000161620001556200016760201b60201c565b6200016f60201b60201c565b6200034a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024390620002e5565b90600052602060002090601f016020900481019282620002675760008555620002b3565b82601f106200028257805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b257825182559160200191906001019062000295565b5b509050620002c29190620002c6565b5090565b5b80821115620002e1576000816000905550600101620002c7565b5090565b60006002820490506001821680620002fe57607f821691505b602082108114156200031557620003146200031b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614802806200035a6000396000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c5146108ff578063ebf0c7171461093c578063f2fde38b14610967578063f4a0a52814610990578063f6000c7a146109b9578063f71c48a3146109e457610272565b8063c87b56dd146107fc578063d2cab05614610839578063d547cfb714610855578063d5abeb0114610880578063da311b74146108ab578063dbe65bfa146108d457610272565b806395d89b411161011357806395d89b4114610700578063980dd7031461072b5780639f19b01a14610756578063a22cb46514610781578063afb9c610146107aa578063b88d4fde146107d357610272565b8063715018a61461063f5780637849c8ec146106565780637cb64759146106815780638bcd3e93146106aa5780638da5cb5b146106d557610272565b80633d8adfd0116101e85780636352211e116101ac5780636352211e1461051f5780636817c76c1461055c5780636b33e45d146105875780636f1e24f0146105b05780636f8b44b0146105d957806370a082311461060257610272565b80633d8adfd01461045b57806342842e0e14610486578063484b973c146104af57806354d84c01146104cb5780635b381a26146104f457610272565b806318160ddd1161023a57806318160ddd1461036e57806323b872dd146103995780632db11544146103c25780632fda82cf146103de57806330176e131461041b5780633ccfd60b1461044457610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c578063139bdd4614610345575b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061347e565b610a0d565b6040516102ab9190613f6b565b60405180910390f35b3480156102c057600080fd5b506102c9610aef565b6040516102d69190613fa1565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613511565b610b81565b6040516103139190613ee9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613419565b610c06565b005b34801561035157600080fd5b5061036c60048036038101906103679190613511565b610d1e565b005b34801561037a57600080fd5b50610383610da4565b60405161039091906142a3565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613313565b610daa565b005b6103dc60048036038101906103d79190613511565b610e0a565b005b3480156103ea57600080fd5b50610405600480360381019061040091906132ae565b610faa565b60405161041291906142a3565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906134d0565b610fc2565b005b34801561045057600080fd5b50610459611058565b005b34801561046757600080fd5b50610470611145565b60405161047d9190613fa1565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613313565b6111d3565b005b6104c960048036038101906104c49190613419565b6111f3565b005b3480156104d757600080fd5b506104f260048036038101906104ed9190613511565b6112cf565b005b34801561050057600080fd5b50610509611355565b60405161051691906142a3565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613511565b61135b565b6040516105539190613ee9565b60405180910390f35b34801561056857600080fd5b5061057161140d565b60405161057e91906142a3565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906132ae565b611413565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613511565b6114d3565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190613511565b611559565b005b34801561060e57600080fd5b50610629600480360381019061062491906132ae565b6115df565b60405161063691906142a3565b60405180910390f35b34801561064b57600080fd5b50610654611697565b005b34801561066257600080fd5b5061066b61171f565b60405161067891906142a3565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613455565b611725565b005b3480156106b657600080fd5b506106bf6117ab565b6040516106cc9190613f04565b60405180910390f35b3480156106e157600080fd5b506106ea6117d1565b6040516106f79190613ee9565b60405180910390f35b34801561070c57600080fd5b506107156117fb565b6040516107229190613fa1565b60405180910390f35b34801561073757600080fd5b5061074061188d565b60405161074d91906142a3565b60405180910390f35b34801561076257600080fd5b5061076b611893565b60405161077891906142a3565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a391906133dd565b611899565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613511565b6118af565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613362565b611935565b005b34801561080857600080fd5b50610823600480360381019061081e9190613511565b611997565b6040516108309190613fa1565b60405180910390f35b610853600480360381019061084e919061353a565b611a3e565b005b34801561086157600080fd5b5061086a611d15565b6040516108779190613fa1565b60405180910390f35b34801561088c57600080fd5b50610895611da7565b6040516108a291906142a3565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd9190613511565b611dad565b005b3480156108e057600080fd5b506108e9611e33565b6040516108f691906142a3565b60405180910390f35b34801561090b57600080fd5b50610926600480360381019061092191906132d7565b611e39565b6040516109339190613f6b565b60405180910390f35b34801561094857600080fd5b50610951611ecd565b60405161095e9190613f86565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906132ae565b611ed3565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613511565b611fcb565b005b3480156109c557600080fd5b506109ce612051565b6040516109db91906142a3565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a069190613511565b612057565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae85750610ae7826120dd565b5b9050919050565b606060008054610afe906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2a906145a5565b8015610b775780601f10610b4c57610100808354040283529160200191610b77565b820191906000526020600020905b815481529060010190602001808311610b5a57829003601f168201915b5050505050905090565b6000610b8c82612147565b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290614143565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c118261135b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7990614203565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca16121b3565b73ffffffffffffffffffffffffffffffffffffffff161480610cd05750610ccf81610cca6121b3565b611e39565b5b610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906140c3565b60405180910390fd5b610d1983836121bb565b505050565b610d266121b3565b73ffffffffffffffffffffffffffffffffffffffff16610d446117d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614163565b60405180910390fd5b80600e8190555050565b60115481565b610dbb610db56121b3565b82612274565b610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614243565b60405180910390fd5b610e05838383612352565b505050565b60095481601154610e1b91906143be565b1115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e53906140a3565b60405180910390fd5b600c54811115610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890614263565b60405180910390fd5b60001515610eae336125ae565b151514610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614223565b60405180910390fd5b6000600e54118015610f0f57506000600e5442610f0d919061449f565b115b610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906141a3565b60405180910390fd5b80600754610f5c9190614445565b3414610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613fc3565b60405180910390fd5b610fa733826125c7565b50565b60126020528060005260406000206000915090505481565b610fca6121b3565b73ffffffffffffffffffffffffffffffffffffffff16610fe86117d1565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614163565b60405180910390fd5b8060109080519060200190611054929190613027565b5050565b6110606121b3565b73ffffffffffffffffffffffffffffffffffffffff1661107e6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614163565b60405180910390fd5b6000479050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611141573d6000803e3d6000fd5b5050565b60108054611152906145a5565b80601f016020809104026020016040519081016040528092919081815260200182805461117e906145a5565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b505050505081565b6111ee83838360405180602001604052806000815250611935565b505050565b6111fb6121b3565b73ffffffffffffffffffffffffffffffffffffffff166112196117d1565b73ffffffffffffffffffffffffffffffffffffffff161461126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690614163565b60405180910390fd5b6009548160115461128091906143be565b11156112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b8906140a3565b60405180910390fd5b6112cb82826125c7565b5050565b6112d76121b3565b73ffffffffffffffffffffffffffffffffffffffff166112f56117d1565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290614163565b60405180910390fd5b80600d8190555050565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614103565b60405180910390fd5b80915050919050565b60075481565b61141b6121b3565b73ffffffffffffffffffffffffffffffffffffffff166114396117d1565b73ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614163565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114db6121b3565b73ffffffffffffffffffffffffffffffffffffffff166114f96117d1565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690614163565b60405180910390fd5b8060088190555050565b6115616121b3565b73ffffffffffffffffffffffffffffffffffffffff1661157f6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90614163565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611650576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611647906140e3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169f6121b3565b73ffffffffffffffffffffffffffffffffffffffff166116bd6117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90614163565b60405180910390fd5b61171d60006125f3565b565b600d5481565b61172d6121b3565b73ffffffffffffffffffffffffffffffffffffffff1661174b6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614163565b60405180910390fd5b80600f8190555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461180a906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611836906145a5565b80156118835780601f1061185857610100808354040283529160200191611883565b820191906000526020600020905b81548152906001019060200180831161186657829003601f168201915b5050505050905090565b600c5481565b600e5481565b6118ab6118a46121b3565b83836126b9565b5050565b6118b76121b3565b73ffffffffffffffffffffffffffffffffffffffff166118d56117d1565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614163565b60405180910390fd5b80600c8190555050565b6119466119406121b3565b83612274565b611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614243565b60405180910390fd5b61199184848484612826565b50505050565b60606119a282612147565b6119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d8906141e3565b60405180910390fd5b60006119eb612882565b90506000815111611a0b5760405180602001604052806000815250611a36565b80611a1584612914565b604051602001611a26929190613ec5565b6040516020818303038152906040525b915050919050565b60095482601154611a4f91906143be565b1115611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a87906140a3565b60405180910390fd5b600a54821115611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc90614263565b60405180910390fd5b60001515611ae2336125ae565b151514611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b90614223565b60405180910390fd5b6000600d54118015611b4357506000600d5442611b41919061449f565b115b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906141a3565b60405180910390fd5b81600854611b909190614445565b3414611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613fc3565b60405180910390fd5b600b5482601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c1f91906143be565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614283565b60405180910390fd5b611c72611c6c33612ac1565b82612af1565b611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890614183565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0091906143be565b92505081905550611d1133836125c7565b5050565b606060108054611d24906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d50906145a5565b8015611d9d5780601f10611d7257610100808354040283529160200191611d9d565b820191906000526020600020905b815481529060010190602001808311611d8057829003601f168201915b5050505050905090565b60095481565b611db56121b3565b73ffffffffffffffffffffffffffffffffffffffff16611dd36117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614163565b60405180910390fd5b80600b8190555050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611edb6121b3565b73ffffffffffffffffffffffffffffffffffffffff16611ef96117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690614163565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614003565b60405180910390fd5b611fc8816125f3565b50565b611fd36121b3565b73ffffffffffffffffffffffffffffffffffffffff16611ff16117d1565b73ffffffffffffffffffffffffffffffffffffffff1614612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614163565b60405180910390fd5b8060078190555050565b600b5481565b61205f6121b3565b73ffffffffffffffffffffffffffffffffffffffff1661207d6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614163565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661222e8361135b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061227f82612147565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614083565b60405180910390fd5b60006122c98361135b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233857508373ffffffffffffffffffffffffffffffffffffffff1661232084610b81565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234957506123488185611e39565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123728261135b565b73ffffffffffffffffffffffffffffffffffffffff16146123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf906141c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90614043565b60405180910390fd5b612443838383612b08565b61244e6000826121bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461249e919061449f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f591906143be565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080823b905060008163ffffffff1611915050919050565b60005b818110156125ee576125db83612b0d565b80806125e6906145d7565b9150506125ca565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614063565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128199190613f6b565b60405180910390a3505050565b612831848484612352565b61283d84848484612b46565b61287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613fe3565b60405180910390fd5b50505050565b606060108054612891906145a5565b80601f01602080910402602001604051908101604052809291908181526020018280546128bd906145a5565b801561290a5780601f106128df5761010080835404028352916020019161290a565b820191906000526020600020905b8154815290600101906020018083116128ed57829003601f168201915b5050505050905090565b6060600082141561295c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612abc565b600082905060005b6000821461298e578080612977906145d7565b915050600a826129879190614414565b9150612964565b60008167ffffffffffffffff8111156129d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a025781602001600182028036833780820191505090505b5090505b60008514612ab557600182612a1b919061449f565b9150600a85612a2a919061464e565b6030612a3691906143be565b60f81b818381518110612a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aae9190614414565b9450612a06565b8093505050505b919050565b600081604051602001612ad49190613e7e565b604051602081830303815290604052805190602001209050919050565b6000612b0082600f5485612cdd565b905092915050565b505050565b60006001601154612b1e91906143be565b9050612b2a8282612cf4565b60116000815480929190612b3d906145d7565b91905055505050565b6000612b678473ffffffffffffffffffffffffffffffffffffffff16612d12565b15612cd0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b906121b3565b8786866040518563ffffffff1660e01b8152600401612bb29493929190613f1f565b602060405180830381600087803b158015612bcc57600080fd5b505af1925050508015612bfd57506040513d601f19601f82011682018060405250810190612bfa91906134a7565b60015b612c80573d8060008114612c2d576040519150601f19603f3d011682016040523d82523d6000602084013e612c32565b606091505b50600081511415612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90613fe3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cd5565b600190505b949350505050565b600082612cea8584612d25565b1490509392505050565b612d0e828260405180602001604052806000815250612dfe565b5050565b600080823b905060008111915050919050565b60008082905060005b8451811015612df3576000858281518110612d72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612db3578281604051602001612d96929190613e99565b604051602081830303815290604052805190602001209250612ddf565b8083604051602001612dc6929190613e99565b6040516020818303038152906040528051906020012092505b508080612deb906145d7565b915050612d2e565b508091505092915050565b612e088383612e59565b612e156000848484612b46565b612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90613fe3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec090614123565b60405180910390fd5b612ed281612147565b15612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614023565b60405180910390fd5b612f1e60008383612b08565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6e91906143be565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613033906145a5565b90600052602060002090601f016020900481019282613055576000855561309c565b82601f1061306e57805160ff191683800117855561309c565b8280016001018555821561309c579182015b8281111561309b578251825591602001919060010190613080565b5b5090506130a991906130ad565b5090565b5b808211156130c65760008160009055506001016130ae565b5090565b60006130dd6130d8846142ef565b6142be565b905080838252602082019050828560208602820111156130fc57600080fd5b60005b8581101561312c57816131128882613206565b8452602084019350602083019250506001810190506130ff565b5050509392505050565b60006131496131448461431b565b6142be565b90508281526020810184848401111561316157600080fd5b61316c848285614563565b509392505050565b60006131876131828461434b565b6142be565b90508281526020810184848401111561319f57600080fd5b6131aa848285614563565b509392505050565b6000813590506131c181614759565b92915050565b600082601f8301126131d857600080fd5b81356131e88482602086016130ca565b91505092915050565b60008135905061320081614770565b92915050565b60008135905061321581614787565b92915050565b60008135905061322a8161479e565b92915050565b60008151905061323f8161479e565b92915050565b600082601f83011261325657600080fd5b8135613266848260208601613136565b91505092915050565b600082601f83011261328057600080fd5b8135613290848260208601613174565b91505092915050565b6000813590506132a8816147b5565b92915050565b6000602082840312156132c057600080fd5b60006132ce848285016131b2565b91505092915050565b600080604083850312156132ea57600080fd5b60006132f8858286016131b2565b9250506020613309858286016131b2565b9150509250929050565b60008060006060848603121561332857600080fd5b6000613336868287016131b2565b9350506020613347868287016131b2565b925050604061335886828701613299565b9150509250925092565b6000806000806080858703121561337857600080fd5b6000613386878288016131b2565b9450506020613397878288016131b2565b93505060406133a887828801613299565b925050606085013567ffffffffffffffff8111156133c557600080fd5b6133d187828801613245565b91505092959194509250565b600080604083850312156133f057600080fd5b60006133fe858286016131b2565b925050602061340f858286016131f1565b9150509250929050565b6000806040838503121561342c57600080fd5b600061343a858286016131b2565b925050602061344b85828601613299565b9150509250929050565b60006020828403121561346757600080fd5b600061347584828501613206565b91505092915050565b60006020828403121561349057600080fd5b600061349e8482850161321b565b91505092915050565b6000602082840312156134b957600080fd5b60006134c784828501613230565b91505092915050565b6000602082840312156134e257600080fd5b600082013567ffffffffffffffff8111156134fc57600080fd5b6135088482850161326f565b91505092915050565b60006020828403121561352357600080fd5b600061353184828501613299565b91505092915050565b6000806040838503121561354d57600080fd5b600061355b85828601613299565b925050602083013567ffffffffffffffff81111561357857600080fd5b613584858286016131c7565b9150509250929050565b613597816144e5565b82525050565b6135a6816144d3565b82525050565b6135bd6135b8826144d3565b614620565b82525050565b6135cc816144f7565b82525050565b6135db81614503565b82525050565b6135f26135ed82614503565b614632565b82525050565b60006136038261437b565b61360d8185614391565b935061361d818560208601614572565b6136268161473b565b840191505092915050565b600061363c82614386565b61364681856143a2565b9350613656818560208601614572565b61365f8161473b565b840191505092915050565b600061367582614386565b61367f81856143b3565b935061368f818560208601614572565b80840191505092915050565b60006136a86016836143a2565b91507f4e6f7420656e6f756768206574686572732073656e74000000000000000000006000830152602082019050919050565b60006136e86032836143a2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061374e6026836143a2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b4601c836143a2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137f46024836143a2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061385a6019836143a2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061389a602c836143a2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613900601b836143a2565b91507f5175616e746974792065786365656473206d617820737570706c7900000000006000830152602082019050919050565b60006139406038836143a2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139a6602a836143a2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a0c6029836143a2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a726020836143a2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613ab2602c836143a2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b186020836143a2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b586014836143a2565b91507f496e76616c6964206d65726b6c652070726f6f660000000000000000000000006000830152602082019050919050565b6000613b986016836143a2565b91507f4d696e74696e67206973206e6f742073746172746564000000000000000000006000830152602082019050919050565b6000613bd86029836143a2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c3e602f836143a2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ca46021836143a2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d0a601b836143a2565b91507f43616e6e6f74206d696e742066726f6d206120636f6e747261637400000000006000830152602082019050919050565b6000613d4a6031836143a2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613db06024836143a2565b91507f5175616e746974792065786365656473206d617820706572207472616e73616360008301527f74696f6e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e16602f836143a2565b91507f5175616e746974792065786365656473206d61782077686974656c697374206d60008301527f696e7473207065722077616c6c657400000000000000000000000000000000006020830152604082019050919050565b613e7881614559565b82525050565b6000613e8a82846135ac565b60148201915081905092915050565b6000613ea582856135e1565b602082019150613eb582846135e1565b6020820191508190509392505050565b6000613ed1828561366a565b9150613edd828461366a565b91508190509392505050565b6000602082019050613efe600083018461359d565b92915050565b6000602082019050613f19600083018461358e565b92915050565b6000608082019050613f34600083018761359d565b613f41602083018661359d565b613f4e6040830185613e6f565b8181036060830152613f6081846135f8565b905095945050505050565b6000602082019050613f8060008301846135c3565b92915050565b6000602082019050613f9b60008301846135d2565b92915050565b60006020820190508181036000830152613fbb8184613631565b905092915050565b60006020820190508181036000830152613fdc8161369b565b9050919050565b60006020820190508181036000830152613ffc816136db565b9050919050565b6000602082019050818103600083015261401c81613741565b9050919050565b6000602082019050818103600083015261403c816137a7565b9050919050565b6000602082019050818103600083015261405c816137e7565b9050919050565b6000602082019050818103600083015261407c8161384d565b9050919050565b6000602082019050818103600083015261409c8161388d565b9050919050565b600060208201905081810360008301526140bc816138f3565b9050919050565b600060208201905081810360008301526140dc81613933565b9050919050565b600060208201905081810360008301526140fc81613999565b9050919050565b6000602082019050818103600083015261411c816139ff565b9050919050565b6000602082019050818103600083015261413c81613a65565b9050919050565b6000602082019050818103600083015261415c81613aa5565b9050919050565b6000602082019050818103600083015261417c81613b0b565b9050919050565b6000602082019050818103600083015261419c81613b4b565b9050919050565b600060208201905081810360008301526141bc81613b8b565b9050919050565b600060208201905081810360008301526141dc81613bcb565b9050919050565b600060208201905081810360008301526141fc81613c31565b9050919050565b6000602082019050818103600083015261421c81613c97565b9050919050565b6000602082019050818103600083015261423c81613cfd565b9050919050565b6000602082019050818103600083015261425c81613d3d565b9050919050565b6000602082019050818103600083015261427c81613da3565b9050919050565b6000602082019050818103600083015261429c81613e09565b9050919050565b60006020820190506142b86000830184613e6f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156142e5576142e461470c565b5b8060405250919050565b600067ffffffffffffffff82111561430a5761430961470c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143365761433561470c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156143665761436561470c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c982614559565b91506143d483614559565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144095761440861467f565b5b828201905092915050565b600061441f82614559565b915061442a83614559565b92508261443a576144396146ae565b5b828204905092915050565b600061445082614559565b915061445b83614559565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144945761449361467f565b5b828202905092915050565b60006144aa82614559565b91506144b583614559565b9250828210156144c8576144c761467f565b5b828203905092915050565b60006144de82614539565b9050919050565b60006144f082614539565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614590578082015181840152602081019050614575565b8381111561459f576000848401525b50505050565b600060028204905060018216806145bd57607f821691505b602082108114156145d1576145d06146dd565b5b50919050565b60006145e282614559565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146155761461461467f565b5b600182019050919050565b600061462b8261463c565b9050919050565b6000819050919050565b60006146478261474c565b9050919050565b600061465982614559565b915061466483614559565b925082614674576146736146ae565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614762816144d3565b811461476d57600080fd5b50565b614779816144f7565b811461478457600080fd5b50565b61479081614503565b811461479b57600080fd5b50565b6147a78161450d565b81146147b257600080fd5b50565b6147be81614559565b81146147c957600080fd5b5056fea2646970667358221220c0d10f45bcc5f04a4f2d58fa8aa25c5ac9cf38ea0b1884c8f0adba18181aa4e664736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063715018a61161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c5146108ff578063ebf0c7171461093c578063f2fde38b14610967578063f4a0a52814610990578063f6000c7a146109b9578063f71c48a3146109e457610272565b8063c87b56dd146107fc578063d2cab05614610839578063d547cfb714610855578063d5abeb0114610880578063da311b74146108ab578063dbe65bfa146108d457610272565b806395d89b411161011357806395d89b4114610700578063980dd7031461072b5780639f19b01a14610756578063a22cb46514610781578063afb9c610146107aa578063b88d4fde146107d357610272565b8063715018a61461063f5780637849c8ec146106565780637cb64759146106815780638bcd3e93146106aa5780638da5cb5b146106d557610272565b80633d8adfd0116101e85780636352211e116101ac5780636352211e1461051f5780636817c76c1461055c5780636b33e45d146105875780636f1e24f0146105b05780636f8b44b0146105d957806370a082311461060257610272565b80633d8adfd01461045b57806342842e0e14610486578063484b973c146104af57806354d84c01146104cb5780635b381a26146104f457610272565b806318160ddd1161023a57806318160ddd1461036e57806323b872dd146103995780632db11544146103c25780632fda82cf146103de57806330176e131461041b5780633ccfd60b1461044457610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c578063139bdd4614610345575b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061347e565b610a0d565b6040516102ab9190613f6b565b60405180910390f35b3480156102c057600080fd5b506102c9610aef565b6040516102d69190613fa1565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613511565b610b81565b6040516103139190613ee9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613419565b610c06565b005b34801561035157600080fd5b5061036c60048036038101906103679190613511565b610d1e565b005b34801561037a57600080fd5b50610383610da4565b60405161039091906142a3565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613313565b610daa565b005b6103dc60048036038101906103d79190613511565b610e0a565b005b3480156103ea57600080fd5b50610405600480360381019061040091906132ae565b610faa565b60405161041291906142a3565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906134d0565b610fc2565b005b34801561045057600080fd5b50610459611058565b005b34801561046757600080fd5b50610470611145565b60405161047d9190613fa1565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613313565b6111d3565b005b6104c960048036038101906104c49190613419565b6111f3565b005b3480156104d757600080fd5b506104f260048036038101906104ed9190613511565b6112cf565b005b34801561050057600080fd5b50610509611355565b60405161051691906142a3565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613511565b61135b565b6040516105539190613ee9565b60405180910390f35b34801561056857600080fd5b5061057161140d565b60405161057e91906142a3565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906132ae565b611413565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613511565b6114d3565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190613511565b611559565b005b34801561060e57600080fd5b50610629600480360381019061062491906132ae565b6115df565b60405161063691906142a3565b60405180910390f35b34801561064b57600080fd5b50610654611697565b005b34801561066257600080fd5b5061066b61171f565b60405161067891906142a3565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613455565b611725565b005b3480156106b657600080fd5b506106bf6117ab565b6040516106cc9190613f04565b60405180910390f35b3480156106e157600080fd5b506106ea6117d1565b6040516106f79190613ee9565b60405180910390f35b34801561070c57600080fd5b506107156117fb565b6040516107229190613fa1565b60405180910390f35b34801561073757600080fd5b5061074061188d565b60405161074d91906142a3565b60405180910390f35b34801561076257600080fd5b5061076b611893565b60405161077891906142a3565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a391906133dd565b611899565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613511565b6118af565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613362565b611935565b005b34801561080857600080fd5b50610823600480360381019061081e9190613511565b611997565b6040516108309190613fa1565b60405180910390f35b610853600480360381019061084e919061353a565b611a3e565b005b34801561086157600080fd5b5061086a611d15565b6040516108779190613fa1565b60405180910390f35b34801561088c57600080fd5b50610895611da7565b6040516108a291906142a3565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd9190613511565b611dad565b005b3480156108e057600080fd5b506108e9611e33565b6040516108f691906142a3565b60405180910390f35b34801561090b57600080fd5b50610926600480360381019061092191906132d7565b611e39565b6040516109339190613f6b565b60405180910390f35b34801561094857600080fd5b50610951611ecd565b60405161095e9190613f86565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906132ae565b611ed3565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613511565b611fcb565b005b3480156109c557600080fd5b506109ce612051565b6040516109db91906142a3565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a069190613511565b612057565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae85750610ae7826120dd565b5b9050919050565b606060008054610afe906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2a906145a5565b8015610b775780601f10610b4c57610100808354040283529160200191610b77565b820191906000526020600020905b815481529060010190602001808311610b5a57829003601f168201915b5050505050905090565b6000610b8c82612147565b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290614143565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c118261135b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7990614203565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca16121b3565b73ffffffffffffffffffffffffffffffffffffffff161480610cd05750610ccf81610cca6121b3565b611e39565b5b610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906140c3565b60405180910390fd5b610d1983836121bb565b505050565b610d266121b3565b73ffffffffffffffffffffffffffffffffffffffff16610d446117d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614163565b60405180910390fd5b80600e8190555050565b60115481565b610dbb610db56121b3565b82612274565b610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614243565b60405180910390fd5b610e05838383612352565b505050565b60095481601154610e1b91906143be565b1115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e53906140a3565b60405180910390fd5b600c54811115610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890614263565b60405180910390fd5b60001515610eae336125ae565b151514610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614223565b60405180910390fd5b6000600e54118015610f0f57506000600e5442610f0d919061449f565b115b610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906141a3565b60405180910390fd5b80600754610f5c9190614445565b3414610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613fc3565b60405180910390fd5b610fa733826125c7565b50565b60126020528060005260406000206000915090505481565b610fca6121b3565b73ffffffffffffffffffffffffffffffffffffffff16610fe86117d1565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614163565b60405180910390fd5b8060109080519060200190611054929190613027565b5050565b6110606121b3565b73ffffffffffffffffffffffffffffffffffffffff1661107e6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614163565b60405180910390fd5b6000479050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611141573d6000803e3d6000fd5b5050565b60108054611152906145a5565b80601f016020809104026020016040519081016040528092919081815260200182805461117e906145a5565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b505050505081565b6111ee83838360405180602001604052806000815250611935565b505050565b6111fb6121b3565b73ffffffffffffffffffffffffffffffffffffffff166112196117d1565b73ffffffffffffffffffffffffffffffffffffffff161461126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690614163565b60405180910390fd5b6009548160115461128091906143be565b11156112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b8906140a3565b60405180910390fd5b6112cb82826125c7565b5050565b6112d76121b3565b73ffffffffffffffffffffffffffffffffffffffff166112f56117d1565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290614163565b60405180910390fd5b80600d8190555050565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614103565b60405180910390fd5b80915050919050565b60075481565b61141b6121b3565b73ffffffffffffffffffffffffffffffffffffffff166114396117d1565b73ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614163565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114db6121b3565b73ffffffffffffffffffffffffffffffffffffffff166114f96117d1565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690614163565b60405180910390fd5b8060088190555050565b6115616121b3565b73ffffffffffffffffffffffffffffffffffffffff1661157f6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90614163565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611650576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611647906140e3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169f6121b3565b73ffffffffffffffffffffffffffffffffffffffff166116bd6117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90614163565b60405180910390fd5b61171d60006125f3565b565b600d5481565b61172d6121b3565b73ffffffffffffffffffffffffffffffffffffffff1661174b6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614163565b60405180910390fd5b80600f8190555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461180a906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611836906145a5565b80156118835780601f1061185857610100808354040283529160200191611883565b820191906000526020600020905b81548152906001019060200180831161186657829003601f168201915b5050505050905090565b600c5481565b600e5481565b6118ab6118a46121b3565b83836126b9565b5050565b6118b76121b3565b73ffffffffffffffffffffffffffffffffffffffff166118d56117d1565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614163565b60405180910390fd5b80600c8190555050565b6119466119406121b3565b83612274565b611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614243565b60405180910390fd5b61199184848484612826565b50505050565b60606119a282612147565b6119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d8906141e3565b60405180910390fd5b60006119eb612882565b90506000815111611a0b5760405180602001604052806000815250611a36565b80611a1584612914565b604051602001611a26929190613ec5565b6040516020818303038152906040525b915050919050565b60095482601154611a4f91906143be565b1115611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a87906140a3565b60405180910390fd5b600a54821115611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc90614263565b60405180910390fd5b60001515611ae2336125ae565b151514611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b90614223565b60405180910390fd5b6000600d54118015611b4357506000600d5442611b41919061449f565b115b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906141a3565b60405180910390fd5b81600854611b909190614445565b3414611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613fc3565b60405180910390fd5b600b5482601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c1f91906143be565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614283565b60405180910390fd5b611c72611c6c33612ac1565b82612af1565b611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890614183565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0091906143be565b92505081905550611d1133836125c7565b5050565b606060108054611d24906145a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d50906145a5565b8015611d9d5780601f10611d7257610100808354040283529160200191611d9d565b820191906000526020600020905b815481529060010190602001808311611d8057829003601f168201915b5050505050905090565b60095481565b611db56121b3565b73ffffffffffffffffffffffffffffffffffffffff16611dd36117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614163565b60405180910390fd5b80600b8190555050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611edb6121b3565b73ffffffffffffffffffffffffffffffffffffffff16611ef96117d1565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690614163565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614003565b60405180910390fd5b611fc8816125f3565b50565b611fd36121b3565b73ffffffffffffffffffffffffffffffffffffffff16611ff16117d1565b73ffffffffffffffffffffffffffffffffffffffff1614612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614163565b60405180910390fd5b8060078190555050565b600b5481565b61205f6121b3565b73ffffffffffffffffffffffffffffffffffffffff1661207d6117d1565b73ffffffffffffffffffffffffffffffffffffffff16146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614163565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661222e8361135b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061227f82612147565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614083565b60405180910390fd5b60006122c98361135b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233857508373ffffffffffffffffffffffffffffffffffffffff1661232084610b81565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234957506123488185611e39565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123728261135b565b73ffffffffffffffffffffffffffffffffffffffff16146123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf906141c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90614043565b60405180910390fd5b612443838383612b08565b61244e6000826121bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461249e919061449f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f591906143be565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080823b905060008163ffffffff1611915050919050565b60005b818110156125ee576125db83612b0d565b80806125e6906145d7565b9150506125ca565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614063565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128199190613f6b565b60405180910390a3505050565b612831848484612352565b61283d84848484612b46565b61287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613fe3565b60405180910390fd5b50505050565b606060108054612891906145a5565b80601f01602080910402602001604051908101604052809291908181526020018280546128bd906145a5565b801561290a5780601f106128df5761010080835404028352916020019161290a565b820191906000526020600020905b8154815290600101906020018083116128ed57829003601f168201915b5050505050905090565b6060600082141561295c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612abc565b600082905060005b6000821461298e578080612977906145d7565b915050600a826129879190614414565b9150612964565b60008167ffffffffffffffff8111156129d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a025781602001600182028036833780820191505090505b5090505b60008514612ab557600182612a1b919061449f565b9150600a85612a2a919061464e565b6030612a3691906143be565b60f81b818381518110612a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aae9190614414565b9450612a06565b8093505050505b919050565b600081604051602001612ad49190613e7e565b604051602081830303815290604052805190602001209050919050565b6000612b0082600f5485612cdd565b905092915050565b505050565b60006001601154612b1e91906143be565b9050612b2a8282612cf4565b60116000815480929190612b3d906145d7565b91905055505050565b6000612b678473ffffffffffffffffffffffffffffffffffffffff16612d12565b15612cd0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b906121b3565b8786866040518563ffffffff1660e01b8152600401612bb29493929190613f1f565b602060405180830381600087803b158015612bcc57600080fd5b505af1925050508015612bfd57506040513d601f19601f82011682018060405250810190612bfa91906134a7565b60015b612c80573d8060008114612c2d576040519150601f19603f3d011682016040523d82523d6000602084013e612c32565b606091505b50600081511415612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90613fe3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cd5565b600190505b949350505050565b600082612cea8584612d25565b1490509392505050565b612d0e828260405180602001604052806000815250612dfe565b5050565b600080823b905060008111915050919050565b60008082905060005b8451811015612df3576000858281518110612d72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612db3578281604051602001612d96929190613e99565b604051602081830303815290604052805190602001209250612ddf565b8083604051602001612dc6929190613e99565b6040516020818303038152906040528051906020012092505b508080612deb906145d7565b915050612d2e565b508091505092915050565b612e088383612e59565b612e156000848484612b46565b612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90613fe3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec090614123565b60405180910390fd5b612ed281612147565b15612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614023565b60405180910390fd5b612f1e60008383612b08565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6e91906143be565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613033906145a5565b90600052602060002090601f016020900481019282613055576000855561309c565b82601f1061306e57805160ff191683800117855561309c565b8280016001018555821561309c579182015b8281111561309b578251825591602001919060010190613080565b5b5090506130a991906130ad565b5090565b5b808211156130c65760008160009055506001016130ae565b5090565b60006130dd6130d8846142ef565b6142be565b905080838252602082019050828560208602820111156130fc57600080fd5b60005b8581101561312c57816131128882613206565b8452602084019350602083019250506001810190506130ff565b5050509392505050565b60006131496131448461431b565b6142be565b90508281526020810184848401111561316157600080fd5b61316c848285614563565b509392505050565b60006131876131828461434b565b6142be565b90508281526020810184848401111561319f57600080fd5b6131aa848285614563565b509392505050565b6000813590506131c181614759565b92915050565b600082601f8301126131d857600080fd5b81356131e88482602086016130ca565b91505092915050565b60008135905061320081614770565b92915050565b60008135905061321581614787565b92915050565b60008135905061322a8161479e565b92915050565b60008151905061323f8161479e565b92915050565b600082601f83011261325657600080fd5b8135613266848260208601613136565b91505092915050565b600082601f83011261328057600080fd5b8135613290848260208601613174565b91505092915050565b6000813590506132a8816147b5565b92915050565b6000602082840312156132c057600080fd5b60006132ce848285016131b2565b91505092915050565b600080604083850312156132ea57600080fd5b60006132f8858286016131b2565b9250506020613309858286016131b2565b9150509250929050565b60008060006060848603121561332857600080fd5b6000613336868287016131b2565b9350506020613347868287016131b2565b925050604061335886828701613299565b9150509250925092565b6000806000806080858703121561337857600080fd5b6000613386878288016131b2565b9450506020613397878288016131b2565b93505060406133a887828801613299565b925050606085013567ffffffffffffffff8111156133c557600080fd5b6133d187828801613245565b91505092959194509250565b600080604083850312156133f057600080fd5b60006133fe858286016131b2565b925050602061340f858286016131f1565b9150509250929050565b6000806040838503121561342c57600080fd5b600061343a858286016131b2565b925050602061344b85828601613299565b9150509250929050565b60006020828403121561346757600080fd5b600061347584828501613206565b91505092915050565b60006020828403121561349057600080fd5b600061349e8482850161321b565b91505092915050565b6000602082840312156134b957600080fd5b60006134c784828501613230565b91505092915050565b6000602082840312156134e257600080fd5b600082013567ffffffffffffffff8111156134fc57600080fd5b6135088482850161326f565b91505092915050565b60006020828403121561352357600080fd5b600061353184828501613299565b91505092915050565b6000806040838503121561354d57600080fd5b600061355b85828601613299565b925050602083013567ffffffffffffffff81111561357857600080fd5b613584858286016131c7565b9150509250929050565b613597816144e5565b82525050565b6135a6816144d3565b82525050565b6135bd6135b8826144d3565b614620565b82525050565b6135cc816144f7565b82525050565b6135db81614503565b82525050565b6135f26135ed82614503565b614632565b82525050565b60006136038261437b565b61360d8185614391565b935061361d818560208601614572565b6136268161473b565b840191505092915050565b600061363c82614386565b61364681856143a2565b9350613656818560208601614572565b61365f8161473b565b840191505092915050565b600061367582614386565b61367f81856143b3565b935061368f818560208601614572565b80840191505092915050565b60006136a86016836143a2565b91507f4e6f7420656e6f756768206574686572732073656e74000000000000000000006000830152602082019050919050565b60006136e86032836143a2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061374e6026836143a2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b4601c836143a2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137f46024836143a2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061385a6019836143a2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061389a602c836143a2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613900601b836143a2565b91507f5175616e746974792065786365656473206d617820737570706c7900000000006000830152602082019050919050565b60006139406038836143a2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139a6602a836143a2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a0c6029836143a2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a726020836143a2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613ab2602c836143a2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b186020836143a2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b586014836143a2565b91507f496e76616c6964206d65726b6c652070726f6f660000000000000000000000006000830152602082019050919050565b6000613b986016836143a2565b91507f4d696e74696e67206973206e6f742073746172746564000000000000000000006000830152602082019050919050565b6000613bd86029836143a2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c3e602f836143a2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ca46021836143a2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d0a601b836143a2565b91507f43616e6e6f74206d696e742066726f6d206120636f6e747261637400000000006000830152602082019050919050565b6000613d4a6031836143a2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613db06024836143a2565b91507f5175616e746974792065786365656473206d617820706572207472616e73616360008301527f74696f6e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e16602f836143a2565b91507f5175616e746974792065786365656473206d61782077686974656c697374206d60008301527f696e7473207065722077616c6c657400000000000000000000000000000000006020830152604082019050919050565b613e7881614559565b82525050565b6000613e8a82846135ac565b60148201915081905092915050565b6000613ea582856135e1565b602082019150613eb582846135e1565b6020820191508190509392505050565b6000613ed1828561366a565b9150613edd828461366a565b91508190509392505050565b6000602082019050613efe600083018461359d565b92915050565b6000602082019050613f19600083018461358e565b92915050565b6000608082019050613f34600083018761359d565b613f41602083018661359d565b613f4e6040830185613e6f565b8181036060830152613f6081846135f8565b905095945050505050565b6000602082019050613f8060008301846135c3565b92915050565b6000602082019050613f9b60008301846135d2565b92915050565b60006020820190508181036000830152613fbb8184613631565b905092915050565b60006020820190508181036000830152613fdc8161369b565b9050919050565b60006020820190508181036000830152613ffc816136db565b9050919050565b6000602082019050818103600083015261401c81613741565b9050919050565b6000602082019050818103600083015261403c816137a7565b9050919050565b6000602082019050818103600083015261405c816137e7565b9050919050565b6000602082019050818103600083015261407c8161384d565b9050919050565b6000602082019050818103600083015261409c8161388d565b9050919050565b600060208201905081810360008301526140bc816138f3565b9050919050565b600060208201905081810360008301526140dc81613933565b9050919050565b600060208201905081810360008301526140fc81613999565b9050919050565b6000602082019050818103600083015261411c816139ff565b9050919050565b6000602082019050818103600083015261413c81613a65565b9050919050565b6000602082019050818103600083015261415c81613aa5565b9050919050565b6000602082019050818103600083015261417c81613b0b565b9050919050565b6000602082019050818103600083015261419c81613b4b565b9050919050565b600060208201905081810360008301526141bc81613b8b565b9050919050565b600060208201905081810360008301526141dc81613bcb565b9050919050565b600060208201905081810360008301526141fc81613c31565b9050919050565b6000602082019050818103600083015261421c81613c97565b9050919050565b6000602082019050818103600083015261423c81613cfd565b9050919050565b6000602082019050818103600083015261425c81613d3d565b9050919050565b6000602082019050818103600083015261427c81613da3565b9050919050565b6000602082019050818103600083015261429c81613e09565b9050919050565b60006020820190506142b86000830184613e6f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156142e5576142e461470c565b5b8060405250919050565b600067ffffffffffffffff82111561430a5761430961470c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143365761433561470c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156143665761436561470c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c982614559565b91506143d483614559565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144095761440861467f565b5b828201905092915050565b600061441f82614559565b915061442a83614559565b92508261443a576144396146ae565b5b828204905092915050565b600061445082614559565b915061445b83614559565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144945761449361467f565b5b828202905092915050565b60006144aa82614559565b91506144b583614559565b9250828210156144c8576144c761467f565b5b828203905092915050565b60006144de82614539565b9050919050565b60006144f082614539565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614590578082015181840152602081019050614575565b8381111561459f576000848401525b50505050565b600060028204905060018216806145bd57607f821691505b602082108114156145d1576145d06146dd565b5b50919050565b60006145e282614559565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146155761461461467f565b5b600182019050919050565b600061462b8261463c565b9050919050565b6000819050919050565b60006146478261474c565b9050919050565b600061465982614559565b915061466483614559565b925082614674576146736146ae565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614762816144d3565b811461476d57600080fd5b50565b614779816144f7565b811461478457600080fd5b50565b61479081614503565b811461479b57600080fd5b50565b6147a78161450d565b81146147b257600080fd5b50565b6147be81614559565b81146147c957600080fd5b5056fea2646970667358221220c0d10f45bcc5f04a4f2d58fa8aa25c5ac9cf38ea0b1884c8f0adba18181aa4e664736f6c63430008000033

Deployed Bytecode Sourcemap

38457:5194:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21250:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22195:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23754:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23277:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42372:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39076:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24504:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40609:574;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39113:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43112:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41870:144;;;;;;;;;;;;;:::i;:::-;;39028:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24914:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41191:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42237:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38665:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21889:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38529:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42022:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42989:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42138:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21619:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35401:103;;;;;;;;;;;;;:::i;:::-;;38838:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41437:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39200:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34750;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22364:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38764:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38891:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24047:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42634:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25170:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22539:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39709:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43435:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38627:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42761:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38574:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24273:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38974:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35659:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42884:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38717:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42501:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21250:305;21352:4;21404:25;21389:40;;;:11;:40;;;;:105;;;;21461:33;21446:48;;;:11;:48;;;;21389:105;:158;;;;21511:36;21535:11;21511:23;:36::i;:::-;21389:158;21369:178;;21250:305;;;:::o;22195:100::-;22249:13;22282:5;22275:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22195:100;:::o;23754:221::-;23830:7;23858:16;23866:7;23858;:16::i;:::-;23850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23943:15;:24;23959:7;23943:24;;;;;;;;;;;;;;;;;;;;;23936:31;;23754:221;;;:::o;23277:411::-;23358:13;23374:23;23389:7;23374:14;:23::i;:::-;23358:39;;23422:5;23416:11;;:2;:11;;;;23408:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23516:5;23500:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23525:37;23542:5;23549:12;:10;:12::i;:::-;23525:16;:37::i;:::-;23500:62;23478:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23659:21;23668:2;23672:7;23659:8;:21::i;:::-;23277:411;;;:::o;42372:121::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42480:5:::1;42453:24;:32;;;;42372:121:::0;:::o;39076:30::-;;;;:::o;24504:339::-;24699:41;24718:12;:10;:12::i;:::-;24732:7;24699:18;:41::i;:::-;24691:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24807:28;24817:4;24823:2;24827:7;24807:9;:28::i;:::-;24504:339;;;:::o;40609:574::-;40709:9;;40697:8;40683:11;;:22;;;;:::i;:::-;:35;;40675:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;40781:23;;40769:8;:35;;40761:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;40892:5;40866:31;;:22;40877:10;40866;:22::i;:::-;:31;;;40858:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40975:1;40948:24;;:28;:78;;;;;41025:1;40998:24;;40980:15;:42;;;;:::i;:::-;:46;40948:78;40940:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41097:8;41085:9;;:20;;;;:::i;:::-;41072:9;:33;41064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41145:30;41154:10;41166:8;41145;:30::i;:::-;40609:574;:::o;39113:55::-;;;;;;;;;;;;;;;;;:::o;43112:95::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43196:3:::1;43184:9;:15;;;;;;;;;;;;:::i;:::-;;43112:95:::0;:::o;41870:144::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41919:15:::1;41937:21;41919:39;;41977:10;;;;;;;;;;;41969:28;;:37;41998:7;41969:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35041:1;41870:144::o:0;39028:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24914:185::-;25052:39;25069:4;25075:2;25079:7;25052:39;;;;;;;;;;;;:16;:39::i;:::-;24914:185;;;:::o;41191:218::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41319:9:::1;;41307:8;41293:11;;:22;;;;:::i;:::-;:35;;41285:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;41373:28;41382:8;41392;41373;:28::i;:::-;41191:218:::0;;:::o;42237:127::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42351:5:::1;42321:27;:35;;;;42237:127:::0;:::o;38665:45::-;;;;:::o;21889:239::-;21961:7;21981:13;21997:7;:16;22005:7;21997:16;;;;;;;;;;;;;;;;;;;;;21981:32;;22049:1;22032:19;;:5;:19;;;;22024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22115:5;22108:12;;;21889:239;;;:::o;38529:38::-;;;;:::o;42022:108::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42113:8:::1;42092:10;;:30;;;;;;;;;;;;;;;;;;42022:108:::0;:::o;42989:115::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43088:8:::1;43067:18;:29;;;;42989:115:::0;:::o;42138:91::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42216:5:::1;42204:9;:17;;;;42138:91:::0;:::o;21619:208::-;21691:7;21736:1;21719:19;;:5;:19;;;;21711:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21803:9;:16;21813:5;21803:16;;;;;;;;;;;;;;;;21796:23;;21619:208;;;:::o;35401:103::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35466:30:::1;35493:1;35466:18;:30::i;:::-;35401:103::o:0;38838:46::-;;;;:::o;41437:102::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41521:10:::1;41514:4;:17;;;;41437:102:::0;:::o;39200:87::-;;;;;;;;;;;;;:::o;34750:::-;34796:7;34823:6;;;;;;;;;;;34816:13;;34750:87;:::o;22364:104::-;22420:13;22453:7;22446:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22364:104;:::o;38764:42::-;;;;:::o;38891:43::-;;;;:::o;24047:155::-;24142:52;24161:12;:10;:12::i;:::-;24175:8;24185;24142:18;:52::i;:::-;24047:155;;:::o;42634:119::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42740:5:::1;42714:23;:31;;;;42634:119:::0;:::o;25170:328::-;25345:41;25364:12;:10;:12::i;:::-;25378:7;25345:18;:41::i;:::-;25337:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25451:39;25465:4;25471:2;25475:7;25484:5;25451:13;:39::i;:::-;25170:328;;;;:::o;22539:334::-;22612:13;22646:16;22654:7;22646;:16::i;:::-;22638:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22727:21;22751:10;:8;:10::i;:::-;22727:34;;22803:1;22785:7;22779:21;:25;:86;;;;;;;;;;;;;;;;;22831:7;22840:18;:7;:16;:18::i;:::-;22814:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22779:86;22772:93;;;22539:334;;;:::o;39709:892::-;39836:9;;39824:8;39810:11;;:22;;;;:::i;:::-;:35;;39802:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39908:26;;39896:8;:38;;39888:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40022:5;39996:31;;:22;40007:10;39996;:22::i;:::-;:31;;;39988:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40108:1;40078:27;;:31;:84;;;;;40161:1;40131:27;;40113:15;:45;;;;:::i;:::-;:49;40078:84;40070:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;40242:8;40221:18;;:29;;;;:::i;:::-;40208:9;:42;40200:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40343:21;;40331:8;40296:20;:32;40317:10;40296:32;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:68;;40288:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;40436:34;40443:19;40451:10;40443:7;:19::i;:::-;40464:5;40436:6;:34::i;:::-;40428:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;40544:8;40508:20;:32;40529:10;40508:32;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;40563:30;40572:10;40584:8;40563;:30::i;:::-;39709:892;;:::o;43435:95::-;43480:13;43513:9;43506:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43435:95;:::o;38627:31::-;;;;:::o;42761:115::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42863:5:::1;42839:21;:29;;;;42761:115:::0;:::o;38574:46::-;;;;:::o;24273:164::-;24370:4;24394:18;:25;24413:5;24394:25;;;;;;;;;;;;;;;:35;24420:8;24394:35;;;;;;;;;;;;;;;;;;;;;;;;;24387:42;;24273:164;;;;:::o;38974:19::-;;;;:::o;35659:201::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35768:1:::1;35748:22;;:8;:22;;;;35740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35824:28;35843:8;35824:18;:28::i;:::-;35659:201:::0;:::o;42884:97::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42965:8:::1;42953:9;:20;;;;42884:97:::0;:::o;38717:40::-;;;;:::o;42501:125::-;34981:12;:10;:12::i;:::-;34970:23;;:7;:5;:7::i;:::-;:23;;;34962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42613:5:::1;42584:26;:34;;;;42501:125:::0;:::o;19696:157::-;19781:4;19820:25;19805:40;;;:11;:40;;;;19798:47;;19696:157;;;:::o;27008:127::-;27073:4;27125:1;27097:30;;:7;:16;27105:7;27097:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27090:37;;27008:127;;;:::o;16471:98::-;16524:7;16551:10;16544:17;;16471:98;:::o;30990:174::-;31092:2;31065:15;:24;31081:7;31065:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31148:7;31144:2;31110:46;;31119:23;31134:7;31119:14;:23::i;:::-;31110:46;;;;;;;;;;;;30990:174;;:::o;27302:348::-;27395:4;27420:16;27428:7;27420;:16::i;:::-;27412:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27496:13;27512:23;27527:7;27512:14;:23::i;:::-;27496:39;;27565:5;27554:16;;:7;:16;;;:51;;;;27598:7;27574:31;;:20;27586:7;27574:11;:20::i;:::-;:31;;;27554:51;:87;;;;27609:32;27626:5;27633:7;27609:16;:32::i;:::-;27554:87;27546:96;;;27302:348;;;;:::o;30294:578::-;30453:4;30426:31;;:23;30441:7;30426:14;:23::i;:::-;:31;;;30418:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30536:1;30522:16;;:2;:16;;;;30514:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30592:39;30613:4;30619:2;30623:7;30592:20;:39::i;:::-;30696:29;30713:1;30717:7;30696:8;:29::i;:::-;30757:1;30738:9;:15;30748:4;30738:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30786:1;30769:9;:13;30779:2;30769:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30817:2;30798:7;:16;30806:7;30798:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30856:7;30852:2;30837:27;;30846:4;30837:27;;;;;;;;;;;;30294:578;;;:::o;43230:197::-;43290:4;43306:11;43372:8;43360:21;43352:29;;43417:1;43410:4;:8;;;43402:17;;;43230:197;;;:::o;39379:160::-;39457:9;39452:80;39476:8;39472:1;:12;39452:80;;;39506:14;39511:8;39506:4;:14::i;:::-;39486:3;;;;;:::i;:::-;;;;39452:80;;;;39379:160;;:::o;36020:191::-;36094:16;36113:6;;;;;;;;;;;36094:25;;36139:8;36130:6;;:17;;;;;;;;;;;;;;;;;;36194:8;36163:40;;36184:8;36163:40;;;;;;;;;;;;36020:191;;:::o;31306:315::-;31461:8;31452:17;;:5;:17;;;;31444:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31548:8;31510:18;:25;31529:5;31510:25;;;;;;;;;;;;;;;:35;31536:8;31510:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31594:8;31572:41;;31587:5;31572:41;;;31604:8;31572:41;;;;;;:::i;:::-;;;;;;;;31306:315;;;:::o;26380:::-;26537:28;26547:4;26553:2;26557:7;26537:9;:28::i;:::-;26584:48;26607:4;26613:2;26617:7;26626:5;26584:22;:48::i;:::-;26576:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26380:315;;;;:::o;43538:110::-;43598:13;43631:9;43624:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43538:110;:::o;17061:723::-;17117:13;17347:1;17338:5;:10;17334:53;;;17365:10;;;;;;;;;;;;;;;;;;;;;17334:53;17397:12;17412:5;17397:20;;17428:14;17453:78;17468:1;17460:4;:9;17453:78;;17486:8;;;;;:::i;:::-;;;;17517:2;17509:10;;;;;:::i;:::-;;;17453:78;;;17541:19;17573:6;17563:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17541:39;;17591:154;17607:1;17598:5;:10;17591:154;;17635:1;17625:11;;;;;:::i;:::-;;;17702:2;17694:5;:10;;;;:::i;:::-;17681:2;:24;;;;:::i;:::-;17668:39;;17651:6;17658;17651:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17731:2;17722:11;;;;;:::i;:::-;;;17591:154;;;17769:6;17755:21;;;;;17061:723;;;;:::o;41705:134::-;41762:7;41821:8;41804:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;41794:37;;;;;;41787:44;;41705:134;;;:::o;41547:150::-;41623:4;41652:37;41671:5;41678:4;;41684;41652:18;:37::i;:::-;41645:44;;41547:150;;;;:::o;33557:126::-;;;;:::o;39545:156::-;39597:15;39629:1;39615:11;;:15;;;;:::i;:::-;39597:33;;39641:28;39651:8;39661:7;39641:9;:28::i;:::-;39680:11;;:13;;;;;;;;;:::i;:::-;;;;;;39545:156;;:::o;32186:799::-;32341:4;32362:15;:2;:13;;;:15::i;:::-;32358:620;;;32414:2;32398:36;;;32435:12;:10;:12::i;:::-;32449:4;32455:7;32464:5;32398:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32394:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32657:1;32640:6;:13;:18;32636:272;;;32683:60;;;;;;;;;;:::i;:::-;;;;;;;;32636:272;32858:6;32852:13;32843:6;32839:2;32835:15;32828:38;32394:529;32531:41;;;32521:51;;;:6;:51;;;;32514:58;;;;;32358:620;32962:4;32955:11;;32186:799;;;;;;;:::o;37124:190::-;37249:4;37302;37273:25;37286:5;37293:4;37273:12;:25::i;:::-;:33;37266:40;;37124:190;;;;;:::o;27992:110::-;28068:26;28078:2;28082:7;28068:26;;;;;;;;;;;;:9;:26::i;:::-;27992:110;;:::o;8450:387::-;8510:4;8718:12;8785:7;8773:20;8765:28;;8828:1;8821:4;:8;8814:15;;;8450:387;;;:::o;37676:701::-;37759:7;37779:20;37802:4;37779:27;;37822:9;37817:523;37841:5;:12;37837:1;:16;37817:523;;;37875:20;37898:5;37904:1;37898:8;;;;;;;;;;;;;;;;;;;;;;37875:31;;37941:12;37925;:28;37921:408;;38095:12;38109;38078:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38068:55;;;;;;38053:70;;37921:408;;;38285:12;38299;38268:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38258:55;;;;;;38243:70;;37921:408;37817:523;37855:3;;;;;:::i;:::-;;;;37817:523;;;;38357:12;38350:19;;;37676:701;;;;:::o;28329:321::-;28459:18;28465:2;28469:7;28459:5;:18::i;:::-;28510:54;28541:1;28545:2;28549:7;28558:5;28510:22;:54::i;:::-;28488:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28329:321;;;:::o;28986:382::-;29080:1;29066:16;;:2;:16;;;;29058:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29139:16;29147:7;29139;:16::i;:::-;29138:17;29130:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29201:45;29230:1;29234:2;29238:7;29201:20;:45::i;:::-;29276:1;29259:9;:13;29269:2;29259:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29307:2;29288:7;:16;29296:7;29288:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29352:7;29348:2;29327:33;;29344:1;29327:33;;;;;;;;;;;;28986:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:139::-;;2044:6;2031:20;2022:29;;2060:33;2087:5;2060:33;:::i;:::-;2012:87;;;;:::o;2105:137::-;;2188:6;2175:20;2166:29;;2204:32;2230:5;2204:32;:::i;:::-;2156:86;;;;:::o;2248:141::-;;2335:6;2329:13;2320:22;;2351:32;2377:5;2351:32;:::i;:::-;2310:79;;;;:::o;2408:271::-;;2512:3;2505:4;2497:6;2493:17;2489:27;2479:2;;2530:1;2527;2520:12;2479:2;2570:6;2557:20;2595:78;2669:3;2661:6;2654:4;2646:6;2642:17;2595:78;:::i;:::-;2586:87;;2469:210;;;;;:::o;2699:273::-;;2804:3;2797:4;2789:6;2785:17;2781:27;2771:2;;2822:1;2819;2812:12;2771:2;2862:6;2849:20;2887:79;2962:3;2954:6;2947:4;2939:6;2935:17;2887:79;:::i;:::-;2878:88;;2761:211;;;;;:::o;2978:139::-;;3062:6;3049:20;3040:29;;3078:33;3105:5;3078:33;:::i;:::-;3030:87;;;;:::o;3123:262::-;;3231:2;3219:9;3210:7;3206:23;3202:32;3199:2;;;3247:1;3244;3237:12;3199:2;3290:1;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3261:117;3189:196;;;;:::o;3391:407::-;;;3516:2;3504:9;3495:7;3491:23;3487:32;3484:2;;;3532:1;3529;3522:12;3484:2;3575:1;3600:53;3645:7;3636:6;3625:9;3621:22;3600:53;:::i;:::-;3590:63;;3546:117;3702:2;3728:53;3773:7;3764:6;3753:9;3749:22;3728:53;:::i;:::-;3718:63;;3673:118;3474:324;;;;;:::o;3804:552::-;;;;3946:2;3934:9;3925:7;3921:23;3917:32;3914:2;;;3962:1;3959;3952:12;3914:2;4005:1;4030:53;4075:7;4066:6;4055:9;4051:22;4030:53;:::i;:::-;4020:63;;3976:117;4132:2;4158:53;4203:7;4194:6;4183:9;4179:22;4158:53;:::i;:::-;4148:63;;4103:118;4260:2;4286:53;4331:7;4322:6;4311:9;4307:22;4286:53;:::i;:::-;4276:63;;4231:118;3904:452;;;;;:::o;4362:809::-;;;;;4530:3;4518:9;4509:7;4505:23;4501:33;4498:2;;;4547:1;4544;4537:12;4498:2;4590:1;4615:53;4660:7;4651:6;4640:9;4636:22;4615:53;:::i;:::-;4605:63;;4561:117;4717:2;4743:53;4788:7;4779:6;4768:9;4764:22;4743:53;:::i;:::-;4733:63;;4688:118;4845:2;4871:53;4916:7;4907:6;4896:9;4892:22;4871:53;:::i;:::-;4861:63;;4816:118;5001:2;4990:9;4986:18;4973:32;5032:18;5024:6;5021:30;5018:2;;;5064:1;5061;5054:12;5018:2;5092:62;5146:7;5137:6;5126:9;5122:22;5092:62;:::i;:::-;5082:72;;4944:220;4488:683;;;;;;;:::o;5177:401::-;;;5299:2;5287:9;5278:7;5274:23;5270:32;5267:2;;;5315:1;5312;5305:12;5267:2;5358:1;5383:53;5428:7;5419:6;5408:9;5404:22;5383:53;:::i;:::-;5373:63;;5329:117;5485:2;5511:50;5553:7;5544:6;5533:9;5529:22;5511:50;:::i;:::-;5501:60;;5456:115;5257:321;;;;;:::o;5584:407::-;;;5709:2;5697:9;5688:7;5684:23;5680:32;5677:2;;;5725:1;5722;5715:12;5677:2;5768:1;5793:53;5838:7;5829:6;5818:9;5814:22;5793:53;:::i;:::-;5783:63;;5739:117;5895:2;5921:53;5966:7;5957:6;5946:9;5942:22;5921:53;:::i;:::-;5911:63;;5866:118;5667:324;;;;;:::o;5997:262::-;;6105:2;6093:9;6084:7;6080:23;6076:32;6073:2;;;6121:1;6118;6111:12;6073:2;6164:1;6189:53;6234:7;6225:6;6214:9;6210:22;6189:53;:::i;:::-;6179:63;;6135:117;6063:196;;;;:::o;6265:260::-;;6372:2;6360:9;6351:7;6347:23;6343:32;6340:2;;;6388:1;6385;6378:12;6340:2;6431:1;6456:52;6500:7;6491:6;6480:9;6476:22;6456:52;:::i;:::-;6446:62;;6402:116;6330:195;;;;:::o;6531:282::-;;6649:2;6637:9;6628:7;6624:23;6620:32;6617:2;;;6665:1;6662;6655:12;6617:2;6708:1;6733:63;6788:7;6779:6;6768:9;6764:22;6733:63;:::i;:::-;6723:73;;6679:127;6607:206;;;;:::o;6819:375::-;;6937:2;6925:9;6916:7;6912:23;6908:32;6905:2;;;6953:1;6950;6943:12;6905:2;7024:1;7013:9;7009:17;6996:31;7054:18;7046:6;7043:30;7040:2;;;7086:1;7083;7076:12;7040:2;7114:63;7169:7;7160:6;7149:9;7145:22;7114:63;:::i;:::-;7104:73;;6967:220;6895:299;;;;:::o;7200:262::-;;7308:2;7296:9;7287:7;7283:23;7279:32;7276:2;;;7324:1;7321;7314:12;7276:2;7367:1;7392:53;7437:7;7428:6;7417:9;7413:22;7392:53;:::i;:::-;7382:63;;7338:117;7266:196;;;;:::o;7468:550::-;;;7618:2;7606:9;7597:7;7593:23;7589:32;7586:2;;;7634:1;7631;7624:12;7586:2;7677:1;7702:53;7747:7;7738:6;7727:9;7723:22;7702:53;:::i;:::-;7692:63;;7648:117;7832:2;7821:9;7817:18;7804:32;7863:18;7855:6;7852:30;7849:2;;;7895:1;7892;7885:12;7849:2;7923:78;7993:7;7984:6;7973:9;7969:22;7923:78;:::i;:::-;7913:88;;7775:236;7576:442;;;;;:::o;8024:142::-;8127:32;8153:5;8127:32;:::i;:::-;8122:3;8115:45;8105:61;;:::o;8172:118::-;8259:24;8277:5;8259:24;:::i;:::-;8254:3;8247:37;8237:53;;:::o;8296:157::-;8401:45;8421:24;8439:5;8421:24;:::i;:::-;8401:45;:::i;:::-;8396:3;8389:58;8379:74;;:::o;8459:109::-;8540:21;8555:5;8540:21;:::i;:::-;8535:3;8528:34;8518:50;;:::o;8574:118::-;8661:24;8679:5;8661:24;:::i;:::-;8656:3;8649:37;8639:53;;:::o;8698:157::-;8803:45;8823:24;8841:5;8823:24;:::i;:::-;8803:45;:::i;:::-;8798:3;8791:58;8781:74;;:::o;8861:360::-;;8975:38;9007:5;8975:38;:::i;:::-;9029:70;9092:6;9087:3;9029:70;:::i;:::-;9022:77;;9108:52;9153:6;9148:3;9141:4;9134:5;9130:16;9108:52;:::i;:::-;9185:29;9207:6;9185:29;:::i;:::-;9180:3;9176:39;9169:46;;8951:270;;;;;:::o;9227:364::-;;9343:39;9376:5;9343:39;:::i;:::-;9398:71;9462:6;9457:3;9398:71;:::i;:::-;9391:78;;9478:52;9523:6;9518:3;9511:4;9504:5;9500:16;9478:52;:::i;:::-;9555:29;9577:6;9555:29;:::i;:::-;9550:3;9546:39;9539:46;;9319:272;;;;;:::o;9597:377::-;;9731:39;9764:5;9731:39;:::i;:::-;9786:89;9868:6;9863:3;9786:89;:::i;:::-;9779:96;;9884:52;9929:6;9924:3;9917:4;9910:5;9906:16;9884:52;:::i;:::-;9961:6;9956:3;9952:16;9945:23;;9707:267;;;;;:::o;9980:320::-;;10143:67;10207:2;10202:3;10143:67;:::i;:::-;10136:74;;10240:24;10236:1;10231:3;10227:11;10220:45;10291:2;10286:3;10282:12;10275:19;;10126:174;;;:::o;10306:382::-;;10469:67;10533:2;10528:3;10469:67;:::i;:::-;10462:74;;10566:34;10562:1;10557:3;10553:11;10546:55;10632:20;10627:2;10622:3;10618:12;10611:42;10679:2;10674:3;10670:12;10663:19;;10452:236;;;:::o;10694:370::-;;10857:67;10921:2;10916:3;10857:67;:::i;:::-;10850:74;;10954:34;10950:1;10945:3;10941:11;10934:55;11020:8;11015:2;11010:3;11006:12;10999:30;11055:2;11050:3;11046:12;11039:19;;10840:224;;;:::o;11070:326::-;;11233:67;11297:2;11292:3;11233:67;:::i;:::-;11226:74;;11330:30;11326:1;11321:3;11317:11;11310:51;11387:2;11382:3;11378:12;11371:19;;11216:180;;;:::o;11402:368::-;;11565:67;11629:2;11624:3;11565:67;:::i;:::-;11558:74;;11662:34;11658:1;11653:3;11649:11;11642:55;11728:6;11723:2;11718:3;11714:12;11707:28;11761:2;11756:3;11752:12;11745:19;;11548:222;;;:::o;11776:323::-;;11939:67;12003:2;11998:3;11939:67;:::i;:::-;11932:74;;12036:27;12032:1;12027:3;12023:11;12016:48;12090:2;12085:3;12081:12;12074:19;;11922:177;;;:::o;12105:376::-;;12268:67;12332:2;12327:3;12268:67;:::i;:::-;12261:74;;12365:34;12361:1;12356:3;12352:11;12345:55;12431:14;12426:2;12421:3;12417:12;12410:36;12472:2;12467:3;12463:12;12456:19;;12251:230;;;:::o;12487:325::-;;12650:67;12714:2;12709:3;12650:67;:::i;:::-;12643:74;;12747:29;12743:1;12738:3;12734:11;12727:50;12803:2;12798:3;12794:12;12787:19;;12633:179;;;:::o;12818:388::-;;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13078:34;13074:1;13069:3;13065:11;13058:55;13144:26;13139:2;13134:3;13130:12;13123:48;13197:2;13192:3;13188:12;13181:19;;12964:242;;;:::o;13212:374::-;;13375:67;13439:2;13434:3;13375:67;:::i;:::-;13368:74;;13472:34;13468:1;13463:3;13459:11;13452:55;13538:12;13533:2;13528:3;13524:12;13517:34;13577:2;13572:3;13568:12;13561:19;;13358:228;;;:::o;13592:373::-;;13755:67;13819:2;13814:3;13755:67;:::i;:::-;13748:74;;13852:34;13848:1;13843:3;13839:11;13832:55;13918:11;13913:2;13908:3;13904:12;13897:33;13956:2;13951:3;13947:12;13940:19;;13738:227;;;:::o;13971:330::-;;14134:67;14198:2;14193:3;14134:67;:::i;:::-;14127:74;;14231:34;14227:1;14222:3;14218:11;14211:55;14292:2;14287:3;14283:12;14276:19;;14117:184;;;:::o;14307:376::-;;14470:67;14534:2;14529:3;14470:67;:::i;:::-;14463:74;;14567:34;14563:1;14558:3;14554:11;14547:55;14633:14;14628:2;14623:3;14619:12;14612:36;14674:2;14669:3;14665:12;14658:19;;14453:230;;;:::o;14689:330::-;;14852:67;14916:2;14911:3;14852:67;:::i;:::-;14845:74;;14949:34;14945:1;14940:3;14936:11;14929:55;15010:2;15005:3;15001:12;14994:19;;14835:184;;;:::o;15025:318::-;;15188:67;15252:2;15247:3;15188:67;:::i;:::-;15181:74;;15285:22;15281:1;15276:3;15272:11;15265:43;15334:2;15329:3;15325:12;15318:19;;15171:172;;;:::o;15349:320::-;;15512:67;15576:2;15571:3;15512:67;:::i;:::-;15505:74;;15609:24;15605:1;15600:3;15596:11;15589:45;15660:2;15655:3;15651:12;15644:19;;15495:174;;;:::o;15675:373::-;;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15935:34;15931:1;15926:3;15922:11;15915:55;16001:11;15996:2;15991:3;15987:12;15980:33;16039:2;16034:3;16030:12;16023:19;;15821:227;;;:::o;16054:379::-;;16217:67;16281:2;16276:3;16217:67;:::i;:::-;16210:74;;16314:34;16310:1;16305:3;16301:11;16294:55;16380:17;16375:2;16370:3;16366:12;16359:39;16424:2;16419:3;16415:12;16408:19;;16200:233;;;:::o;16439:365::-;;16602:67;16666:2;16661:3;16602:67;:::i;:::-;16595:74;;16699:34;16695:1;16690:3;16686:11;16679:55;16765:3;16760:2;16755:3;16751:12;16744:25;16795:2;16790:3;16786:12;16779:19;;16585:219;;;:::o;16810:325::-;;16973:67;17037:2;17032:3;16973:67;:::i;:::-;16966:74;;17070:29;17066:1;17061:3;17057:11;17050:50;17126:2;17121:3;17117:12;17110:19;;16956:179;;;:::o;17141:381::-;;17304:67;17368:2;17363:3;17304:67;:::i;:::-;17297:74;;17401:34;17397:1;17392:3;17388:11;17381:55;17467:19;17462:2;17457:3;17453:12;17446:41;17513:2;17508:3;17504:12;17497:19;;17287:235;;;:::o;17528:368::-;;17691:67;17755:2;17750:3;17691:67;:::i;:::-;17684:74;;17788:34;17784:1;17779:3;17775:11;17768:55;17854:6;17849:2;17844:3;17840:12;17833:28;17887:2;17882:3;17878:12;17871:19;;17674:222;;;:::o;17902:379::-;;18065:67;18129:2;18124:3;18065:67;:::i;:::-;18058:74;;18162:34;18158:1;18153:3;18149:11;18142:55;18228:17;18223:2;18218:3;18214:12;18207:39;18272:2;18267:3;18263:12;18256:19;;18048:233;;;:::o;18287:118::-;18374:24;18392:5;18374:24;:::i;:::-;18369:3;18362:37;18352:53;;:::o;18411:256::-;;18538:75;18609:3;18600:6;18538:75;:::i;:::-;18638:2;18633:3;18629:12;18622:19;;18658:3;18651:10;;18527:140;;;;:::o;18673:397::-;;18828:75;18899:3;18890:6;18828:75;:::i;:::-;18928:2;18923:3;18919:12;18912:19;;18941:75;19012:3;19003:6;18941:75;:::i;:::-;19041:2;19036:3;19032:12;19025:19;;19061:3;19054:10;;18817:253;;;;;:::o;19076:435::-;;19278:95;19369:3;19360:6;19278:95;:::i;:::-;19271:102;;19390:95;19481:3;19472:6;19390:95;:::i;:::-;19383:102;;19502:3;19495:10;;19260:251;;;;;:::o;19517:222::-;;19648:2;19637:9;19633:18;19625:26;;19661:71;19729:1;19718:9;19714:17;19705:6;19661:71;:::i;:::-;19615:124;;;;:::o;19745:254::-;;19892:2;19881:9;19877:18;19869:26;;19905:87;19989:1;19978:9;19974:17;19965:6;19905:87;:::i;:::-;19859:140;;;;:::o;20005:640::-;;20238:3;20227:9;20223:19;20215:27;;20252:71;20320:1;20309:9;20305:17;20296:6;20252:71;:::i;:::-;20333:72;20401:2;20390:9;20386:18;20377:6;20333:72;:::i;:::-;20415;20483:2;20472:9;20468:18;20459:6;20415:72;:::i;:::-;20534:9;20528:4;20524:20;20519:2;20508:9;20504:18;20497:48;20562:76;20633:4;20624:6;20562:76;:::i;:::-;20554:84;;20205:440;;;;;;;:::o;20651:210::-;;20776:2;20765:9;20761:18;20753:26;;20789:65;20851:1;20840:9;20836:17;20827:6;20789:65;:::i;:::-;20743:118;;;;:::o;20867:222::-;;20998:2;20987:9;20983:18;20975:26;;21011:71;21079:1;21068:9;21064:17;21055:6;21011:71;:::i;:::-;20965:124;;;;:::o;21095:313::-;;21246:2;21235:9;21231:18;21223:26;;21295:9;21289:4;21285:20;21281:1;21270:9;21266:17;21259:47;21323:78;21396:4;21387:6;21323:78;:::i;:::-;21315:86;;21213:195;;;;:::o;21414:419::-;;21618:2;21607:9;21603:18;21595:26;;21667:9;21661:4;21657:20;21653:1;21642:9;21638:17;21631:47;21695:131;21821:4;21695:131;:::i;:::-;21687:139;;21585:248;;;:::o;21839:419::-;;22043:2;22032:9;22028:18;22020:26;;22092:9;22086:4;22082:20;22078:1;22067:9;22063:17;22056:47;22120:131;22246:4;22120:131;:::i;:::-;22112:139;;22010:248;;;:::o;22264:419::-;;22468:2;22457:9;22453:18;22445:26;;22517:9;22511:4;22507:20;22503:1;22492:9;22488:17;22481:47;22545:131;22671:4;22545:131;:::i;:::-;22537:139;;22435:248;;;:::o;22689:419::-;;22893:2;22882:9;22878:18;22870:26;;22942:9;22936:4;22932:20;22928:1;22917:9;22913:17;22906:47;22970:131;23096:4;22970:131;:::i;:::-;22962:139;;22860:248;;;:::o;23114:419::-;;23318:2;23307:9;23303:18;23295:26;;23367:9;23361:4;23357:20;23353:1;23342:9;23338:17;23331:47;23395:131;23521:4;23395:131;:::i;:::-;23387:139;;23285:248;;;:::o;23539:419::-;;23743:2;23732:9;23728:18;23720:26;;23792:9;23786:4;23782:20;23778:1;23767:9;23763:17;23756:47;23820:131;23946:4;23820:131;:::i;:::-;23812:139;;23710:248;;;:::o;23964:419::-;;24168:2;24157:9;24153:18;24145:26;;24217:9;24211:4;24207:20;24203:1;24192:9;24188:17;24181:47;24245:131;24371:4;24245:131;:::i;:::-;24237:139;;24135:248;;;:::o;24389:419::-;;24593:2;24582:9;24578:18;24570:26;;24642:9;24636:4;24632:20;24628:1;24617:9;24613:17;24606:47;24670:131;24796:4;24670:131;:::i;:::-;24662:139;;24560:248;;;:::o;24814:419::-;;25018:2;25007:9;25003:18;24995:26;;25067:9;25061:4;25057:20;25053:1;25042:9;25038:17;25031:47;25095:131;25221:4;25095:131;:::i;:::-;25087:139;;24985:248;;;:::o;25239:419::-;;25443:2;25432:9;25428:18;25420:26;;25492:9;25486:4;25482:20;25478:1;25467:9;25463:17;25456:47;25520:131;25646:4;25520:131;:::i;:::-;25512:139;;25410:248;;;:::o;25664:419::-;;25868:2;25857:9;25853:18;25845:26;;25917:9;25911:4;25907:20;25903:1;25892:9;25888:17;25881:47;25945:131;26071:4;25945:131;:::i;:::-;25937:139;;25835:248;;;:::o;26089:419::-;;26293:2;26282:9;26278:18;26270:26;;26342:9;26336:4;26332:20;26328:1;26317:9;26313:17;26306:47;26370:131;26496:4;26370:131;:::i;:::-;26362:139;;26260:248;;;:::o;26514:419::-;;26718:2;26707:9;26703:18;26695:26;;26767:9;26761:4;26757:20;26753:1;26742:9;26738:17;26731:47;26795:131;26921:4;26795:131;:::i;:::-;26787:139;;26685:248;;;:::o;26939:419::-;;27143:2;27132:9;27128:18;27120:26;;27192:9;27186:4;27182:20;27178:1;27167:9;27163:17;27156:47;27220:131;27346:4;27220:131;:::i;:::-;27212:139;;27110:248;;;:::o;27364:419::-;;27568:2;27557:9;27553:18;27545:26;;27617:9;27611:4;27607:20;27603:1;27592:9;27588:17;27581:47;27645:131;27771:4;27645:131;:::i;:::-;27637:139;;27535:248;;;:::o;27789:419::-;;27993:2;27982:9;27978:18;27970:26;;28042:9;28036:4;28032:20;28028:1;28017:9;28013:17;28006:47;28070:131;28196:4;28070:131;:::i;:::-;28062:139;;27960:248;;;:::o;28214:419::-;;28418:2;28407:9;28403:18;28395:26;;28467:9;28461:4;28457:20;28453:1;28442:9;28438:17;28431:47;28495:131;28621:4;28495:131;:::i;:::-;28487:139;;28385:248;;;:::o;28639:419::-;;28843:2;28832:9;28828:18;28820:26;;28892:9;28886:4;28882:20;28878:1;28867:9;28863:17;28856:47;28920:131;29046:4;28920:131;:::i;:::-;28912:139;;28810:248;;;:::o;29064:419::-;;29268:2;29257:9;29253:18;29245:26;;29317:9;29311:4;29307:20;29303:1;29292:9;29288:17;29281:47;29345:131;29471:4;29345:131;:::i;:::-;29337:139;;29235:248;;;:::o;29489:419::-;;29693:2;29682:9;29678:18;29670:26;;29742:9;29736:4;29732:20;29728:1;29717:9;29713:17;29706:47;29770:131;29896:4;29770:131;:::i;:::-;29762:139;;29660:248;;;:::o;29914:419::-;;30118:2;30107:9;30103:18;30095:26;;30167:9;30161:4;30157:20;30153:1;30142:9;30138:17;30131:47;30195:131;30321:4;30195:131;:::i;:::-;30187:139;;30085:248;;;:::o;30339:419::-;;30543:2;30532:9;30528:18;30520:26;;30592:9;30586:4;30582:20;30578:1;30567:9;30563:17;30556:47;30620:131;30746:4;30620:131;:::i;:::-;30612:139;;30510:248;;;:::o;30764:419::-;;30968:2;30957:9;30953:18;30945:26;;31017:9;31011:4;31007:20;31003:1;30992:9;30988:17;30981:47;31045:131;31171:4;31045:131;:::i;:::-;31037:139;;30935:248;;;:::o;31189:222::-;;31320:2;31309:9;31305:18;31297:26;;31333:71;31401:1;31390:9;31386:17;31377:6;31333:71;:::i;:::-;31287:124;;;;:::o;31417:283::-;;31483:2;31477:9;31467:19;;31525:4;31517:6;31513:17;31632:6;31620:10;31617:22;31596:18;31584:10;31581:34;31578:62;31575:2;;;31643:18;;:::i;:::-;31575:2;31683:10;31679:2;31672:22;31457:243;;;;:::o;31706:311::-;;31873:18;31865:6;31862:30;31859:2;;;31895:18;;:::i;:::-;31859:2;31945:4;31937:6;31933:17;31925:25;;32005:4;31999;31995:15;31987:23;;31788:229;;;:::o;32023:331::-;;32174:18;32166:6;32163:30;32160:2;;;32196:18;;:::i;:::-;32160:2;32281:4;32277:9;32270:4;32262:6;32258:17;32254:33;32246:41;;32342:4;32336;32332:15;32324:23;;32089:265;;;:::o;32360:332::-;;32512:18;32504:6;32501:30;32498:2;;;32534:18;;:::i;:::-;32498:2;32619:4;32615:9;32608:4;32600:6;32596:17;32592:33;32584:41;;32680:4;32674;32670:15;32662:23;;32427:265;;;:::o;32698:98::-;;32783:5;32777:12;32767:22;;32756:40;;;:::o;32802:99::-;;32888:5;32882:12;32872:22;;32861:40;;;:::o;32907:168::-;;33024:6;33019:3;33012:19;33064:4;33059:3;33055:14;33040:29;;33002:73;;;;:::o;33081:169::-;;33199:6;33194:3;33187:19;33239:4;33234:3;33230:14;33215:29;;33177:73;;;;:::o;33256:148::-;;33395:3;33380:18;;33370:34;;;;:::o;33410:305::-;;33469:20;33487:1;33469:20;:::i;:::-;33464:25;;33503:20;33521:1;33503:20;:::i;:::-;33498:25;;33657:1;33589:66;33585:74;33582:1;33579:81;33576:2;;;33663:18;;:::i;:::-;33576:2;33707:1;33704;33700:9;33693:16;;33454:261;;;;:::o;33721:185::-;;33778:20;33796:1;33778:20;:::i;:::-;33773:25;;33812:20;33830:1;33812:20;:::i;:::-;33807:25;;33851:1;33841:2;;33856:18;;:::i;:::-;33841:2;33898:1;33895;33891:9;33886:14;;33763:143;;;;:::o;33912:348::-;;33975:20;33993:1;33975:20;:::i;:::-;33970:25;;34009:20;34027:1;34009:20;:::i;:::-;34004:25;;34197:1;34129:66;34125:74;34122:1;34119:81;34114:1;34107:9;34100:17;34096:105;34093:2;;;34204:18;;:::i;:::-;34093:2;34252:1;34249;34245:9;34234:20;;33960:300;;;;:::o;34266:191::-;;34326:20;34344:1;34326:20;:::i;:::-;34321:25;;34360:20;34378:1;34360:20;:::i;:::-;34355:25;;34399:1;34396;34393:8;34390:2;;;34404:18;;:::i;:::-;34390:2;34449:1;34446;34442:9;34434:17;;34311:146;;;;:::o;34463:96::-;;34529:24;34547:5;34529:24;:::i;:::-;34518:35;;34508:51;;;:::o;34565:104::-;;34639:24;34657:5;34639:24;:::i;:::-;34628:35;;34618:51;;;:::o;34675:90::-;;34752:5;34745:13;34738:21;34727:32;;34717:48;;;:::o;34771:77::-;;34837:5;34826:16;;34816:32;;;:::o;34854:149::-;;34930:66;34923:5;34919:78;34908:89;;34898:105;;;:::o;35009:126::-;;35086:42;35079:5;35075:54;35064:65;;35054:81;;;:::o;35141:77::-;;35207:5;35196:16;;35186:32;;;:::o;35224:154::-;35308:6;35303:3;35298;35285:30;35370:1;35361:6;35356:3;35352:16;35345:27;35275:103;;;:::o;35384:307::-;35452:1;35462:113;35476:6;35473:1;35470:13;35462:113;;;35561:1;35556:3;35552:11;35546:18;35542:1;35537:3;35533:11;35526:39;35498:2;35495:1;35491:10;35486:15;;35462:113;;;35593:6;35590:1;35587:13;35584:2;;;35673:1;35664:6;35659:3;35655:16;35648:27;35584:2;35433:258;;;;:::o;35697:320::-;;35778:1;35772:4;35768:12;35758:22;;35825:1;35819:4;35815:12;35846:18;35836:2;;35902:4;35894:6;35890:17;35880:27;;35836:2;35964;35956:6;35953:14;35933:18;35930:38;35927:2;;;35983:18;;:::i;:::-;35927:2;35748:269;;;;:::o;36023:233::-;;36085:24;36103:5;36085:24;:::i;:::-;36076:33;;36131:66;36124:5;36121:77;36118:2;;;36201:18;;:::i;:::-;36118:2;36248:1;36241:5;36237:13;36230:20;;36066:190;;;:::o;36262:100::-;;36330:26;36350:5;36330:26;:::i;:::-;36319:37;;36309:53;;;:::o;36368:79::-;;36436:5;36425:16;;36415:32;;;:::o;36453:94::-;;36521:20;36535:5;36521:20;:::i;:::-;36510:31;;36500:47;;;:::o;36553:176::-;;36602:20;36620:1;36602:20;:::i;:::-;36597:25;;36636:20;36654:1;36636:20;:::i;:::-;36631:25;;36675:1;36665:2;;36680:18;;:::i;:::-;36665:2;36721:1;36718;36714:9;36709:14;;36587:142;;;;:::o;36735:180::-;36783:77;36780:1;36773:88;36880:4;36877:1;36870:15;36904:4;36901:1;36894:15;36921:180;36969:77;36966:1;36959:88;37066:4;37063:1;37056:15;37090:4;37087:1;37080:15;37107:180;37155:77;37152:1;37145:88;37252:4;37249:1;37242:15;37276:4;37273:1;37266:15;37293:180;37341:77;37338:1;37331:88;37438:4;37435:1;37428:15;37462:4;37459:1;37452:15;37479:102;;37571:2;37567:7;37562:2;37555:5;37551:14;37547:28;37537:38;;37527:54;;;:::o;37587:94::-;;37668:5;37664:2;37660:14;37639:35;;37629:52;;;:::o;37687:122::-;37760:24;37778:5;37760:24;:::i;:::-;37753:5;37750:35;37740:2;;37799:1;37796;37789:12;37740:2;37730:79;:::o;37815:116::-;37885:21;37900:5;37885:21;:::i;:::-;37878:5;37875:32;37865:2;;37921:1;37918;37911:12;37865:2;37855:76;:::o;37937:122::-;38010:24;38028:5;38010:24;:::i;:::-;38003:5;38000:35;37990:2;;38049:1;38046;38039:12;37990:2;37980:79;:::o;38065:120::-;38137:23;38154:5;38137:23;:::i;:::-;38130:5;38127:34;38117:2;;38175:1;38172;38165:12;38117:2;38107:78;:::o;38191:122::-;38264:24;38282:5;38264:24;:::i;:::-;38257:5;38254:35;38244:2;;38303:1;38300;38293:12;38244:2;38234:79;:::o

Swarm Source

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