Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
415
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
SpermNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-10 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @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: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @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: @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/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/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: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @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/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/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: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/SpermNFT.sol pragma solidity >=0.7.0 <0.9.0; contract SpermNFT is ERC721Enumerable, Ownable, ERC721Royalty { using Strings for uint256; using SafeMath for uint256; using ECDSA for bytes32; string public baseURI; string private _baseExtension = ".json"; string private _notRevealedUri; string private _contractURI; uint256 public cost = 0 ether; //price for 1 nft uint256 public maxSupply = 1000; // number of nft in the collection uint256 public maxMintAmount = 1; uint256 public nftPerAddressLimit = 1; bool public paused = false; bool public revealed = false; bool public onlyWhitelisted = true; mapping(address => uint256) public addressMintedBalance; uint8 private _og = 2; uint8 private _wl = 1; constructor() ERC721("SpermNFT", "SPERM") { setBaseURI("ipfs://QmWagEWb2WA6HVuJrYgu64Jc5mFbWczvBiDRhuJE279Fkb/"); setNotRevealedURI("ipfs://Qmcsk5Ex362ok7wpFxNgsdyWNZZN1fPiiohftDn9FchuUR"); _setDefaultRoyalty(owner(), 1000); setContractURI("ipfs://QmNie8dNLnzGhC9K6aGWR3j5fnHLJGD4mT21BhwDx2vk4X"); } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory _URI) public onlyOwner { _contractURI = _URI; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721Royalty) { super._burn(tokenId); _resetTokenRoyalty(tokenId); } function setMaxSupply(uint256 _amount) public onlyOwner { maxSupply = _amount; } function mint(uint256 _mintAmount, bytes memory _signature) public payable { require(!paused, "the contract is paused"); uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); uint256 maxMint = maxMintAmount; uint256 nftPerAdress = nftPerAddressLimit; if (msg.sender != owner()) { if (onlyWhitelisted == true) { if (!isOGListed(_signature)) { require( isWhitelisted(_signature), "user is not whitelisted" ); } else { maxMint = 2; nftPerAdress = 2; } uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require( ownerMintedCount + _mintAmount <= nftPerAdress, "max NFT per address exceeded" ); } require( _mintAmount <= maxMint, "max mint amount per session exceeded" ); require(msg.value >= cost * _mintAmount, "insufficient funds!"); } for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, supply + i); } } function isMessageValid(bytes memory _signature, uint8 _nonce) public view returns (address, bool) { bytes32 messagehash = keccak256( abi.encodePacked(address(this), msg.sender, _nonce) ); address signer = messagehash.toEthSignedMessageHash().recover( _signature ); if (msg.sender == signer) { return (signer, true); } else { return (signer, false); } } function isWhitelisted(bytes memory _signature) public view returns (bool) { (, bool success) = isMessageValid(_signature, _wl); return success; } function isOGListed(bytes memory _signature) private view returns (bool) { (, bool success) = isMessageValid(_signature, _og); return success; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return _notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), _baseExtension ) ) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { _baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { _notRevealedUri = _notRevealedURI; } function pause(bool _state) public onlyOwner { paused = _state; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; if (onlyWhitelisted) maxMintAmount = 1; else maxMintAmount = 10; } function withdraw() external onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function getBalance() public view onlyOwner returns (uint256) { return address(this).balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint8","name":"_nonce","type":"uint8"}],"name":"isMessageValid","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000519291906200070b565b5060006011556103e8601255600160135560016014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff0219169083151502179055506002601760006101000a81548160ff021916908360ff1602179055506001601760016101000a81548160ff021916908360ff160217905550348015620000fd57600080fd5b506040518060400160405280600881526020017f537065726d4e46540000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f535045524d0000000000000000000000000000000000000000000000000000008152508160029080519060200190620001829291906200070b565b5080600390805190602001906200019b9291906200070b565b505050620001be620001b26200026560201b60201c565b6200026d60201b60201c565b620001e860405180606001604052806036815260200162006699603691396200033360201b60201c565b620002126040518060600160405280603581526020016200670460359139620003de60201b60201c565b62000235620002266200048960201b60201c565b6103e8620004b360201b60201c565b6200025f604051806060016040528060358152602001620066cf603591396200065660201b60201c565b620009ad565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003436200026560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003696200048960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b99062000830565b60405180910390fd5b80600d9080519060200190620003da9291906200070b565b5050565b620003ee6200026560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004146200048960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200046d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004649062000830565b60405180910390fd5b80600f9080519060200190620004859291906200070b565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004c36200070160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000524576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051b9062000852565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000597576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058e9062000874565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620006666200026560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200068c6200048960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620006e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006dc9062000830565b60405180910390fd5b8060109080519060200190620006fd9291906200070b565b5050565b6000612710905090565b8280546200071990620008a7565b90600052602060002090601f0160209004810192826200073d576000855562000789565b82601f106200075857805160ff191683800117855562000789565b8280016001018555821562000789579182015b82811115620007885782518255916020019190600101906200076b565b5b5090506200079891906200079c565b5090565b5b80821115620007b75760008160009055506001016200079d565b5090565b6000620007ca60208362000896565b9150620007d7826200090c565b602082019050919050565b6000620007f1602a8362000896565b9150620007fe8262000935565b604082019050919050565b60006200081860198362000896565b9150620008258262000984565b602082019050919050565b600060208201905081810360008301526200084b81620007bb565b9050919050565b600060208201905081810360008301526200086d81620007e2565b9050919050565b600060208201905081810360008301526200088f8162000809565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620008c057607f821691505b60208210811415620008d757620008d6620008dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b615cdc80620009bd6000396000f3fe6080604052600436106102885760003560e01c80636352211e1161015a578063a475b5dd116100c1578063da3ef23f1161007a578063da3ef23f146109f4578063db7fd40814610a1d578063e8a3d48514610a39578063e985e9c514610a64578063f2c4ce1e14610aa1578063f2fde38b14610aca57610288565b8063a475b5dd146108f8578063b88d4fde1461090f578063ba7d2c7614610938578063c87b56dd14610963578063d0eb26b0146109a0578063d5abeb01146109c957610288565b8063890557541161011357806389055754146107e85780638da5cb5b14610825578063938e3d7b1461085057806395d89b41146108795780639c70b512146108a4578063a22cb465146108cf57610288565b80636352211e146106da5780636c0360eb146107175780636f8b44b01461074257806370a082311461076b578063715018a6146107a85780637f00c7a6146107bf57610288565b806323b872dd116101fe578063438b6300116101b7578063438b6300146105b857806344a0d68a146105f55780634f6ccce71461061e578063518302271461065b57806355f804b3146106865780635c975abb146106af57610288565b806323b872dd146104ab5780632a55205a146104d45780632f745c59146105125780633c9527641461054f5780633ccfd60b1461057857806342842e0e1461058f57610288565b806312065fe01161025057806312065fe01461038457806313faede6146103af57806318160ddd146103da57806318cae269146104055780631c83c63214610442578063239c70ae1461048057610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906140ec565b610af3565b6040516102c19190614af5565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906140bf565b610b05565b005b3480156102ff57600080fd5b50610308610b9e565b6040516103159190614b55565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190614234565b610c30565b6040516103529190614a1a565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061407f565b610cb5565b005b34801561039057600080fd5b50610399610dcd565b6040516103a69190614f17565b60405180910390f35b3480156103bb57600080fd5b506103c4610e51565b6040516103d19190614f17565b60405180910390f35b3480156103e657600080fd5b506103ef610e57565b6040516103fc9190614f17565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613efc565b610e64565b6040516104399190614f17565b60405180910390f35b34801561044e57600080fd5b506104696004803603810190610464919061418f565b610e7c565b604051610477929190614a81565b60405180910390f35b34801561048c57600080fd5b50610495610f20565b6040516104a29190614f17565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613f69565b610f26565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906142bd565b610f86565b604051610509929190614aaa565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061407f565b611171565b6040516105469190614f17565b60405180910390f35b34801561055b57600080fd5b50610576600480360381019061057191906140bf565b611216565b005b34801561058457600080fd5b5061058d6112da565b005b34801561059b57600080fd5b506105b660048036038101906105b19190613f69565b6113d6565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613efc565b6113f6565b6040516105ec9190614ad3565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190614234565b6114a4565b005b34801561062a57600080fd5b5061064560048036038101906106409190614234565b61152a565b6040516106529190614f17565b60405180910390f35b34801561066757600080fd5b5061067061159b565b60405161067d9190614af5565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a891906141eb565b6115ae565b005b3480156106bb57600080fd5b506106c4611644565b6040516106d19190614af5565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190614234565b611657565b60405161070e9190614a1a565b60405180910390f35b34801561072357600080fd5b5061072c611709565b6040516107399190614b55565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190614234565b611797565b005b34801561077757600080fd5b50610792600480360381019061078d9190613efc565b61181d565b60405161079f9190614f17565b60405180910390f35b3480156107b457600080fd5b506107bd6118d5565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190614234565b61195d565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190614146565b6119e3565b60405161081c9190614af5565b60405180910390f35b34801561083157600080fd5b5061083a611a0b565b6040516108479190614a1a565b60405180910390f35b34801561085c57600080fd5b50610877600480360381019061087291906141eb565b611a35565b005b34801561088557600080fd5b5061088e611acb565b60405161089b9190614b55565b60405180910390f35b3480156108b057600080fd5b506108b9611b5d565b6040516108c69190614af5565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f1919061403f565b611b70565b005b34801561090457600080fd5b5061090d611b86565b005b34801561091b57600080fd5b5061093660048036038101906109319190613fbc565b611c1f565b005b34801561094457600080fd5b5061094d611c81565b60405161095a9190614f17565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190614234565b611c87565b6040516109979190614b55565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190614234565b611de0565b005b3480156109d557600080fd5b506109de611e66565b6040516109eb9190614f17565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a1691906141eb565b611e6c565b005b610a376004803603810190610a329190614261565b611f02565b005b348015610a4557600080fd5b50610a4e612273565b604051610a5b9190614b55565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190613f29565b612305565b604051610a989190614af5565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac391906141eb565b612399565b005b348015610ad657600080fd5b50610af16004803603810190610aec9190613efc565b61242f565b005b6000610afe82612527565b9050919050565b610b0d612539565b73ffffffffffffffffffffffffffffffffffffffff16610b2b611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614e17565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060028054610bad90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd990615237565b8015610c265780601f10610bfb57610100808354040283529160200191610c26565b820191906000526020600020905b815481529060010190602001808311610c0957829003601f168201915b5050505050905090565b6000610c3b82612541565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190614df7565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc082611657565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614e77565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d50612539565b73ffffffffffffffffffffffffffffffffffffffff161480610d7f5750610d7e81610d79612539565b612305565b5b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590614d17565b60405180910390fd5b610dc883836125ad565b505050565b6000610dd7612539565b73ffffffffffffffffffffffffffffffffffffffff16610df5611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290614e17565b60405180910390fd5b47905090565b60115481565b6000600a80549050905090565b60166020528060005260406000206000915090505481565b6000806000303385604051602001610e9693929190614971565b6040516020818303038152906040528051906020012090506000610ecb86610ebd84612666565b61269690919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610f0f57806001935093505050610f19565b8060009350935050505b9250929050565b60135481565b610f37610f31612539565b826126bd565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614e97565b60405180910390fd5b610f8183838361279b565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561111c5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611126612a02565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661115291906150dc565b61115c91906150ab565b90508160000151819350935050509250929050565b600061117c8361181d565b82106111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614bd7565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61121e612539565b73ffffffffffffffffffffffffffffffffffffffff1661123c611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990614e17565b60405180910390fd5b80601560026101000a81548160ff021916908315150217905550601560029054906101000a900460ff16156112ce5760016013819055506112d7565b600a6013819055505b50565b6112e2612539565b73ffffffffffffffffffffffffffffffffffffffff16611300611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614e17565b60405180910390fd5b6000611360611a0b565b73ffffffffffffffffffffffffffffffffffffffff164760405161138390614a05565b60006040518083038185875af1925050503d80600081146113c0576040519150601f19603f3d011682016040523d82523d6000602084013e6113c5565b606091505b50509050806113d357600080fd5b50565b6113f183838360405180602001604052806000815250611c1f565b505050565b606060006114038361181d565b905060008167ffffffffffffffff8111156114215761142061546e565b5b60405190808252806020026020018201604052801561144f5781602001602082028036833780820191505090505b50905060005b82811015611499576114678582611171565b82828151811061147a5761147961543f565b5b60200260200101818152505080806114919061529a565b915050611455565b508092505050919050565b6114ac612539565b73ffffffffffffffffffffffffffffffffffffffff166114ca611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790614e17565b60405180910390fd5b8060118190555050565b6000611534610e57565b8210611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614eb7565b60405180910390fd5b600a82815481106115895761158861543f565b5b90600052602060002001549050919050565b601560019054906101000a900460ff1681565b6115b6612539565b73ffffffffffffffffffffffffffffffffffffffff166115d4611a0b565b73ffffffffffffffffffffffffffffffffffffffff161461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614e17565b60405180910390fd5b80600d9080519060200190611640929190613cfb565b5050565b601560009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614d57565b60405180910390fd5b80915050919050565b600d805461171690615237565b80601f016020809104026020016040519081016040528092919081815260200182805461174290615237565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b505050505081565b61179f612539565b73ffffffffffffffffffffffffffffffffffffffff166117bd611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614e17565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614d37565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118dd612539565b73ffffffffffffffffffffffffffffffffffffffff166118fb611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194890614e17565b60405180910390fd5b61195b6000612a0c565b565b611965612539565b73ffffffffffffffffffffffffffffffffffffffff16611983611a0b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d090614e17565b60405180910390fd5b8060138190555050565b6000806119ff83601760019054906101000a900460ff16610e7c565b91505080915050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a3d612539565b73ffffffffffffffffffffffffffffffffffffffff16611a5b611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890614e17565b60405180910390fd5b8060109080519060200190611ac7929190613cfb565b5050565b606060038054611ada90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0690615237565b8015611b535780601f10611b2857610100808354040283529160200191611b53565b820191906000526020600020905b815481529060010190602001808311611b3657829003601f168201915b5050505050905090565b601560029054906101000a900460ff1681565b611b82611b7b612539565b8383612ad2565b5050565b611b8e612539565b73ffffffffffffffffffffffffffffffffffffffff16611bac611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf990614e17565b60405180910390fd5b6001601560016101000a81548160ff021916908315150217905550565b611c30611c2a612539565b836126bd565b611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690614e97565b60405180910390fd5b611c7b84848484612c3f565b50505050565b60145481565b6060611c9282612541565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614e57565b60405180910390fd5b60001515601560019054906101000a900460ff1615151415611d7f57600f8054611cfa90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2690615237565b8015611d735780601f10611d4857610100808354040283529160200191611d73565b820191906000526020600020905b815481529060010190602001808311611d5657829003601f168201915b50505050509050611ddb565b6000611d89612c9b565b90506000815111611da95760405180602001604052806000815250611dd7565b80611db384612d2d565b600e604051602001611dc7939291906149ae565b6040516020818303038152906040525b9150505b919050565b611de8612539565b73ffffffffffffffffffffffffffffffffffffffff16611e06611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614e17565b60405180910390fd5b8060148190555050565b60125481565b611e74612539565b73ffffffffffffffffffffffffffffffffffffffff16611e92611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf90614e17565b60405180910390fd5b80600e9080519060200190611efe929190613cfb565b5050565b601560009054906101000a900460ff1615611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990614e37565b60405180910390fd5b6000611f5c610e57565b905060008311611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890614ef7565b60405180910390fd5b6012548382611fb09190615055565b1115611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe890614d77565b60405180910390fd5b6000601354905060006014549050612007611a0b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121e05760011515601560029054906101000a900460ff161515141561214c5761205e84612e8e565b6120af5761206b846119e3565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614ed7565b60405180910390fd5b6120b8565b60029150600290505b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508186826121099190615055565b111561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190614c77565b60405180910390fd5b505b8185111561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614d97565b60405180910390fd5b8460115461219d91906150dc565b3410156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614b97565b60405180910390fd5b5b6000600190505b85811161226b57601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061223e9061529a565b91905055506122583382866122539190615055565b612eb6565b80806122639061529a565b9150506121e7565b505050505050565b60606010805461228290615237565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90615237565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a1612539565b73ffffffffffffffffffffffffffffffffffffffff166123bf611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c90614e17565b60405180910390fd5b80600f908051906020019061242b929190613cfb565b5050565b612437612539565b73ffffffffffffffffffffffffffffffffffffffff16612455611a0b565b73ffffffffffffffffffffffffffffffffffffffff16146124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614e17565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251290614c17565b60405180910390fd5b61252481612a0c565b50565b600061253282612ed4565b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661262083611657565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008160405160200161267991906149df565b604051602081830303815290604052805190602001209050919050565b60008060006126a58585612f4e565b915091506126b281612fd1565b819250505092915050565b60006126c882612541565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614cf7565b60405180910390fd5b600061271283611657565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278157508373ffffffffffffffffffffffffffffffffffffffff1661276984610c30565b73ffffffffffffffffffffffffffffffffffffffff16145b8061279257506127918185612305565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127bb82611657565b73ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614c97565b60405180910390fd5b61288c8383836131a6565b6128976000826125ad565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e79190615136565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293e9190615055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8383836131b6565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3890614cb7565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c329190614af5565b60405180910390a3505050565b612c4a84848461279b565b612c56848484846131bb565b612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c90614bf7565b60405180910390fd5b50505050565b6060600d8054612caa90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd690615237565b8015612d235780601f10612cf857610100808354040283529160200191612d23565b820191906000526020600020905b815481529060010190602001808311612d0657829003601f168201915b5050505050905090565b60606000821415612d75576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e89565b600082905060005b60008214612da7578080612d909061529a565b915050600a82612da091906150ab565b9150612d7d565b60008167ffffffffffffffff811115612dc357612dc261546e565b5b6040519080825280601f01601f191660200182016040528015612df55781602001600182028036833780820191505090505b5090505b60008514612e8257600182612e0e9190615136565b9150600a85612e1d9190615323565b6030612e299190615055565b60f81b818381518110612e3f57612e3e61543f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e7b91906150ab565b9450612df9565b8093505050505b919050565b600080612eaa83601760009054906101000a900460ff16610e7c565b91505080915050919050565b612ed0828260405180602001604052806000815250613352565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f475750612f46826133ad565b5b9050919050565b600080604183511415612f905760008060006020860151925060408601519150606086015160001a9050612f848782858561348f565b94509450505050612fca565b604083511415612fc1576000806020850151915060408501519050612fb686838361359c565b935093505050612fca565b60006002915091505b9250929050565b60006004811115612fe557612fe46153b2565b5b816004811115612ff857612ff76153b2565b5b1415613003576131a3565b60016004811115613017576130166153b2565b5b81600481111561302a576130296153b2565b5b141561306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290614b77565b60405180910390fd5b6002600481111561307f5761307e6153b2565b5b816004811115613092576130916153b2565b5b14156130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ca90614bb7565b60405180910390fd5b600360048111156130e7576130e66153b2565b5b8160048111156130fa576130f96153b2565b5b141561313b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313290614cd7565b60405180910390fd5b60048081111561314e5761314d6153b2565b5b816004811115613161576131606153b2565b5b14156131a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319990614db7565b60405180910390fd5b5b50565b6131b18383836135fb565b505050565b505050565b60006131dc8473ffffffffffffffffffffffffffffffffffffffff1661370f565b15613345578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613205612539565b8786866040518563ffffffff1660e01b81526004016132279493929190614a35565b602060405180830381600087803b15801561324157600080fd5b505af192505050801561327257506040513d601f19601f8201168201806040525081019061326f9190614119565b60015b6132f5573d80600081146132a2576040519150601f19603f3d011682016040523d82523d6000602084013e6132a7565b606091505b506000815114156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e490614bf7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061334a565b600190505b949350505050565b61335c8383613732565b61336960008484846131bb565b6133a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339f90614bf7565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061347857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061348857506134878261390c565b5b9050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134ca576000600391509150613593565b601b8560ff16141580156134e25750601c8560ff1614155b156134f4576000600491509150613593565b6000600187878787604051600081526020016040526040516135199493929190614b10565b6020604051602081039080840390855afa15801561353b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561358a57600060019250925050613593565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135df9190615055565b90506135ed8782888561348f565b935093505050935093915050565b613606838383613986565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613649576136448161398b565b613688565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136875761368683826139d4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136cb576136c681613b41565b61370a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613709576137088282613c12565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379990614dd7565b60405180910390fd5b6137ab81612541565b156137eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e290614c57565b60405180910390fd5b6137f7600083836131a6565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138479190615055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613908600083836131b6565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061397f575061397e82613c91565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139e18461181d565b6139eb9190615136565b9050600060096000848152602001908152602001600020549050818114613ad0576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613b559190615136565b90506000600b60008481526020019081526020016000205490506000600a8381548110613b8557613b8461543f565b5b9060005260206000200154905080600a8381548110613ba757613ba661543f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613bf657613bf5615410565b5b6001900381819060005260206000200160009055905550505050565b6000613c1d8361181d565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613d0790615237565b90600052602060002090601f016020900481019282613d295760008555613d70565b82601f10613d4257805160ff1916838001178555613d70565b82800160010185558215613d70579182015b82811115613d6f578251825591602001919060010190613d54565b5b509050613d7d9190613d81565b5090565b5b80821115613d9a576000816000905550600101613d82565b5090565b6000613db1613dac84614f57565b614f32565b905082815260208101848484011115613dcd57613dcc6154a2565b5b613dd88482856151f5565b509392505050565b6000613df3613dee84614f88565b614f32565b905082815260208101848484011115613e0f57613e0e6154a2565b5b613e1a8482856151f5565b509392505050565b600081359050613e3181615c33565b92915050565b600081359050613e4681615c4a565b92915050565b600081359050613e5b81615c61565b92915050565b600081519050613e7081615c61565b92915050565b600082601f830112613e8b57613e8a61549d565b5b8135613e9b848260208601613d9e565b91505092915050565b600082601f830112613eb957613eb861549d565b5b8135613ec9848260208601613de0565b91505092915050565b600081359050613ee181615c78565b92915050565b600081359050613ef681615c8f565b92915050565b600060208284031215613f1257613f116154ac565b5b6000613f2084828501613e22565b91505092915050565b60008060408385031215613f4057613f3f6154ac565b5b6000613f4e85828601613e22565b9250506020613f5f85828601613e22565b9150509250929050565b600080600060608486031215613f8257613f816154ac565b5b6000613f9086828701613e22565b9350506020613fa186828701613e22565b9250506040613fb286828701613ed2565b9150509250925092565b60008060008060808587031215613fd657613fd56154ac565b5b6000613fe487828801613e22565b9450506020613ff587828801613e22565b935050604061400687828801613ed2565b925050606085013567ffffffffffffffff811115614027576140266154a7565b5b61403387828801613e76565b91505092959194509250565b60008060408385031215614056576140556154ac565b5b600061406485828601613e22565b925050602061407585828601613e37565b9150509250929050565b60008060408385031215614096576140956154ac565b5b60006140a485828601613e22565b92505060206140b585828601613ed2565b9150509250929050565b6000602082840312156140d5576140d46154ac565b5b60006140e384828501613e37565b91505092915050565b600060208284031215614102576141016154ac565b5b600061411084828501613e4c565b91505092915050565b60006020828403121561412f5761412e6154ac565b5b600061413d84828501613e61565b91505092915050565b60006020828403121561415c5761415b6154ac565b5b600082013567ffffffffffffffff81111561417a576141796154a7565b5b61418684828501613e76565b91505092915050565b600080604083850312156141a6576141a56154ac565b5b600083013567ffffffffffffffff8111156141c4576141c36154a7565b5b6141d085828601613e76565b92505060206141e185828601613ee7565b9150509250929050565b600060208284031215614201576142006154ac565b5b600082013567ffffffffffffffff81111561421f5761421e6154a7565b5b61422b84828501613ea4565b91505092915050565b60006020828403121561424a576142496154ac565b5b600061425884828501613ed2565b91505092915050565b60008060408385031215614278576142776154ac565b5b600061428685828601613ed2565b925050602083013567ffffffffffffffff8111156142a7576142a66154a7565b5b6142b385828601613e76565b9150509250929050565b600080604083850312156142d4576142d36154ac565b5b60006142e285828601613ed2565b92505060206142f385828601613ed2565b9150509250929050565b6000614309838361492d565b60208301905092915050565b61431e8161516a565b82525050565b6143356143308261516a565b6152e3565b82525050565b600061434682614fde565b614350818561500c565b935061435b83614fb9565b8060005b8381101561438c57815161437388826142fd565b975061437e83614fff565b92505060018101905061435f565b5085935050505092915050565b6143a28161517c565b82525050565b6143b181615188565b82525050565b6143c86143c382615188565b6152f5565b82525050565b60006143d982614fe9565b6143e3818561501d565b93506143f3818560208601615204565b6143fc816154b1565b840191505092915050565b600061441282614ff4565b61441c8185615039565b935061442c818560208601615204565b614435816154b1565b840191505092915050565b600061444b82614ff4565b614455818561504a565b9350614465818560208601615204565b80840191505092915050565b6000815461447e81615237565b614488818661504a565b945060018216600081146144a357600181146144b4576144e7565b60ff198316865281860193506144e7565b6144bd85614fc9565b60005b838110156144df578154818901526001820191506020810190506144c0565b838801955050505b50505092915050565b60006144fd601883615039565b9150614508826154dc565b602082019050919050565b6000614520601383615039565b915061452b82615505565b602082019050919050565b6000614543601f83615039565b915061454e8261552e565b602082019050919050565b6000614566601c8361504a565b915061457182615557565b601c82019050919050565b6000614589602b83615039565b915061459482615580565b604082019050919050565b60006145ac603283615039565b91506145b7826155cf565b604082019050919050565b60006145cf602683615039565b91506145da8261561e565b604082019050919050565b60006145f2602583615039565b91506145fd8261566d565b604082019050919050565b6000614615601c83615039565b9150614620826156bc565b602082019050919050565b6000614638601c83615039565b9150614643826156e5565b602082019050919050565b600061465b602483615039565b91506146668261570e565b604082019050919050565b600061467e601983615039565b91506146898261575d565b602082019050919050565b60006146a1602283615039565b91506146ac82615786565b604082019050919050565b60006146c4602c83615039565b91506146cf826157d5565b604082019050919050565b60006146e7603883615039565b91506146f282615824565b604082019050919050565b600061470a602a83615039565b915061471582615873565b604082019050919050565b600061472d602983615039565b9150614738826158c2565b604082019050919050565b6000614750601683615039565b915061475b82615911565b602082019050919050565b6000614773602483615039565b915061477e8261593a565b604082019050919050565b6000614796602283615039565b91506147a182615989565b604082019050919050565b60006147b9602083615039565b91506147c4826159d8565b602082019050919050565b60006147dc602c83615039565b91506147e782615a01565b604082019050919050565b60006147ff602083615039565b915061480a82615a50565b602082019050919050565b6000614822601683615039565b915061482d82615a79565b602082019050919050565b6000614845602f83615039565b915061485082615aa2565b604082019050919050565b6000614868602183615039565b915061487382615af1565b604082019050919050565b600061488b60008361502e565b915061489682615b40565b600082019050919050565b60006148ae603183615039565b91506148b982615b43565b604082019050919050565b60006148d1602c83615039565b91506148dc82615b92565b604082019050919050565b60006148f4601783615039565b91506148ff82615be1565b602082019050919050565b6000614917601b83615039565b915061492282615c0a565b602082019050919050565b614936816151de565b82525050565b614945816151de565b82525050565b614954816151e8565b82525050565b61496b614966826151e8565b615311565b82525050565b600061497d8286614324565b60148201915061498d8285614324565b60148201915061499d828461495a565b600182019150819050949350505050565b60006149ba8286614440565b91506149c68285614440565b91506149d28284614471565b9150819050949350505050565b60006149ea82614559565b91506149f682846143b7565b60208201915081905092915050565b6000614a108261487e565b9150819050919050565b6000602082019050614a2f6000830184614315565b92915050565b6000608082019050614a4a6000830187614315565b614a576020830186614315565b614a64604083018561493c565b8181036060830152614a7681846143ce565b905095945050505050565b6000604082019050614a966000830185614315565b614aa36020830184614399565b9392505050565b6000604082019050614abf6000830185614315565b614acc602083018461493c565b9392505050565b60006020820190508181036000830152614aed818461433b565b905092915050565b6000602082019050614b0a6000830184614399565b92915050565b6000608082019050614b2560008301876143a8565b614b32602083018661494b565b614b3f60408301856143a8565b614b4c60608301846143a8565b95945050505050565b60006020820190508181036000830152614b6f8184614407565b905092915050565b60006020820190508181036000830152614b90816144f0565b9050919050565b60006020820190508181036000830152614bb081614513565b9050919050565b60006020820190508181036000830152614bd081614536565b9050919050565b60006020820190508181036000830152614bf08161457c565b9050919050565b60006020820190508181036000830152614c108161459f565b9050919050565b60006020820190508181036000830152614c30816145c2565b9050919050565b60006020820190508181036000830152614c50816145e5565b9050919050565b60006020820190508181036000830152614c7081614608565b9050919050565b60006020820190508181036000830152614c908161462b565b9050919050565b60006020820190508181036000830152614cb08161464e565b9050919050565b60006020820190508181036000830152614cd081614671565b9050919050565b60006020820190508181036000830152614cf081614694565b9050919050565b60006020820190508181036000830152614d10816146b7565b9050919050565b60006020820190508181036000830152614d30816146da565b9050919050565b60006020820190508181036000830152614d50816146fd565b9050919050565b60006020820190508181036000830152614d7081614720565b9050919050565b60006020820190508181036000830152614d9081614743565b9050919050565b60006020820190508181036000830152614db081614766565b9050919050565b60006020820190508181036000830152614dd081614789565b9050919050565b60006020820190508181036000830152614df0816147ac565b9050919050565b60006020820190508181036000830152614e10816147cf565b9050919050565b60006020820190508181036000830152614e30816147f2565b9050919050565b60006020820190508181036000830152614e5081614815565b9050919050565b60006020820190508181036000830152614e7081614838565b9050919050565b60006020820190508181036000830152614e908161485b565b9050919050565b60006020820190508181036000830152614eb0816148a1565b9050919050565b60006020820190508181036000830152614ed0816148c4565b9050919050565b60006020820190508181036000830152614ef0816148e7565b9050919050565b60006020820190508181036000830152614f108161490a565b9050919050565b6000602082019050614f2c600083018461493c565b92915050565b6000614f3c614f4d565b9050614f488282615269565b919050565b6000604051905090565b600067ffffffffffffffff821115614f7257614f7161546e565b5b614f7b826154b1565b9050602081019050919050565b600067ffffffffffffffff821115614fa357614fa261546e565b5b614fac826154b1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615060826151de565b915061506b836151de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150a05761509f615354565b5b828201905092915050565b60006150b6826151de565b91506150c1836151de565b9250826150d1576150d0615383565b5b828204905092915050565b60006150e7826151de565b91506150f2836151de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561512b5761512a615354565b5b828202905092915050565b6000615141826151de565b915061514c836151de565b92508282101561515f5761515e615354565b5b828203905092915050565b6000615175826151be565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615222578082015181840152602081019050615207565b83811115615231576000848401525b50505050565b6000600282049050600182168061524f57607f821691505b60208210811415615263576152626153e1565b5b50919050565b615272826154b1565b810181811067ffffffffffffffff821117156152915761529061546e565b5b80604052505050565b60006152a5826151de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152d8576152d7615354565b5b600182019050919050565b60006152ee826152ff565b9050919050565b6000819050919050565b600061530a826154cf565b9050919050565b600061531c826154c2565b9050919050565b600061532e826151de565b9150615339836151de565b92508261534957615348615383565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f696e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b615c3c8161516a565b8114615c4757600080fd5b50565b615c538161517c565b8114615c5e57600080fd5b50565b615c6a81615192565b8114615c7557600080fd5b50565b615c81816151de565b8114615c8c57600080fd5b50565b615c98816151e8565b8114615ca357600080fd5b5056fea2646970667358221220bb2988675983ea3ba3fab7b66bd6816031414b7824db4cf6a3f789c558a17c6e64736f6c63430008070033697066733a2f2f516d576167455762325741364856754a7259677536344a63356d466257637a764269445268754a45323739466b622f697066733a2f2f516d4e696538644e4c6e7a476843394b3661475752336a35666e484c4a4744346d543231426877447832766b3458697066733a2f2f516d63736b3545783336326f6b37777046784e67736479574e5a5a4e31665069696f686674446e39466368755552
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636352211e1161015a578063a475b5dd116100c1578063da3ef23f1161007a578063da3ef23f146109f4578063db7fd40814610a1d578063e8a3d48514610a39578063e985e9c514610a64578063f2c4ce1e14610aa1578063f2fde38b14610aca57610288565b8063a475b5dd146108f8578063b88d4fde1461090f578063ba7d2c7614610938578063c87b56dd14610963578063d0eb26b0146109a0578063d5abeb01146109c957610288565b8063890557541161011357806389055754146107e85780638da5cb5b14610825578063938e3d7b1461085057806395d89b41146108795780639c70b512146108a4578063a22cb465146108cf57610288565b80636352211e146106da5780636c0360eb146107175780636f8b44b01461074257806370a082311461076b578063715018a6146107a85780637f00c7a6146107bf57610288565b806323b872dd116101fe578063438b6300116101b7578063438b6300146105b857806344a0d68a146105f55780634f6ccce71461061e578063518302271461065b57806355f804b3146106865780635c975abb146106af57610288565b806323b872dd146104ab5780632a55205a146104d45780632f745c59146105125780633c9527641461054f5780633ccfd60b1461057857806342842e0e1461058f57610288565b806312065fe01161025057806312065fe01461038457806313faede6146103af57806318160ddd146103da57806318cae269146104055780631c83c63214610442578063239c70ae1461048057610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906140ec565b610af3565b6040516102c19190614af5565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906140bf565b610b05565b005b3480156102ff57600080fd5b50610308610b9e565b6040516103159190614b55565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190614234565b610c30565b6040516103529190614a1a565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061407f565b610cb5565b005b34801561039057600080fd5b50610399610dcd565b6040516103a69190614f17565b60405180910390f35b3480156103bb57600080fd5b506103c4610e51565b6040516103d19190614f17565b60405180910390f35b3480156103e657600080fd5b506103ef610e57565b6040516103fc9190614f17565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613efc565b610e64565b6040516104399190614f17565b60405180910390f35b34801561044e57600080fd5b506104696004803603810190610464919061418f565b610e7c565b604051610477929190614a81565b60405180910390f35b34801561048c57600080fd5b50610495610f20565b6040516104a29190614f17565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613f69565b610f26565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906142bd565b610f86565b604051610509929190614aaa565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061407f565b611171565b6040516105469190614f17565b60405180910390f35b34801561055b57600080fd5b50610576600480360381019061057191906140bf565b611216565b005b34801561058457600080fd5b5061058d6112da565b005b34801561059b57600080fd5b506105b660048036038101906105b19190613f69565b6113d6565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613efc565b6113f6565b6040516105ec9190614ad3565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190614234565b6114a4565b005b34801561062a57600080fd5b5061064560048036038101906106409190614234565b61152a565b6040516106529190614f17565b60405180910390f35b34801561066757600080fd5b5061067061159b565b60405161067d9190614af5565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a891906141eb565b6115ae565b005b3480156106bb57600080fd5b506106c4611644565b6040516106d19190614af5565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190614234565b611657565b60405161070e9190614a1a565b60405180910390f35b34801561072357600080fd5b5061072c611709565b6040516107399190614b55565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190614234565b611797565b005b34801561077757600080fd5b50610792600480360381019061078d9190613efc565b61181d565b60405161079f9190614f17565b60405180910390f35b3480156107b457600080fd5b506107bd6118d5565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190614234565b61195d565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190614146565b6119e3565b60405161081c9190614af5565b60405180910390f35b34801561083157600080fd5b5061083a611a0b565b6040516108479190614a1a565b60405180910390f35b34801561085c57600080fd5b50610877600480360381019061087291906141eb565b611a35565b005b34801561088557600080fd5b5061088e611acb565b60405161089b9190614b55565b60405180910390f35b3480156108b057600080fd5b506108b9611b5d565b6040516108c69190614af5565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f1919061403f565b611b70565b005b34801561090457600080fd5b5061090d611b86565b005b34801561091b57600080fd5b5061093660048036038101906109319190613fbc565b611c1f565b005b34801561094457600080fd5b5061094d611c81565b60405161095a9190614f17565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190614234565b611c87565b6040516109979190614b55565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190614234565b611de0565b005b3480156109d557600080fd5b506109de611e66565b6040516109eb9190614f17565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a1691906141eb565b611e6c565b005b610a376004803603810190610a329190614261565b611f02565b005b348015610a4557600080fd5b50610a4e612273565b604051610a5b9190614b55565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190613f29565b612305565b604051610a989190614af5565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac391906141eb565b612399565b005b348015610ad657600080fd5b50610af16004803603810190610aec9190613efc565b61242f565b005b6000610afe82612527565b9050919050565b610b0d612539565b73ffffffffffffffffffffffffffffffffffffffff16610b2b611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614e17565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060028054610bad90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd990615237565b8015610c265780601f10610bfb57610100808354040283529160200191610c26565b820191906000526020600020905b815481529060010190602001808311610c0957829003601f168201915b5050505050905090565b6000610c3b82612541565b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190614df7565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc082611657565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614e77565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d50612539565b73ffffffffffffffffffffffffffffffffffffffff161480610d7f5750610d7e81610d79612539565b612305565b5b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590614d17565b60405180910390fd5b610dc883836125ad565b505050565b6000610dd7612539565b73ffffffffffffffffffffffffffffffffffffffff16610df5611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290614e17565b60405180910390fd5b47905090565b60115481565b6000600a80549050905090565b60166020528060005260406000206000915090505481565b6000806000303385604051602001610e9693929190614971565b6040516020818303038152906040528051906020012090506000610ecb86610ebd84612666565b61269690919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610f0f57806001935093505050610f19565b8060009350935050505b9250929050565b60135481565b610f37610f31612539565b826126bd565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614e97565b60405180910390fd5b610f8183838361279b565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561111c5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611126612a02565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661115291906150dc565b61115c91906150ab565b90508160000151819350935050509250929050565b600061117c8361181d565b82106111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614bd7565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61121e612539565b73ffffffffffffffffffffffffffffffffffffffff1661123c611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990614e17565b60405180910390fd5b80601560026101000a81548160ff021916908315150217905550601560029054906101000a900460ff16156112ce5760016013819055506112d7565b600a6013819055505b50565b6112e2612539565b73ffffffffffffffffffffffffffffffffffffffff16611300611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614e17565b60405180910390fd5b6000611360611a0b565b73ffffffffffffffffffffffffffffffffffffffff164760405161138390614a05565b60006040518083038185875af1925050503d80600081146113c0576040519150601f19603f3d011682016040523d82523d6000602084013e6113c5565b606091505b50509050806113d357600080fd5b50565b6113f183838360405180602001604052806000815250611c1f565b505050565b606060006114038361181d565b905060008167ffffffffffffffff8111156114215761142061546e565b5b60405190808252806020026020018201604052801561144f5781602001602082028036833780820191505090505b50905060005b82811015611499576114678582611171565b82828151811061147a5761147961543f565b5b60200260200101818152505080806114919061529a565b915050611455565b508092505050919050565b6114ac612539565b73ffffffffffffffffffffffffffffffffffffffff166114ca611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790614e17565b60405180910390fd5b8060118190555050565b6000611534610e57565b8210611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614eb7565b60405180910390fd5b600a82815481106115895761158861543f565b5b90600052602060002001549050919050565b601560019054906101000a900460ff1681565b6115b6612539565b73ffffffffffffffffffffffffffffffffffffffff166115d4611a0b565b73ffffffffffffffffffffffffffffffffffffffff161461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614e17565b60405180910390fd5b80600d9080519060200190611640929190613cfb565b5050565b601560009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614d57565b60405180910390fd5b80915050919050565b600d805461171690615237565b80601f016020809104026020016040519081016040528092919081815260200182805461174290615237565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b505050505081565b61179f612539565b73ffffffffffffffffffffffffffffffffffffffff166117bd611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614e17565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614d37565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118dd612539565b73ffffffffffffffffffffffffffffffffffffffff166118fb611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194890614e17565b60405180910390fd5b61195b6000612a0c565b565b611965612539565b73ffffffffffffffffffffffffffffffffffffffff16611983611a0b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d090614e17565b60405180910390fd5b8060138190555050565b6000806119ff83601760019054906101000a900460ff16610e7c565b91505080915050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a3d612539565b73ffffffffffffffffffffffffffffffffffffffff16611a5b611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890614e17565b60405180910390fd5b8060109080519060200190611ac7929190613cfb565b5050565b606060038054611ada90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0690615237565b8015611b535780601f10611b2857610100808354040283529160200191611b53565b820191906000526020600020905b815481529060010190602001808311611b3657829003601f168201915b5050505050905090565b601560029054906101000a900460ff1681565b611b82611b7b612539565b8383612ad2565b5050565b611b8e612539565b73ffffffffffffffffffffffffffffffffffffffff16611bac611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf990614e17565b60405180910390fd5b6001601560016101000a81548160ff021916908315150217905550565b611c30611c2a612539565b836126bd565b611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690614e97565b60405180910390fd5b611c7b84848484612c3f565b50505050565b60145481565b6060611c9282612541565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614e57565b60405180910390fd5b60001515601560019054906101000a900460ff1615151415611d7f57600f8054611cfa90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2690615237565b8015611d735780601f10611d4857610100808354040283529160200191611d73565b820191906000526020600020905b815481529060010190602001808311611d5657829003601f168201915b50505050509050611ddb565b6000611d89612c9b565b90506000815111611da95760405180602001604052806000815250611dd7565b80611db384612d2d565b600e604051602001611dc7939291906149ae565b6040516020818303038152906040525b9150505b919050565b611de8612539565b73ffffffffffffffffffffffffffffffffffffffff16611e06611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614e17565b60405180910390fd5b8060148190555050565b60125481565b611e74612539565b73ffffffffffffffffffffffffffffffffffffffff16611e92611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf90614e17565b60405180910390fd5b80600e9080519060200190611efe929190613cfb565b5050565b601560009054906101000a900460ff1615611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990614e37565b60405180910390fd5b6000611f5c610e57565b905060008311611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890614ef7565b60405180910390fd5b6012548382611fb09190615055565b1115611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe890614d77565b60405180910390fd5b6000601354905060006014549050612007611a0b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121e05760011515601560029054906101000a900460ff161515141561214c5761205e84612e8e565b6120af5761206b846119e3565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614ed7565b60405180910390fd5b6120b8565b60029150600290505b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508186826121099190615055565b111561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190614c77565b60405180910390fd5b505b8185111561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614d97565b60405180910390fd5b8460115461219d91906150dc565b3410156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614b97565b60405180910390fd5b5b6000600190505b85811161226b57601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061223e9061529a565b91905055506122583382866122539190615055565b612eb6565b80806122639061529a565b9150506121e7565b505050505050565b60606010805461228290615237565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90615237565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a1612539565b73ffffffffffffffffffffffffffffffffffffffff166123bf611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c90614e17565b60405180910390fd5b80600f908051906020019061242b929190613cfb565b5050565b612437612539565b73ffffffffffffffffffffffffffffffffffffffff16612455611a0b565b73ffffffffffffffffffffffffffffffffffffffff16146124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614e17565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251290614c17565b60405180910390fd5b61252481612a0c565b50565b600061253282612ed4565b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661262083611657565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008160405160200161267991906149df565b604051602081830303815290604052805190602001209050919050565b60008060006126a58585612f4e565b915091506126b281612fd1565b819250505092915050565b60006126c882612541565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614cf7565b60405180910390fd5b600061271283611657565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278157508373ffffffffffffffffffffffffffffffffffffffff1661276984610c30565b73ffffffffffffffffffffffffffffffffffffffff16145b8061279257506127918185612305565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127bb82611657565b73ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614c97565b60405180910390fd5b61288c8383836131a6565b6128976000826125ad565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e79190615136565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293e9190615055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8383836131b6565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3890614cb7565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c329190614af5565b60405180910390a3505050565b612c4a84848461279b565b612c56848484846131bb565b612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c90614bf7565b60405180910390fd5b50505050565b6060600d8054612caa90615237565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd690615237565b8015612d235780601f10612cf857610100808354040283529160200191612d23565b820191906000526020600020905b815481529060010190602001808311612d0657829003601f168201915b5050505050905090565b60606000821415612d75576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e89565b600082905060005b60008214612da7578080612d909061529a565b915050600a82612da091906150ab565b9150612d7d565b60008167ffffffffffffffff811115612dc357612dc261546e565b5b6040519080825280601f01601f191660200182016040528015612df55781602001600182028036833780820191505090505b5090505b60008514612e8257600182612e0e9190615136565b9150600a85612e1d9190615323565b6030612e299190615055565b60f81b818381518110612e3f57612e3e61543f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e7b91906150ab565b9450612df9565b8093505050505b919050565b600080612eaa83601760009054906101000a900460ff16610e7c565b91505080915050919050565b612ed0828260405180602001604052806000815250613352565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f475750612f46826133ad565b5b9050919050565b600080604183511415612f905760008060006020860151925060408601519150606086015160001a9050612f848782858561348f565b94509450505050612fca565b604083511415612fc1576000806020850151915060408501519050612fb686838361359c565b935093505050612fca565b60006002915091505b9250929050565b60006004811115612fe557612fe46153b2565b5b816004811115612ff857612ff76153b2565b5b1415613003576131a3565b60016004811115613017576130166153b2565b5b81600481111561302a576130296153b2565b5b141561306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290614b77565b60405180910390fd5b6002600481111561307f5761307e6153b2565b5b816004811115613092576130916153b2565b5b14156130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ca90614bb7565b60405180910390fd5b600360048111156130e7576130e66153b2565b5b8160048111156130fa576130f96153b2565b5b141561313b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313290614cd7565b60405180910390fd5b60048081111561314e5761314d6153b2565b5b816004811115613161576131606153b2565b5b14156131a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319990614db7565b60405180910390fd5b5b50565b6131b18383836135fb565b505050565b505050565b60006131dc8473ffffffffffffffffffffffffffffffffffffffff1661370f565b15613345578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613205612539565b8786866040518563ffffffff1660e01b81526004016132279493929190614a35565b602060405180830381600087803b15801561324157600080fd5b505af192505050801561327257506040513d601f19601f8201168201806040525081019061326f9190614119565b60015b6132f5573d80600081146132a2576040519150601f19603f3d011682016040523d82523d6000602084013e6132a7565b606091505b506000815114156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e490614bf7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061334a565b600190505b949350505050565b61335c8383613732565b61336960008484846131bb565b6133a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339f90614bf7565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061347857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061348857506134878261390c565b5b9050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134ca576000600391509150613593565b601b8560ff16141580156134e25750601c8560ff1614155b156134f4576000600491509150613593565b6000600187878787604051600081526020016040526040516135199493929190614b10565b6020604051602081039080840390855afa15801561353b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561358a57600060019250925050613593565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135df9190615055565b90506135ed8782888561348f565b935093505050935093915050565b613606838383613986565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613649576136448161398b565b613688565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136875761368683826139d4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136cb576136c681613b41565b61370a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613709576137088282613c12565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379990614dd7565b60405180910390fd5b6137ab81612541565b156137eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e290614c57565b60405180910390fd5b6137f7600083836131a6565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138479190615055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613908600083836131b6565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061397f575061397e82613c91565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139e18461181d565b6139eb9190615136565b9050600060096000848152602001908152602001600020549050818114613ad0576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613b559190615136565b90506000600b60008481526020019081526020016000205490506000600a8381548110613b8557613b8461543f565b5b9060005260206000200154905080600a8381548110613ba757613ba661543f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613bf657613bf5615410565b5b6001900381819060005260206000200160009055905550505050565b6000613c1d8361181d565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613d0790615237565b90600052602060002090601f016020900481019282613d295760008555613d70565b82601f10613d4257805160ff1916838001178555613d70565b82800160010185558215613d70579182015b82811115613d6f578251825591602001919060010190613d54565b5b509050613d7d9190613d81565b5090565b5b80821115613d9a576000816000905550600101613d82565b5090565b6000613db1613dac84614f57565b614f32565b905082815260208101848484011115613dcd57613dcc6154a2565b5b613dd88482856151f5565b509392505050565b6000613df3613dee84614f88565b614f32565b905082815260208101848484011115613e0f57613e0e6154a2565b5b613e1a8482856151f5565b509392505050565b600081359050613e3181615c33565b92915050565b600081359050613e4681615c4a565b92915050565b600081359050613e5b81615c61565b92915050565b600081519050613e7081615c61565b92915050565b600082601f830112613e8b57613e8a61549d565b5b8135613e9b848260208601613d9e565b91505092915050565b600082601f830112613eb957613eb861549d565b5b8135613ec9848260208601613de0565b91505092915050565b600081359050613ee181615c78565b92915050565b600081359050613ef681615c8f565b92915050565b600060208284031215613f1257613f116154ac565b5b6000613f2084828501613e22565b91505092915050565b60008060408385031215613f4057613f3f6154ac565b5b6000613f4e85828601613e22565b9250506020613f5f85828601613e22565b9150509250929050565b600080600060608486031215613f8257613f816154ac565b5b6000613f9086828701613e22565b9350506020613fa186828701613e22565b9250506040613fb286828701613ed2565b9150509250925092565b60008060008060808587031215613fd657613fd56154ac565b5b6000613fe487828801613e22565b9450506020613ff587828801613e22565b935050604061400687828801613ed2565b925050606085013567ffffffffffffffff811115614027576140266154a7565b5b61403387828801613e76565b91505092959194509250565b60008060408385031215614056576140556154ac565b5b600061406485828601613e22565b925050602061407585828601613e37565b9150509250929050565b60008060408385031215614096576140956154ac565b5b60006140a485828601613e22565b92505060206140b585828601613ed2565b9150509250929050565b6000602082840312156140d5576140d46154ac565b5b60006140e384828501613e37565b91505092915050565b600060208284031215614102576141016154ac565b5b600061411084828501613e4c565b91505092915050565b60006020828403121561412f5761412e6154ac565b5b600061413d84828501613e61565b91505092915050565b60006020828403121561415c5761415b6154ac565b5b600082013567ffffffffffffffff81111561417a576141796154a7565b5b61418684828501613e76565b91505092915050565b600080604083850312156141a6576141a56154ac565b5b600083013567ffffffffffffffff8111156141c4576141c36154a7565b5b6141d085828601613e76565b92505060206141e185828601613ee7565b9150509250929050565b600060208284031215614201576142006154ac565b5b600082013567ffffffffffffffff81111561421f5761421e6154a7565b5b61422b84828501613ea4565b91505092915050565b60006020828403121561424a576142496154ac565b5b600061425884828501613ed2565b91505092915050565b60008060408385031215614278576142776154ac565b5b600061428685828601613ed2565b925050602083013567ffffffffffffffff8111156142a7576142a66154a7565b5b6142b385828601613e76565b9150509250929050565b600080604083850312156142d4576142d36154ac565b5b60006142e285828601613ed2565b92505060206142f385828601613ed2565b9150509250929050565b6000614309838361492d565b60208301905092915050565b61431e8161516a565b82525050565b6143356143308261516a565b6152e3565b82525050565b600061434682614fde565b614350818561500c565b935061435b83614fb9565b8060005b8381101561438c57815161437388826142fd565b975061437e83614fff565b92505060018101905061435f565b5085935050505092915050565b6143a28161517c565b82525050565b6143b181615188565b82525050565b6143c86143c382615188565b6152f5565b82525050565b60006143d982614fe9565b6143e3818561501d565b93506143f3818560208601615204565b6143fc816154b1565b840191505092915050565b600061441282614ff4565b61441c8185615039565b935061442c818560208601615204565b614435816154b1565b840191505092915050565b600061444b82614ff4565b614455818561504a565b9350614465818560208601615204565b80840191505092915050565b6000815461447e81615237565b614488818661504a565b945060018216600081146144a357600181146144b4576144e7565b60ff198316865281860193506144e7565b6144bd85614fc9565b60005b838110156144df578154818901526001820191506020810190506144c0565b838801955050505b50505092915050565b60006144fd601883615039565b9150614508826154dc565b602082019050919050565b6000614520601383615039565b915061452b82615505565b602082019050919050565b6000614543601f83615039565b915061454e8261552e565b602082019050919050565b6000614566601c8361504a565b915061457182615557565b601c82019050919050565b6000614589602b83615039565b915061459482615580565b604082019050919050565b60006145ac603283615039565b91506145b7826155cf565b604082019050919050565b60006145cf602683615039565b91506145da8261561e565b604082019050919050565b60006145f2602583615039565b91506145fd8261566d565b604082019050919050565b6000614615601c83615039565b9150614620826156bc565b602082019050919050565b6000614638601c83615039565b9150614643826156e5565b602082019050919050565b600061465b602483615039565b91506146668261570e565b604082019050919050565b600061467e601983615039565b91506146898261575d565b602082019050919050565b60006146a1602283615039565b91506146ac82615786565b604082019050919050565b60006146c4602c83615039565b91506146cf826157d5565b604082019050919050565b60006146e7603883615039565b91506146f282615824565b604082019050919050565b600061470a602a83615039565b915061471582615873565b604082019050919050565b600061472d602983615039565b9150614738826158c2565b604082019050919050565b6000614750601683615039565b915061475b82615911565b602082019050919050565b6000614773602483615039565b915061477e8261593a565b604082019050919050565b6000614796602283615039565b91506147a182615989565b604082019050919050565b60006147b9602083615039565b91506147c4826159d8565b602082019050919050565b60006147dc602c83615039565b91506147e782615a01565b604082019050919050565b60006147ff602083615039565b915061480a82615a50565b602082019050919050565b6000614822601683615039565b915061482d82615a79565b602082019050919050565b6000614845602f83615039565b915061485082615aa2565b604082019050919050565b6000614868602183615039565b915061487382615af1565b604082019050919050565b600061488b60008361502e565b915061489682615b40565b600082019050919050565b60006148ae603183615039565b91506148b982615b43565b604082019050919050565b60006148d1602c83615039565b91506148dc82615b92565b604082019050919050565b60006148f4601783615039565b91506148ff82615be1565b602082019050919050565b6000614917601b83615039565b915061492282615c0a565b602082019050919050565b614936816151de565b82525050565b614945816151de565b82525050565b614954816151e8565b82525050565b61496b614966826151e8565b615311565b82525050565b600061497d8286614324565b60148201915061498d8285614324565b60148201915061499d828461495a565b600182019150819050949350505050565b60006149ba8286614440565b91506149c68285614440565b91506149d28284614471565b9150819050949350505050565b60006149ea82614559565b91506149f682846143b7565b60208201915081905092915050565b6000614a108261487e565b9150819050919050565b6000602082019050614a2f6000830184614315565b92915050565b6000608082019050614a4a6000830187614315565b614a576020830186614315565b614a64604083018561493c565b8181036060830152614a7681846143ce565b905095945050505050565b6000604082019050614a966000830185614315565b614aa36020830184614399565b9392505050565b6000604082019050614abf6000830185614315565b614acc602083018461493c565b9392505050565b60006020820190508181036000830152614aed818461433b565b905092915050565b6000602082019050614b0a6000830184614399565b92915050565b6000608082019050614b2560008301876143a8565b614b32602083018661494b565b614b3f60408301856143a8565b614b4c60608301846143a8565b95945050505050565b60006020820190508181036000830152614b6f8184614407565b905092915050565b60006020820190508181036000830152614b90816144f0565b9050919050565b60006020820190508181036000830152614bb081614513565b9050919050565b60006020820190508181036000830152614bd081614536565b9050919050565b60006020820190508181036000830152614bf08161457c565b9050919050565b60006020820190508181036000830152614c108161459f565b9050919050565b60006020820190508181036000830152614c30816145c2565b9050919050565b60006020820190508181036000830152614c50816145e5565b9050919050565b60006020820190508181036000830152614c7081614608565b9050919050565b60006020820190508181036000830152614c908161462b565b9050919050565b60006020820190508181036000830152614cb08161464e565b9050919050565b60006020820190508181036000830152614cd081614671565b9050919050565b60006020820190508181036000830152614cf081614694565b9050919050565b60006020820190508181036000830152614d10816146b7565b9050919050565b60006020820190508181036000830152614d30816146da565b9050919050565b60006020820190508181036000830152614d50816146fd565b9050919050565b60006020820190508181036000830152614d7081614720565b9050919050565b60006020820190508181036000830152614d9081614743565b9050919050565b60006020820190508181036000830152614db081614766565b9050919050565b60006020820190508181036000830152614dd081614789565b9050919050565b60006020820190508181036000830152614df0816147ac565b9050919050565b60006020820190508181036000830152614e10816147cf565b9050919050565b60006020820190508181036000830152614e30816147f2565b9050919050565b60006020820190508181036000830152614e5081614815565b9050919050565b60006020820190508181036000830152614e7081614838565b9050919050565b60006020820190508181036000830152614e908161485b565b9050919050565b60006020820190508181036000830152614eb0816148a1565b9050919050565b60006020820190508181036000830152614ed0816148c4565b9050919050565b60006020820190508181036000830152614ef0816148e7565b9050919050565b60006020820190508181036000830152614f108161490a565b9050919050565b6000602082019050614f2c600083018461493c565b92915050565b6000614f3c614f4d565b9050614f488282615269565b919050565b6000604051905090565b600067ffffffffffffffff821115614f7257614f7161546e565b5b614f7b826154b1565b9050602081019050919050565b600067ffffffffffffffff821115614fa357614fa261546e565b5b614fac826154b1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615060826151de565b915061506b836151de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150a05761509f615354565b5b828201905092915050565b60006150b6826151de565b91506150c1836151de565b9250826150d1576150d0615383565b5b828204905092915050565b60006150e7826151de565b91506150f2836151de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561512b5761512a615354565b5b828202905092915050565b6000615141826151de565b915061514c836151de565b92508282101561515f5761515e615354565b5b828203905092915050565b6000615175826151be565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615222578082015181840152602081019050615207565b83811115615231576000848401525b50505050565b6000600282049050600182168061524f57607f821691505b60208210811415615263576152626153e1565b5b50919050565b615272826154b1565b810181811067ffffffffffffffff821117156152915761529061546e565b5b80604052505050565b60006152a5826151de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152d8576152d7615354565b5b600182019050919050565b60006152ee826152ff565b9050919050565b6000819050919050565b600061530a826154cf565b9050919050565b600061531c826154c2565b9050919050565b600061532e826151de565b9150615339836151de565b92508261534957615348615383565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f696e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b615c3c8161516a565b8114615c4757600080fd5b50565b615c538161517c565b8114615c5e57600080fd5b50565b615c6a81615192565b8114615c7557600080fd5b50565b615c81816151de565b8114615c8c57600080fd5b50565b615c98816151e8565b8114615ca357600080fd5b5056fea2646970667358221220bb2988675983ea3ba3fab7b66bd6816031414b7824db4cf6a3f789c558a17c6e64736f6c63430008070033
Deployed Bytecode Sourcemap
68945:7085:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70388:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75482:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48027:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49586:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49109:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75918:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69256:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63355:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69575:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72638:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;69383:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50336:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36327:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63023:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75569:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75761:149;;;;;;;;;;;;;:::i;:::-;;50746:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73505:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74851:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63545:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69499:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75075:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69466:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47721:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69111:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71053:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47451:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21324:103;;;;;;;;;;;;;:::i;:::-;;74945:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73153:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20673:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70148:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48196:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69534:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49879:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74656:69;;;;;;;;;;;;;:::i;:::-;;51002:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69422:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73903:727;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74733:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69310:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75187:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71155:1475;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70043:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50105:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75347:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21582:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70388:236;70551:4;70580:36;70604:11;70580:23;:36::i;:::-;70573:43;;70388:236;;;:::o;75482:79::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75547:6:::1;75538;;:15;;;;;;;;;;;;;;;;;;75482:79:::0;:::o;48027:100::-;48081:13;48114:5;48107:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48027:100;:::o;49586:221::-;49662:7;49690:16;49698:7;49690;:16::i;:::-;49682:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49775:15;:24;49791:7;49775:24;;;;;;;;;;;;;;;;;;;;;49768:31;;49586:221;;;:::o;49109:411::-;49190:13;49206:23;49221:7;49206:14;:23::i;:::-;49190:39;;49254:5;49248:11;;:2;:11;;;;49240:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49348:5;49332:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49357:37;49374:5;49381:12;:10;:12::i;:::-;49357:16;:37::i;:::-;49332:62;49310:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49491:21;49500:2;49504:7;49491:8;:21::i;:::-;49179:341;49109:411;;:::o;75918:109::-;75971:7;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75998:21:::1;75991:28;;75918:109:::0;:::o;69256:29::-;;;;:::o;63355:113::-;63416:7;63443:10;:17;;;;63436:24;;63355:113;:::o;69575:55::-;;;;;;;;;;;;;;;;;:::o;72638:507::-;72749:7;72758:4;72780:19;72851:4;72858:10;72870:6;72826:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72802:86;;;;;;72780:108;;72899:14;72916:80;72975:10;72916:36;:11;:34;:36::i;:::-;:44;;:80;;;;:::i;:::-;72899:97;;73027:6;73013:20;;:10;:20;;;73009:129;;;73058:6;73066:4;73050:21;;;;;;;;73009:129;73112:6;73120:5;73104:22;;;;;;72638:507;;;;;;:::o;69383:32::-;;;;:::o;50336:339::-;50531:41;50550:12;:10;:12::i;:::-;50564:7;50531:18;:41::i;:::-;50523:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50639:28;50649:4;50655:2;50659:7;50639:9;:28::i;:::-;50336:339;;;:::o;36327:494::-;36471:7;36480;36505:26;36534:17;:27;36552:8;36534:27;;;;;;;;;;;36505:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36606:1;36578:30;;:7;:16;;;:30;;;36574:92;;;36635:19;36625:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36574:92;36678:21;36743:17;:15;:17::i;:::-;36702:58;;36716:7;:23;;;36703:36;;:10;:36;;;;:::i;:::-;36702:58;;;;:::i;:::-;36678:82;;36781:7;:16;;;36799:13;36773:40;;;;;;36327:494;;;;;:::o;63023:256::-;63120:7;63156:23;63173:5;63156:16;:23::i;:::-;63148:5;:31;63140:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;63245:12;:19;63258:5;63245:19;;;;;;;;;;;;;;;:26;63265:5;63245:26;;;;;;;;;;;;63238:33;;63023:256;;;;:::o;75569:184::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75656:6:::1;75638:15;;:24;;;;;;;;;;;;;;;;;;75677:15;;;;;;;;;;;75673:72;;;75710:1;75694:13;:17;;;;75673:72;;;75743:2;75727:13;:18;;;;75673:72;75569:184:::0;:::o;75761:149::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75812:7:::1;75833;:5;:7::i;:::-;75825:21;;75854;75825:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75811:69;;;75899:2;75891:11;;;::::0;::::1;;75800:110;75761:149::o:0;50746:185::-;50884:39;50901:4;50907:2;50911:7;50884:39;;;;;;;;;;;;:16;:39::i;:::-;50746:185;;;:::o;73505:390::-;73592:16;73626:23;73652:17;73662:6;73652:9;:17::i;:::-;73626:43;;73680:25;73722:15;73708:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73680:58;;73754:9;73749:113;73769:15;73765:1;:19;73749:113;;;73820:30;73840:6;73848:1;73820:19;:30::i;:::-;73806:8;73815:1;73806:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;73786:3;;;;;:::i;:::-;;;;73749:113;;;;73879:8;73872:15;;;;73505:390;;;:::o;74851:86::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74921:8:::1;74914:4;:15;;;;74851:86:::0;:::o;63545:233::-;63620:7;63656:30;:28;:30::i;:::-;63648:5;:38;63640:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;63753:10;63764:5;63753:17;;;;;;;;:::i;:::-;;;;;;;;;;63746:24;;63545:233;;;:::o;69499:28::-;;;;;;;;;;;;;:::o;75075:104::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75160:11:::1;75150:7;:21;;;;;;;;;;;;:::i;:::-;;75075:104:::0;:::o;69466:26::-;;;;;;;;;;;;;:::o;47721:239::-;47793:7;47813:13;47829:7;:16;47837:7;47829:16;;;;;;;;;;;;;;;;;;;;;47813:32;;47881:1;47864:19;;:5;:19;;;;47856:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47947:5;47940:12;;;47721:239;;;:::o;69111:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71053:94::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71132:7:::1;71120:9;:19;;;;71053:94:::0;:::o;47451:208::-;47523:7;47568:1;47551:19;;:5;:19;;;;47543:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47635:9;:16;47645:5;47635:16;;;;;;;;;;;;;;;;47628:23;;47451:208;;;:::o;21324:103::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21389:30:::1;21416:1;21389:18;:30::i;:::-;21324:103::o:0;74945:122::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75042:17:::1;75026:13;:33;;;;74945:122:::0;:::o;73153:169::-;73222:4;73242:12;73258:31;73273:10;73285:3;;;;;;;;;;;73258:14;:31::i;:::-;73239:50;;;73307:7;73300:14;;;73153:169;;;:::o;20673:87::-;20719:7;20746:6;;;;;;;;;;;20739:13;;20673:87;:::o;70148:99::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70235:4:::1;70220:12;:19;;;;;;;;;;;;:::i;:::-;;70148:99:::0;:::o;48196:104::-;48252:13;48285:7;48278:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48196:104;:::o;69534:34::-;;;;;;;;;;;;;:::o;49879:155::-;49974:52;49993:12;:10;:12::i;:::-;50007:8;50017;49974:18;:52::i;:::-;49879:155;;:::o;74656:69::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74713:4:::1;74702:8;;:15;;;;;;;;;;;;;;;;;;74656:69::o:0;51002:328::-;51177:41;51196:12;:10;:12::i;:::-;51210:7;51177:18;:41::i;:::-;51169:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51283:39;51297:4;51303:2;51307:7;51316:5;51283:13;:39::i;:::-;51002:328;;;;:::o;69422:37::-;;;;:::o;73903:727::-;74021:13;74074:16;74082:7;74074;:16::i;:::-;74052:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;74194:5;74182:17;;:8;;;;;;;;;;;:17;;;74178:72;;;74223:15;74216:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74178:72;74262:28;74293:10;:8;:10::i;:::-;74262:41;;74365:1;74340:14;74334:28;:32;:288;;;;;;;;;;;;;;;;;74458:14;74499:18;:7;:16;:18::i;:::-;74544:14;74415:166;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74334:288;74314:308;;;73903:727;;;;:::o;74733:110::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74829:6:::1;74808:18;:27;;;;74733:110:::0;:::o;69310:31::-;;;;:::o;75187:152::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75314:17:::1;75297:14;:34;;;;;;;;;;;;:::i;:::-;;75187:152:::0;:::o;71155:1475::-;71250:6;;;;;;;;;;;71249:7;71241:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;71294:14;71311:13;:11;:13::i;:::-;71294:30;;71357:1;71343:11;:15;71335:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71433:9;;71418:11;71409:6;:20;;;;:::i;:::-;:33;;71401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71480:15;71498:13;;71480:31;;71522:20;71545:18;;71522:41;;71594:7;:5;:7::i;:::-;71580:21;;:10;:21;;;71576:883;;71641:4;71622:23;;:15;;;;;;;;;;;:23;;;71618:615;;;71671:22;71682:10;71671;:22::i;:::-;71666:305;;71752:25;71766:10;71752:13;:25::i;:::-;71718:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;71666:305;;;71911:1;71901:11;;71950:1;71935:16;;71666:305;71991:24;72018:20;:32;72039:10;72018:32;;;;;;;;;;;;;;;;71991:59;;72133:12;72118:11;72099:16;:30;;;;:::i;:::-;:46;;72069:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;71647:586;71618:615;72290:7;72275:11;:22;;72249:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;72412:11;72405:4;;:18;;;;:::i;:::-;72392:9;:31;;72384:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;71576:883;72476:9;72488:1;72476:13;;72471:152;72496:11;72491:1;:16;72471:152;;72529:20;:32;72550:10;72529:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;72578:33;72588:10;72609:1;72600:6;:10;;;;:::i;:::-;72578:9;:33::i;:::-;72509:3;;;;;:::i;:::-;;;;72471:152;;;;71230:1400;;;71155:1475;;:::o;70043:97::-;70087:13;70120:12;70113:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70043:97;:::o;50105:164::-;50202:4;50226:18;:25;50245:5;50226:25;;;;;;;;;;;;;;;:35;50252:8;50226:35;;;;;;;;;;;;;;;;;;;;;;;;;50219:42;;50105:164;;;;:::o;75347:127::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75451:15:::1;75433;:33;;;;;;;;;;;;:::i;:::-;;75347:127:::0;:::o;21582:201::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21691:1:::1;21671:22;;:8;:22;;;;21663:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21747:28;21766:8;21747:18;:28::i;:::-;21582:201:::0;:::o;61260:170::-;61362:4;61386:36;61410:11;61386:23;:36::i;:::-;61379:43;;61260:170;;;:::o;19397:98::-;19450:7;19477:10;19470:17;;19397:98;:::o;52840:127::-;52905:4;52957:1;52929:30;;:7;:16;52937:7;52929:16;;;;;;;;;;;;;;;;;;;;;:30;;;;52922:37;;52840:127;;;:::o;56986:174::-;57088:2;57061:15;:24;57077:7;57061:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57144:7;57140:2;57106:46;;57115:23;57130:7;57115:14;:23::i;:::-;57106:46;;;;;;;;;;;;56986:174;;:::o;17403:269::-;17472:7;17658:4;17605:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;17595:69;;;;;;17588:76;;17403:269;;;:::o;13601:231::-;13679:7;13700:17;13719:18;13741:27;13752:4;13758:9;13741:10;:27::i;:::-;13699:69;;;;13779:18;13791:5;13779:11;:18::i;:::-;13815:9;13808:16;;;;13601:231;;;;:::o;53134:348::-;53227:4;53252:16;53260:7;53252;:16::i;:::-;53244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53328:13;53344:23;53359:7;53344:14;:23::i;:::-;53328:39;;53397:5;53386:16;;:7;:16;;;:51;;;;53430:7;53406:31;;:20;53418:7;53406:11;:20::i;:::-;:31;;;53386:51;:87;;;;53441:32;53458:5;53465:7;53441:16;:32::i;:::-;53386:87;53378:96;;;53134:348;;;;:::o;56243:625::-;56402:4;56375:31;;:23;56390:7;56375:14;:23::i;:::-;:31;;;56367:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56481:1;56467:16;;:2;:16;;;;56459:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56537:39;56558:4;56564:2;56568:7;56537:20;:39::i;:::-;56641:29;56658:1;56662:7;56641:8;:29::i;:::-;56702:1;56683:9;:15;56693:4;56683:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;56731:1;56714:9;:13;56724:2;56714:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;56762:2;56743:7;:16;56751:7;56743:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56801:7;56797:2;56782:27;;56791:4;56782:27;;;;;;;;;;;;56822:38;56842:4;56848:2;56852:7;56822:19;:38::i;:::-;56243:625;;;:::o;37103:97::-;37161:6;37187:5;37180:12;;37103:97;:::o;21943:191::-;22017:16;22036:6;;;;;;;;;;;22017:25;;22062:8;22053:6;;:17;;;;;;;;;;;;;;;;;;22117:8;22086:40;;22107:8;22086:40;;;;;;;;;;;;22006:128;21943:191;:::o;57302:315::-;57457:8;57448:17;;:5;:17;;;;57440:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57544:8;57506:18;:25;57525:5;57506:25;;;;;;;;;;;;;;;:35;57532:8;57506:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57590:8;57568:41;;57583:5;57568:41;;;57600:8;57568:41;;;;;;:::i;:::-;;;;;;;;57302:315;;;:::o;52212:::-;52369:28;52379:4;52385:2;52389:7;52369:9;:28::i;:::-;52416:48;52439:4;52445:2;52449:7;52458:5;52416:22;:48::i;:::-;52408:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52212:315;;;;:::o;70272:108::-;70332:13;70365:7;70358:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70272:108;:::o;7425:723::-;7481:13;7711:1;7702:5;:10;7698:53;;;7729:10;;;;;;;;;;;;;;;;;;;;;7698:53;7761:12;7776:5;7761:20;;7792:14;7817:78;7832:1;7824:4;:9;7817:78;;7850:8;;;;;:::i;:::-;;;;7881:2;7873:10;;;;;:::i;:::-;;;7817:78;;;7905:19;7937:6;7927:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7905:39;;7955:154;7971:1;7962:5;:10;7955:154;;7999:1;7989:11;;;;;:::i;:::-;;;8066:2;8058:5;:10;;;;:::i;:::-;8045:2;:24;;;;:::i;:::-;8032:39;;8015:6;8022;8015:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8095:2;8086:11;;;;;:::i;:::-;;;7955:154;;;8133:6;8119:21;;;;;7425:723;;;;:::o;73330:167::-;73397:4;73417:12;73433:31;73448:10;73460:3;;;;;;;;;;;73433:14;:31::i;:::-;73414:50;;;73482:7;73475:14;;;73330:167;;;:::o;53824:110::-;53900:26;53910:2;53914:7;53900:26;;;;;;;;;;;;:9;:26::i;:::-;53824:110;;:::o;62715:224::-;62817:4;62856:35;62841:50;;;:11;:50;;;;:90;;;;62895:36;62919:11;62895:23;:36::i;:::-;62841:90;62834:97;;62715:224;;;:::o;11491:1308::-;11572:7;11581:12;11826:2;11806:9;:16;:22;11802:990;;;11845:9;11869;11893:7;12102:4;12091:9;12087:20;12081:27;12076:32;;12152:4;12141:9;12137:20;12131:27;12126:32;;12210:4;12199:9;12195:20;12189:27;12186:1;12181:36;12176:41;;12253:25;12264:4;12270:1;12273;12276;12253:10;:25::i;:::-;12246:32;;;;;;;;;11802:990;12320:2;12300:9;:16;:22;12296:496;;;12339:9;12363:10;12575:4;12564:9;12560:20;12554:27;12549:32;;12626:4;12615:9;12611:20;12605:27;12599:33;;12668:23;12679:4;12685:1;12688:2;12668:10;:23::i;:::-;12661:30;;;;;;;;12296:496;12740:1;12744:35;12724:56;;;;11491:1308;;;;;;:::o;9762:643::-;9840:20;9831:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9827:571;;;9877:7;;9827:571;9938:29;9929:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;9925:473;;;9984:34;;;;;;;;;;:::i;:::-;;;;;;;;9925:473;10049:35;10040:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;10036:362;;;10101:41;;;;;;;;;;:::i;:::-;;;;;;;;10036:362;10173:30;10164:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10160:238;;;10220:44;;;;;;;;;;:::i;:::-;;;;;;;;10160:238;10295:30;10286:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10282:116;;;10342:44;;;;;;;;;;:::i;:::-;;;;;;;;10282:116;9762:643;;:::o;70632:215::-;70794:45;70821:4;70827:2;70831:7;70794:26;:45::i;:::-;70632:215;;;:::o;60064:125::-;;;;:::o;58182:799::-;58337:4;58358:15;:2;:13;;;:15::i;:::-;58354:620;;;58410:2;58394:36;;;58431:12;:10;:12::i;:::-;58445:4;58451:7;58460:5;58394:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58390:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58653:1;58636:6;:13;:18;58632:272;;;58679:60;;;;;;;;;;:::i;:::-;;;;;;;;58632:272;58854:6;58848:13;58839:6;58835:2;58831:15;58824:38;58390:529;58527:41;;;58517:51;;;:6;:51;;;;58510:58;;;;;58354:620;58958:4;58951:11;;58182:799;;;;;;;:::o;54161:321::-;54291:18;54297:2;54301:7;54291:5;:18::i;:::-;54342:54;54373:1;54377:2;54381:7;54390:5;54342:22;:54::i;:::-;54320:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;54161:321;;;:::o;47082:305::-;47184:4;47236:25;47221:40;;;:11;:40;;;;:105;;;;47293:33;47278:48;;;:11;:48;;;;47221:105;:158;;;;47343:36;47367:11;47343:23;:36::i;:::-;47221:158;47201:178;;47082:305;;;:::o;15053:1632::-;15184:7;15193:12;16118:66;16113:1;16105:10;;:79;16101:163;;;16217:1;16221:30;16201:51;;;;;;16101:163;16283:2;16278:1;:7;;;;:18;;;;;16294:2;16289:1;:7;;;;16278:18;16274:102;;;16329:1;16333:30;16313:51;;;;;;16274:102;16473:14;16490:24;16500:4;16506:1;16509;16512;16490:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16473:41;;16547:1;16529:20;;:6;:20;;;16525:103;;;16582:1;16586:29;16566:50;;;;;;;16525:103;16648:6;16656:20;16640:37;;;;;15053:1632;;;;;;;;:::o;14095:344::-;14209:7;14218:12;14243:9;14268:66;14260:75;;14255:2;:80;14243:92;;14346:7;14385:2;14378:3;14371:2;14363:11;;:18;;14362:25;;;;:::i;:::-;14346:42;;14406:25;14417:4;14423:1;14426;14429;14406:10;:25::i;:::-;14399:32;;;;;;14095:344;;;;;;:::o;64391:589::-;64535:45;64562:4;64568:2;64572:7;64535:26;:45::i;:::-;64613:1;64597:18;;:4;:18;;;64593:187;;;64632:40;64664:7;64632:31;:40::i;:::-;64593:187;;;64702:2;64694:10;;:4;:10;;;64690:90;;64721:47;64754:4;64760:7;64721:32;:47::i;:::-;64690:90;64593:187;64808:1;64794:16;;:2;:16;;;64790:183;;;64827:45;64864:7;64827:36;:45::i;:::-;64790:183;;;64900:4;64894:10;;:2;:10;;;64890:83;;64921:40;64949:2;64953:7;64921:27;:40::i;:::-;64890:83;64790:183;64391:589;;;:::o;23374:326::-;23434:4;23691:1;23669:7;:19;;;:23;23662:30;;23374:326;;;:::o;54818:439::-;54912:1;54898:16;;:2;:16;;;;54890:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54971:16;54979:7;54971;:16::i;:::-;54970:17;54962:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55033:45;55062:1;55066:2;55070:7;55033:20;:45::i;:::-;55108:1;55091:9;:13;55101:2;55091:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55139:2;55120:7;:16;55128:7;55120:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55184:7;55180:2;55159:33;;55176:1;55159:33;;;;;;;;;;;;55205:44;55233:1;55237:2;55241:7;55205:19;:44::i;:::-;54818:439;;:::o;36057:215::-;36159:4;36198:26;36183:41;;;:11;:41;;;;:81;;;;36228:36;36252:11;36228:23;:36::i;:::-;36183:81;36176:88;;36057:215;;;:::o;59553:126::-;;;;:::o;65703:164::-;65807:10;:17;;;;65780:15;:24;65796:7;65780:24;;;;;;;;;;;:44;;;;65835:10;65851:7;65835:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65703:164;:::o;66494:988::-;66760:22;66810:1;66785:22;66802:4;66785:16;:22::i;:::-;:26;;;;:::i;:::-;66760:51;;66822:18;66843:17;:26;66861:7;66843:26;;;;;;;;;;;;66822:47;;66990:14;66976:10;:28;66972:328;;67021:19;67043:12;:18;67056:4;67043:18;;;;;;;;;;;;;;;:34;67062:14;67043:34;;;;;;;;;;;;67021:56;;67127:11;67094:12;:18;67107:4;67094:18;;;;;;;;;;;;;;;:30;67113:10;67094:30;;;;;;;;;;;:44;;;;67244:10;67211:17;:30;67229:11;67211:30;;;;;;;;;;;:43;;;;67006:294;66972:328;67396:17;:26;67414:7;67396:26;;;;;;;;;;;67389:33;;;67440:12;:18;67453:4;67440:18;;;;;;;;;;;;;;;:34;67459:14;67440:34;;;;;;;;;;;67433:41;;;66575:907;;66494:988;;:::o;67777:1079::-;68030:22;68075:1;68055:10;:17;;;;:21;;;;:::i;:::-;68030:46;;68087:18;68108:15;:24;68124:7;68108:24;;;;;;;;;;;;68087:45;;68459:19;68481:10;68492:14;68481:26;;;;;;;;:::i;:::-;;;;;;;;;;68459:48;;68545:11;68520:10;68531;68520:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;68656:10;68625:15;:28;68641:11;68625:28;;;;;;;;;;;:41;;;;68797:15;:24;68813:7;68797:24;;;;;;;;;;;68790:31;;;68832:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67848:1008;;;67777:1079;:::o;65281:221::-;65366:14;65383:20;65400:2;65383:16;:20::i;:::-;65366:37;;65441:7;65414:12;:16;65427:2;65414:16;;;;;;;;;;;;;;;:24;65431:6;65414:24;;;;;;;;;;;:34;;;;65488:6;65459:17;:26;65477:7;65459:26;;;;;;;;;;;:35;;;;65355:147;65281:221;;:::o;34507:157::-;34592:4;34631:25;34616:40;;;:11;:40;;;;34609:47;;34507:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:323::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:50;6059:7;6050:6;6039:9;6035:22;6017:50;:::i;:::-;6007:60;;5963:114;5761:323;;;;:::o;6090:327::-;6148:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:119;;;6203:79;;:::i;:::-;6165:119;6323:1;6348:52;6392:7;6383:6;6372:9;6368:22;6348:52;:::i;:::-;6338:62;;6294:116;6090:327;;;;:::o;6423:349::-;6492:6;6541:2;6529:9;6520:7;6516:23;6512:32;6509:119;;;6547:79;;:::i;:::-;6509:119;6667:1;6692:63;6747:7;6738:6;6727:9;6723:22;6692:63;:::i;:::-;6682:73;;6638:127;6423:349;;;;:::o;6778:507::-;6846:6;6895:2;6883:9;6874:7;6870:23;6866:32;6863:119;;;6901:79;;:::i;:::-;6863:119;7049:1;7038:9;7034:17;7021:31;7079:18;7071:6;7068:30;7065:117;;;7101:79;;:::i;:::-;7065:117;7206:62;7260:7;7251:6;7240:9;7236:22;7206:62;:::i;:::-;7196:72;;6992:286;6778:507;;;;:::o;7291:648::-;7366:6;7374;7423:2;7411:9;7402:7;7398:23;7394:32;7391:119;;;7429:79;;:::i;:::-;7391:119;7577:1;7566:9;7562:17;7549:31;7607:18;7599:6;7596:30;7593:117;;;7629:79;;:::i;:::-;7593:117;7734:62;7788:7;7779:6;7768:9;7764:22;7734:62;:::i;:::-;7724:72;;7520:286;7845:2;7871:51;7914:7;7905:6;7894:9;7890:22;7871:51;:::i;:::-;7861:61;;7816:116;7291:648;;;;;:::o;7945:509::-;8014:6;8063:2;8051:9;8042:7;8038:23;8034:32;8031:119;;;8069:79;;:::i;:::-;8031:119;8217:1;8206:9;8202:17;8189:31;8247:18;8239:6;8236:30;8233:117;;;8269:79;;:::i;:::-;8233:117;8374:63;8429:7;8420:6;8409:9;8405:22;8374:63;:::i;:::-;8364:73;;8160:287;7945:509;;;;:::o;8460:329::-;8519:6;8568:2;8556:9;8547:7;8543:23;8539:32;8536:119;;;8574:79;;:::i;:::-;8536:119;8694:1;8719:53;8764:7;8755:6;8744:9;8740:22;8719:53;:::i;:::-;8709:63;;8665:117;8460:329;;;;:::o;8795:652::-;8872:6;8880;8929:2;8917:9;8908:7;8904:23;8900:32;8897:119;;;8935:79;;:::i;:::-;8897:119;9055:1;9080:53;9125:7;9116:6;9105:9;9101:22;9080:53;:::i;:::-;9070:63;;9026:117;9210:2;9199:9;9195:18;9182:32;9241:18;9233:6;9230:30;9227:117;;;9263:79;;:::i;:::-;9227:117;9368:62;9422:7;9413:6;9402:9;9398:22;9368:62;:::i;:::-;9358:72;;9153:287;8795:652;;;;;:::o;9453:474::-;9521:6;9529;9578:2;9566:9;9557:7;9553:23;9549:32;9546:119;;;9584:79;;:::i;:::-;9546:119;9704:1;9729:53;9774:7;9765:6;9754:9;9750:22;9729:53;:::i;:::-;9719:63;;9675:117;9831:2;9857:53;9902:7;9893:6;9882:9;9878:22;9857:53;:::i;:::-;9847:63;;9802:118;9453:474;;;;;:::o;9933:179::-;10002:10;10023:46;10065:3;10057:6;10023:46;:::i;:::-;10101:4;10096:3;10092:14;10078:28;;9933:179;;;;:::o;10118:118::-;10205:24;10223:5;10205:24;:::i;:::-;10200:3;10193:37;10118:118;;:::o;10242:157::-;10347:45;10367:24;10385:5;10367:24;:::i;:::-;10347:45;:::i;:::-;10342:3;10335:58;10242:157;;:::o;10435:732::-;10554:3;10583:54;10631:5;10583:54;:::i;:::-;10653:86;10732:6;10727:3;10653:86;:::i;:::-;10646:93;;10763:56;10813:5;10763:56;:::i;:::-;10842:7;10873:1;10858:284;10883:6;10880:1;10877:13;10858:284;;;10959:6;10953:13;10986:63;11045:3;11030:13;10986:63;:::i;:::-;10979:70;;11072:60;11125:6;11072:60;:::i;:::-;11062:70;;10918:224;10905:1;10902;10898:9;10893:14;;10858:284;;;10862:14;11158:3;11151:10;;10559:608;;;10435:732;;;;:::o;11173:109::-;11254:21;11269:5;11254:21;:::i;:::-;11249:3;11242:34;11173:109;;:::o;11288:118::-;11375:24;11393:5;11375:24;:::i;:::-;11370:3;11363:37;11288:118;;:::o;11412:157::-;11517:45;11537:24;11555:5;11537:24;:::i;:::-;11517:45;:::i;:::-;11512:3;11505:58;11412:157;;:::o;11575:360::-;11661:3;11689:38;11721:5;11689:38;:::i;:::-;11743:70;11806:6;11801:3;11743:70;:::i;:::-;11736:77;;11822:52;11867:6;11862:3;11855:4;11848:5;11844:16;11822:52;:::i;:::-;11899:29;11921:6;11899:29;:::i;:::-;11894:3;11890:39;11883:46;;11665:270;11575:360;;;;:::o;11941:364::-;12029:3;12057:39;12090:5;12057:39;:::i;:::-;12112:71;12176:6;12171:3;12112:71;:::i;:::-;12105:78;;12192:52;12237:6;12232:3;12225:4;12218:5;12214:16;12192:52;:::i;:::-;12269:29;12291:6;12269:29;:::i;:::-;12264:3;12260:39;12253:46;;12033:272;11941:364;;;;:::o;12311:377::-;12417:3;12445:39;12478:5;12445:39;:::i;:::-;12500:89;12582:6;12577:3;12500:89;:::i;:::-;12493:96;;12598:52;12643:6;12638:3;12631:4;12624:5;12620:16;12598:52;:::i;:::-;12675:6;12670:3;12666:16;12659:23;;12421:267;12311:377;;;;:::o;12718:845::-;12821:3;12858:5;12852:12;12887:36;12913:9;12887:36;:::i;:::-;12939:89;13021:6;13016:3;12939:89;:::i;:::-;12932:96;;13059:1;13048:9;13044:17;13075:1;13070:137;;;;13221:1;13216:341;;;;13037:520;;13070:137;13154:4;13150:9;13139;13135:25;13130:3;13123:38;13190:6;13185:3;13181:16;13174:23;;13070:137;;13216:341;13283:38;13315:5;13283:38;:::i;:::-;13343:1;13357:154;13371:6;13368:1;13365:13;13357:154;;;13445:7;13439:14;13435:1;13430:3;13426:11;13419:35;13495:1;13486:7;13482:15;13471:26;;13393:4;13390:1;13386:12;13381:17;;13357:154;;;13540:6;13535:3;13531:16;13524:23;;13223:334;;13037:520;;12825:738;;12718:845;;;;:::o;13569:366::-;13711:3;13732:67;13796:2;13791:3;13732:67;:::i;:::-;13725:74;;13808:93;13897:3;13808:93;:::i;:::-;13926:2;13921:3;13917:12;13910:19;;13569:366;;;:::o;13941:::-;14083:3;14104:67;14168:2;14163:3;14104:67;:::i;:::-;14097:74;;14180:93;14269:3;14180:93;:::i;:::-;14298:2;14293:3;14289:12;14282:19;;13941:366;;;:::o;14313:::-;14455:3;14476:67;14540:2;14535:3;14476:67;:::i;:::-;14469:74;;14552:93;14641:3;14552:93;:::i;:::-;14670:2;14665:3;14661:12;14654:19;;14313:366;;;:::o;14685:402::-;14845:3;14866:85;14948:2;14943:3;14866:85;:::i;:::-;14859:92;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14685:402;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15093:366;;;:::o;15465:::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15465:366;;;:::o;15837:::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15837:366;;;:::o;16209:::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16209:366;;;:::o;16581:::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16581:366;;;:::o;16953:::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;16953:366;;;:::o;17325:::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17697:366;;;:::o;18069:::-;18211:3;18232:67;18296:2;18291:3;18232:67;:::i;:::-;18225:74;;18308:93;18397:3;18308:93;:::i;:::-;18426:2;18421:3;18417:12;18410:19;;18069:366;;;:::o;18441:::-;18583:3;18604:67;18668:2;18663:3;18604:67;:::i;:::-;18597:74;;18680:93;18769:3;18680:93;:::i;:::-;18798:2;18793:3;18789:12;18782:19;;18441:366;;;:::o;18813:::-;18955:3;18976:67;19040:2;19035:3;18976:67;:::i;:::-;18969:74;;19052:93;19141:3;19052:93;:::i;:::-;19170:2;19165:3;19161:12;19154:19;;18813:366;;;:::o;19185:::-;19327:3;19348:67;19412:2;19407:3;19348:67;:::i;:::-;19341:74;;19424:93;19513:3;19424:93;:::i;:::-;19542:2;19537:3;19533:12;19526:19;;19185:366;;;:::o;19557:::-;19699:3;19720:67;19784:2;19779:3;19720:67;:::i;:::-;19713:74;;19796:93;19885:3;19796:93;:::i;:::-;19914:2;19909:3;19905:12;19898:19;;19557:366;;;:::o;19929:::-;20071:3;20092:67;20156:2;20151:3;20092:67;:::i;:::-;20085:74;;20168:93;20257:3;20168:93;:::i;:::-;20286:2;20281:3;20277:12;20270:19;;19929:366;;;:::o;20301:::-;20443:3;20464:67;20528:2;20523:3;20464:67;:::i;:::-;20457:74;;20540:93;20629:3;20540:93;:::i;:::-;20658:2;20653:3;20649:12;20642:19;;20301:366;;;:::o;20673:::-;20815:3;20836:67;20900:2;20895:3;20836:67;:::i;:::-;20829:74;;20912:93;21001:3;20912:93;:::i;:::-;21030:2;21025:3;21021:12;21014:19;;20673:366;;;:::o;21045:::-;21187:3;21208:67;21272:2;21267:3;21208:67;:::i;:::-;21201:74;;21284:93;21373:3;21284:93;:::i;:::-;21402:2;21397:3;21393:12;21386:19;;21045:366;;;:::o;21417:::-;21559:3;21580:67;21644:2;21639:3;21580:67;:::i;:::-;21573:74;;21656:93;21745:3;21656:93;:::i;:::-;21774:2;21769:3;21765:12;21758:19;;21417:366;;;:::o;21789:::-;21931:3;21952:67;22016:2;22011:3;21952:67;:::i;:::-;21945:74;;22028:93;22117:3;22028:93;:::i;:::-;22146:2;22141:3;22137:12;22130:19;;21789:366;;;:::o;22161:::-;22303:3;22324:67;22388:2;22383:3;22324:67;:::i;:::-;22317:74;;22400:93;22489:3;22400:93;:::i;:::-;22518:2;22513:3;22509:12;22502:19;;22161:366;;;:::o;22533:::-;22675:3;22696:67;22760:2;22755:3;22696:67;:::i;:::-;22689:74;;22772:93;22861:3;22772:93;:::i;:::-;22890:2;22885:3;22881:12;22874:19;;22533:366;;;:::o;22905:::-;23047:3;23068:67;23132:2;23127:3;23068:67;:::i;:::-;23061:74;;23144:93;23233:3;23144:93;:::i;:::-;23262:2;23257:3;23253:12;23246:19;;22905:366;;;:::o;23277:398::-;23436:3;23457:83;23538:1;23533:3;23457:83;:::i;:::-;23450:90;;23549:93;23638:3;23549:93;:::i;:::-;23667:1;23662:3;23658:11;23651:18;;23277:398;;;:::o;23681:366::-;23823:3;23844:67;23908:2;23903:3;23844:67;:::i;:::-;23837:74;;23920:93;24009:3;23920:93;:::i;:::-;24038:2;24033:3;24029:12;24022:19;;23681:366;;;:::o;24053:::-;24195:3;24216:67;24280:2;24275:3;24216:67;:::i;:::-;24209:74;;24292:93;24381:3;24292:93;:::i;:::-;24410:2;24405:3;24401:12;24394:19;;24053:366;;;:::o;24425:::-;24567:3;24588:67;24652:2;24647:3;24588:67;:::i;:::-;24581:74;;24664:93;24753:3;24664:93;:::i;:::-;24782:2;24777:3;24773:12;24766:19;;24425:366;;;:::o;24797:::-;24939:3;24960:67;25024:2;25019:3;24960:67;:::i;:::-;24953:74;;25036:93;25125:3;25036:93;:::i;:::-;25154:2;25149:3;25145:12;25138:19;;24797:366;;;:::o;25169:108::-;25246:24;25264:5;25246:24;:::i;:::-;25241:3;25234:37;25169:108;;:::o;25283:118::-;25370:24;25388:5;25370:24;:::i;:::-;25365:3;25358:37;25283:118;;:::o;25407:112::-;25490:22;25506:5;25490:22;:::i;:::-;25485:3;25478:35;25407:112;;:::o;25525:149::-;25626:41;25644:22;25660:5;25644:22;:::i;:::-;25626:41;:::i;:::-;25621:3;25614:54;25525:149;;:::o;25680:529::-;25844:3;25859:75;25930:3;25921:6;25859:75;:::i;:::-;25959:2;25954:3;25950:12;25943:19;;25972:75;26043:3;26034:6;25972:75;:::i;:::-;26072:2;26067:3;26063:12;26056:19;;26085:71;26152:3;26143:6;26085:71;:::i;:::-;26181:1;26176:3;26172:11;26165:18;;26200:3;26193:10;;25680:529;;;;;;:::o;26215:589::-;26440:3;26462:95;26553:3;26544:6;26462:95;:::i;:::-;26455:102;;26574:95;26665:3;26656:6;26574:95;:::i;:::-;26567:102;;26686:92;26774:3;26765:6;26686:92;:::i;:::-;26679:99;;26795:3;26788:10;;26215:589;;;;;;:::o;26810:522::-;27023:3;27045:148;27189:3;27045:148;:::i;:::-;27038:155;;27203:75;27274:3;27265:6;27203:75;:::i;:::-;27303:2;27298:3;27294:12;27287:19;;27323:3;27316:10;;26810:522;;;;:::o;27338:379::-;27522:3;27544:147;27687:3;27544:147;:::i;:::-;27537:154;;27708:3;27701:10;;27338:379;;;:::o;27723:222::-;27816:4;27854:2;27843:9;27839:18;27831:26;;27867:71;27935:1;27924:9;27920:17;27911:6;27867:71;:::i;:::-;27723:222;;;;:::o;27951:640::-;28146:4;28184:3;28173:9;28169:19;28161:27;;28198:71;28266:1;28255:9;28251:17;28242:6;28198:71;:::i;:::-;28279:72;28347:2;28336:9;28332:18;28323:6;28279:72;:::i;:::-;28361;28429:2;28418:9;28414:18;28405:6;28361:72;:::i;:::-;28480:9;28474:4;28470:20;28465:2;28454:9;28450:18;28443:48;28508:76;28579:4;28570:6;28508:76;:::i;:::-;28500:84;;27951:640;;;;;;;:::o;28597:320::-;28712:4;28750:2;28739:9;28735:18;28727:26;;28763:71;28831:1;28820:9;28816:17;28807:6;28763:71;:::i;:::-;28844:66;28906:2;28895:9;28891:18;28882:6;28844:66;:::i;:::-;28597:320;;;;;:::o;28923:332::-;29044:4;29082:2;29071:9;29067:18;29059:26;;29095:71;29163:1;29152:9;29148:17;29139:6;29095:71;:::i;:::-;29176:72;29244:2;29233:9;29229:18;29220:6;29176:72;:::i;:::-;28923:332;;;;;:::o;29261:373::-;29404:4;29442:2;29431:9;29427:18;29419:26;;29491:9;29485:4;29481:20;29477:1;29466:9;29462:17;29455:47;29519:108;29622:4;29613:6;29519:108;:::i;:::-;29511:116;;29261:373;;;;:::o;29640:210::-;29727:4;29765:2;29754:9;29750:18;29742:26;;29778:65;29840:1;29829:9;29825:17;29816:6;29778:65;:::i;:::-;29640:210;;;;:::o;29856:545::-;30029:4;30067:3;30056:9;30052:19;30044:27;;30081:71;30149:1;30138:9;30134:17;30125:6;30081:71;:::i;:::-;30162:68;30226:2;30215:9;30211:18;30202:6;30162:68;:::i;:::-;30240:72;30308:2;30297:9;30293:18;30284:6;30240:72;:::i;:::-;30322;30390:2;30379:9;30375:18;30366:6;30322:72;:::i;:::-;29856:545;;;;;;;:::o;30407:313::-;30520:4;30558:2;30547:9;30543:18;30535:26;;30607:9;30601:4;30597:20;30593:1;30582:9;30578:17;30571:47;30635:78;30708:4;30699:6;30635:78;:::i;:::-;30627:86;;30407:313;;;;:::o;30726:419::-;30892:4;30930:2;30919:9;30915:18;30907:26;;30979:9;30973:4;30969:20;30965:1;30954:9;30950:17;30943:47;31007:131;31133:4;31007:131;:::i;:::-;30999:139;;30726:419;;;:::o;31151:::-;31317:4;31355:2;31344:9;31340:18;31332:26;;31404:9;31398:4;31394:20;31390:1;31379:9;31375:17;31368:47;31432:131;31558:4;31432:131;:::i;:::-;31424:139;;31151:419;;;:::o;31576:::-;31742:4;31780:2;31769:9;31765:18;31757:26;;31829:9;31823:4;31819:20;31815:1;31804:9;31800:17;31793:47;31857:131;31983:4;31857:131;:::i;:::-;31849:139;;31576:419;;;:::o;32001:::-;32167:4;32205:2;32194:9;32190:18;32182:26;;32254:9;32248:4;32244:20;32240:1;32229:9;32225:17;32218:47;32282:131;32408:4;32282:131;:::i;:::-;32274:139;;32001:419;;;:::o;32426:::-;32592:4;32630:2;32619:9;32615:18;32607:26;;32679:9;32673:4;32669:20;32665:1;32654:9;32650:17;32643:47;32707:131;32833:4;32707:131;:::i;:::-;32699:139;;32426:419;;;:::o;32851:::-;33017:4;33055:2;33044:9;33040:18;33032:26;;33104:9;33098:4;33094:20;33090:1;33079:9;33075:17;33068:47;33132:131;33258:4;33132:131;:::i;:::-;33124:139;;32851:419;;;:::o;33276:::-;33442:4;33480:2;33469:9;33465:18;33457:26;;33529:9;33523:4;33519:20;33515:1;33504:9;33500:17;33493:47;33557:131;33683:4;33557:131;:::i;:::-;33549:139;;33276:419;;;:::o;33701:::-;33867:4;33905:2;33894:9;33890:18;33882:26;;33954:9;33948:4;33944:20;33940:1;33929:9;33925:17;33918:47;33982:131;34108:4;33982:131;:::i;:::-;33974:139;;33701:419;;;:::o;34126:::-;34292:4;34330:2;34319:9;34315:18;34307:26;;34379:9;34373:4;34369:20;34365:1;34354:9;34350:17;34343:47;34407:131;34533:4;34407:131;:::i;:::-;34399:139;;34126:419;;;:::o;34551:::-;34717:4;34755:2;34744:9;34740:18;34732:26;;34804:9;34798:4;34794:20;34790:1;34779:9;34775:17;34768:47;34832:131;34958:4;34832:131;:::i;:::-;34824:139;;34551:419;;;:::o;34976:::-;35142:4;35180:2;35169:9;35165:18;35157:26;;35229:9;35223:4;35219:20;35215:1;35204:9;35200:17;35193:47;35257:131;35383:4;35257:131;:::i;:::-;35249:139;;34976:419;;;:::o;35401:::-;35567:4;35605:2;35594:9;35590:18;35582:26;;35654:9;35648:4;35644:20;35640:1;35629:9;35625:17;35618:47;35682:131;35808:4;35682:131;:::i;:::-;35674:139;;35401:419;;;:::o;35826:::-;35992:4;36030:2;36019:9;36015:18;36007:26;;36079:9;36073:4;36069:20;36065:1;36054:9;36050:17;36043:47;36107:131;36233:4;36107:131;:::i;:::-;36099:139;;35826:419;;;:::o;36251:::-;36417:4;36455:2;36444:9;36440:18;36432:26;;36504:9;36498:4;36494:20;36490:1;36479:9;36475:17;36468:47;36532:131;36658:4;36532:131;:::i;:::-;36524:139;;36251:419;;;:::o;36676:::-;36842:4;36880:2;36869:9;36865:18;36857:26;;36929:9;36923:4;36919:20;36915:1;36904:9;36900:17;36893:47;36957:131;37083:4;36957:131;:::i;:::-;36949:139;;36676:419;;;:::o;37101:::-;37267:4;37305:2;37294:9;37290:18;37282:26;;37354:9;37348:4;37344:20;37340:1;37329:9;37325:17;37318:47;37382:131;37508:4;37382:131;:::i;:::-;37374:139;;37101:419;;;:::o;37526:::-;37692:4;37730:2;37719:9;37715:18;37707:26;;37779:9;37773:4;37769:20;37765:1;37754:9;37750:17;37743:47;37807:131;37933:4;37807:131;:::i;:::-;37799:139;;37526:419;;;:::o;37951:::-;38117:4;38155:2;38144:9;38140:18;38132:26;;38204:9;38198:4;38194:20;38190:1;38179:9;38175:17;38168:47;38232:131;38358:4;38232:131;:::i;:::-;38224:139;;37951:419;;;:::o;38376:::-;38542:4;38580:2;38569:9;38565:18;38557:26;;38629:9;38623:4;38619:20;38615:1;38604:9;38600:17;38593:47;38657:131;38783:4;38657:131;:::i;:::-;38649:139;;38376:419;;;:::o;38801:::-;38967:4;39005:2;38994:9;38990:18;38982:26;;39054:9;39048:4;39044:20;39040:1;39029:9;39025:17;39018:47;39082:131;39208:4;39082:131;:::i;:::-;39074:139;;38801:419;;;:::o;39226:::-;39392:4;39430:2;39419:9;39415:18;39407:26;;39479:9;39473:4;39469:20;39465:1;39454:9;39450:17;39443:47;39507:131;39633:4;39507:131;:::i;:::-;39499:139;;39226:419;;;:::o;39651:::-;39817:4;39855:2;39844:9;39840:18;39832:26;;39904:9;39898:4;39894:20;39890:1;39879:9;39875:17;39868:47;39932:131;40058:4;39932:131;:::i;:::-;39924:139;;39651:419;;;:::o;40076:::-;40242:4;40280:2;40269:9;40265:18;40257:26;;40329:9;40323:4;40319:20;40315:1;40304:9;40300:17;40293:47;40357:131;40483:4;40357:131;:::i;:::-;40349:139;;40076:419;;;:::o;40501:::-;40667:4;40705:2;40694:9;40690:18;40682:26;;40754:9;40748:4;40744:20;40740:1;40729:9;40725:17;40718:47;40782:131;40908:4;40782:131;:::i;:::-;40774:139;;40501:419;;;:::o;40926:::-;41092:4;41130:2;41119:9;41115:18;41107:26;;41179:9;41173:4;41169:20;41165:1;41154:9;41150:17;41143:47;41207:131;41333:4;41207:131;:::i;:::-;41199:139;;40926:419;;;:::o;41351:::-;41517:4;41555:2;41544:9;41540:18;41532:26;;41604:9;41598:4;41594:20;41590:1;41579:9;41575:17;41568:47;41632:131;41758:4;41632:131;:::i;:::-;41624:139;;41351:419;;;:::o;41776:::-;41942:4;41980:2;41969:9;41965:18;41957:26;;42029:9;42023:4;42019:20;42015:1;42004:9;42000:17;41993:47;42057:131;42183:4;42057:131;:::i;:::-;42049:139;;41776:419;;;:::o;42201:::-;42367:4;42405:2;42394:9;42390:18;42382:26;;42454:9;42448:4;42444:20;42440:1;42429:9;42425:17;42418:47;42482:131;42608:4;42482:131;:::i;:::-;42474:139;;42201:419;;;:::o;42626:::-;42792:4;42830:2;42819:9;42815:18;42807:26;;42879:9;42873:4;42869:20;42865:1;42854:9;42850:17;42843:47;42907:131;43033:4;42907:131;:::i;:::-;42899:139;;42626:419;;;:::o;43051:222::-;43144:4;43182:2;43171:9;43167:18;43159:26;;43195:71;43263:1;43252:9;43248:17;43239:6;43195:71;:::i;:::-;43051:222;;;;:::o;43279:129::-;43313:6;43340:20;;:::i;:::-;43330:30;;43369:33;43397:4;43389:6;43369:33;:::i;:::-;43279:129;;;:::o;43414:75::-;43447:6;43480:2;43474:9;43464:19;;43414:75;:::o;43495:307::-;43556:4;43646:18;43638:6;43635:30;43632:56;;;43668:18;;:::i;:::-;43632:56;43706:29;43728:6;43706:29;:::i;:::-;43698:37;;43790:4;43784;43780:15;43772:23;;43495:307;;;:::o;43808:308::-;43870:4;43960:18;43952:6;43949:30;43946:56;;;43982:18;;:::i;:::-;43946:56;44020:29;44042:6;44020:29;:::i;:::-;44012:37;;44104:4;44098;44094:15;44086:23;;43808:308;;;:::o;44122:132::-;44189:4;44212:3;44204:11;;44242:4;44237:3;44233:14;44225:22;;44122:132;;;:::o;44260:141::-;44309:4;44332:3;44324:11;;44355:3;44352:1;44345:14;44389:4;44386:1;44376:18;44368:26;;44260:141;;;:::o;44407:114::-;44474:6;44508:5;44502:12;44492:22;;44407:114;;;:::o;44527:98::-;44578:6;44612:5;44606:12;44596:22;;44527:98;;;:::o;44631:99::-;44683:6;44717:5;44711:12;44701:22;;44631:99;;;:::o;44736:113::-;44806:4;44838;44833:3;44829:14;44821:22;;44736:113;;;:::o;44855:184::-;44954:11;44988:6;44983:3;44976:19;45028:4;45023:3;45019:14;45004:29;;44855:184;;;;:::o;45045:168::-;45128:11;45162:6;45157:3;45150:19;45202:4;45197:3;45193:14;45178:29;;45045:168;;;;:::o;45219:147::-;45320:11;45357:3;45342:18;;45219:147;;;;:::o;45372:169::-;45456:11;45490:6;45485:3;45478:19;45530:4;45525:3;45521:14;45506:29;;45372:169;;;;:::o;45547:148::-;45649:11;45686:3;45671:18;;45547:148;;;;:::o;45701:305::-;45741:3;45760:20;45778:1;45760:20;:::i;:::-;45755:25;;45794:20;45812:1;45794:20;:::i;:::-;45789:25;;45948:1;45880:66;45876:74;45873:1;45870:81;45867:107;;;45954:18;;:::i;:::-;45867:107;45998:1;45995;45991:9;45984:16;;45701:305;;;;:::o;46012:185::-;46052:1;46069:20;46087:1;46069:20;:::i;:::-;46064:25;;46103:20;46121:1;46103:20;:::i;:::-;46098:25;;46142:1;46132:35;;46147:18;;:::i;:::-;46132:35;46189:1;46186;46182:9;46177:14;;46012:185;;;;:::o;46203:348::-;46243:7;46266:20;46284:1;46266:20;:::i;:::-;46261:25;;46300:20;46318:1;46300:20;:::i;:::-;46295:25;;46488:1;46420:66;46416:74;46413:1;46410:81;46405:1;46398:9;46391:17;46387:105;46384:131;;;46495:18;;:::i;:::-;46384:131;46543:1;46540;46536:9;46525:20;;46203:348;;;;:::o;46557:191::-;46597:4;46617:20;46635:1;46617:20;:::i;:::-;46612:25;;46651:20;46669:1;46651:20;:::i;:::-;46646:25;;46690:1;46687;46684:8;46681:34;;;46695:18;;:::i;:::-;46681:34;46740:1;46737;46733:9;46725:17;;46557:191;;;;:::o;46754:96::-;46791:7;46820:24;46838:5;46820:24;:::i;:::-;46809:35;;46754:96;;;:::o;46856:90::-;46890:7;46933:5;46926:13;46919:21;46908:32;;46856:90;;;:::o;46952:77::-;46989:7;47018:5;47007:16;;46952:77;;;:::o;47035:149::-;47071:7;47111:66;47104:5;47100:78;47089:89;;47035:149;;;:::o;47190:126::-;47227:7;47267:42;47260:5;47256:54;47245:65;;47190:126;;;:::o;47322:77::-;47359:7;47388:5;47377:16;;47322:77;;;:::o;47405:86::-;47440:7;47480:4;47473:5;47469:16;47458:27;;47405:86;;;:::o;47497:154::-;47581:6;47576:3;47571;47558:30;47643:1;47634:6;47629:3;47625:16;47618:27;47497:154;;;:::o;47657:307::-;47725:1;47735:113;47749:6;47746:1;47743:13;47735:113;;;47834:1;47829:3;47825:11;47819:18;47815:1;47810:3;47806:11;47799:39;47771:2;47768:1;47764:10;47759:15;;47735:113;;;47866:6;47863:1;47860:13;47857:101;;;47946:1;47937:6;47932:3;47928:16;47921:27;47857:101;47706:258;47657:307;;;:::o;47970:320::-;48014:6;48051:1;48045:4;48041:12;48031:22;;48098:1;48092:4;48088:12;48119:18;48109:81;;48175:4;48167:6;48163:17;48153:27;;48109:81;48237:2;48229:6;48226:14;48206:18;48203:38;48200:84;;;48256:18;;:::i;:::-;48200:84;48021:269;47970:320;;;:::o;48296:281::-;48379:27;48401:4;48379:27;:::i;:::-;48371:6;48367:40;48509:6;48497:10;48494:22;48473:18;48461:10;48458:34;48455:62;48452:88;;;48520:18;;:::i;:::-;48452:88;48560:10;48556:2;48549:22;48339:238;48296:281;;:::o;48583:233::-;48622:3;48645:24;48663:5;48645:24;:::i;:::-;48636:33;;48691:66;48684:5;48681:77;48678:103;;;48761:18;;:::i;:::-;48678:103;48808:1;48801:5;48797:13;48790:20;;48583:233;;;:::o;48822:100::-;48861:7;48890:26;48910:5;48890:26;:::i;:::-;48879:37;;48822:100;;;:::o;48928:79::-;48967:7;48996:5;48985:16;;48928:79;;;:::o;49013:94::-;49052:7;49081:20;49095:5;49081:20;:::i;:::-;49070:31;;49013:94;;;:::o;49113:93::-;49150:7;49179:21;49194:5;49179:21;:::i;:::-;49168:32;;49113:93;;;:::o;49212:176::-;49244:1;49261:20;49279:1;49261:20;:::i;:::-;49256:25;;49295:20;49313:1;49295:20;:::i;:::-;49290:25;;49334:1;49324:35;;49339:18;;:::i;:::-;49324:35;49380:1;49377;49373:9;49368:14;;49212:176;;;;:::o;49394:180::-;49442:77;49439:1;49432:88;49539:4;49536:1;49529:15;49563:4;49560:1;49553:15;49580:180;49628:77;49625:1;49618:88;49725:4;49722:1;49715:15;49749:4;49746:1;49739:15;49766:180;49814:77;49811:1;49804:88;49911:4;49908:1;49901:15;49935:4;49932:1;49925:15;49952:180;50000:77;49997:1;49990:88;50097:4;50094:1;50087:15;50121:4;50118:1;50111:15;50138:180;50186:77;50183:1;50176:88;50283:4;50280:1;50273:15;50307:4;50304:1;50297:15;50324:180;50372:77;50369:1;50362:88;50469:4;50466:1;50459:15;50493:4;50490:1;50483:15;50510:180;50558:77;50555:1;50548:88;50655:4;50652:1;50645:15;50679:4;50676:1;50669:15;50696:117;50805:1;50802;50795:12;50819:117;50928:1;50925;50918:12;50942:117;51051:1;51048;51041:12;51065:117;51174:1;51171;51164:12;51188:102;51229:6;51280:2;51276:7;51271:2;51264:5;51260:14;51256:28;51246:38;;51188:102;;;:::o;51296:96::-;51330:8;51379:5;51374:3;51370:15;51349:36;;51296:96;;;:::o;51398:94::-;51431:8;51479:5;51475:2;51471:14;51450:35;;51398:94;;;:::o;51498:174::-;51638:26;51634:1;51626:6;51622:14;51615:50;51498:174;:::o;51678:169::-;51818:21;51814:1;51806:6;51802:14;51795:45;51678:169;:::o;51853:181::-;51993:33;51989:1;51981:6;51977:14;51970:57;51853:181;:::o;52040:214::-;52180:66;52176:1;52168:6;52164:14;52157:90;52040:214;:::o;52260:230::-;52400:34;52396:1;52388:6;52384:14;52377:58;52469:13;52464:2;52456:6;52452:15;52445:38;52260:230;:::o;52496:237::-;52636:34;52632:1;52624:6;52620:14;52613:58;52705:20;52700:2;52692:6;52688:15;52681:45;52496:237;:::o;52739:225::-;52879:34;52875:1;52867:6;52863:14;52856:58;52948:8;52943:2;52935:6;52931:15;52924:33;52739:225;:::o;52970:224::-;53110:34;53106:1;53098:6;53094:14;53087:58;53179:7;53174:2;53166:6;53162:15;53155:32;52970:224;:::o;53200:178::-;53340:30;53336:1;53328:6;53324:14;53317:54;53200:178;:::o;53384:::-;53524:30;53520:1;53512:6;53508:14;53501:54;53384:178;:::o;53568:223::-;53708:34;53704:1;53696:6;53692:14;53685:58;53777:6;53772:2;53764:6;53760:15;53753:31;53568:223;:::o;53797:175::-;53937:27;53933:1;53925:6;53921:14;53914:51;53797:175;:::o;53978:221::-;54118:34;54114:1;54106:6;54102:14;54095:58;54187:4;54182:2;54174:6;54170:15;54163:29;53978:221;:::o;54205:231::-;54345:34;54341:1;54333:6;54329:14;54322:58;54414:14;54409:2;54401:6;54397:15;54390:39;54205:231;:::o;54442:243::-;54582:34;54578:1;54570:6;54566:14;54559:58;54651:26;54646:2;54638:6;54634:15;54627:51;54442:243;:::o;54691:229::-;54831:34;54827:1;54819:6;54815:14;54808:58;54900:12;54895:2;54887:6;54883:15;54876:37;54691:229;:::o;54926:228::-;55066:34;55062:1;55054:6;55050:14;55043:58;55135:11;55130:2;55122:6;55118:15;55111:36;54926:228;:::o;55160:172::-;55300:24;55296:1;55288:6;55284:14;55277:48;55160:172;:::o;55338:223::-;55478:34;55474:1;55466:6;55462:14;55455:58;55547:6;55542:2;55534:6;55530:15;55523:31;55338:223;:::o;55567:221::-;55707:34;55703:1;55695:6;55691:14;55684:58;55776:4;55771:2;55763:6;55759:15;55752:29;55567:221;:::o;55794:182::-;55934:34;55930:1;55922:6;55918:14;55911:58;55794:182;:::o;55982:231::-;56122:34;56118:1;56110:6;56106:14;56099:58;56191:14;56186:2;56178:6;56174:15;56167:39;55982:231;:::o;56219:182::-;56359:34;56355:1;56347:6;56343:14;56336:58;56219:182;:::o;56407:172::-;56547:24;56543:1;56535:6;56531:14;56524:48;56407:172;:::o;56585:234::-;56725:34;56721:1;56713:6;56709:14;56702:58;56794:17;56789:2;56781:6;56777:15;56770:42;56585:234;:::o;56825:220::-;56965:34;56961:1;56953:6;56949:14;56942:58;57034:3;57029:2;57021:6;57017:15;57010:28;56825:220;:::o;57051:114::-;;:::o;57171:236::-;57311:34;57307:1;57299:6;57295:14;57288:58;57380:19;57375:2;57367:6;57363:15;57356:44;57171:236;:::o;57413:231::-;57553:34;57549:1;57541:6;57537:14;57530:58;57622:14;57617:2;57609:6;57605:15;57598:39;57413:231;:::o;57650:173::-;57790:25;57786:1;57778:6;57774:14;57767:49;57650:173;:::o;57829:177::-;57969:29;57965:1;57957:6;57953:14;57946:53;57829:177;:::o;58012:122::-;58085:24;58103:5;58085:24;:::i;:::-;58078:5;58075:35;58065:63;;58124:1;58121;58114:12;58065:63;58012:122;:::o;58140:116::-;58210:21;58225:5;58210:21;:::i;:::-;58203:5;58200:32;58190:60;;58246:1;58243;58236:12;58190:60;58140:116;:::o;58262:120::-;58334:23;58351:5;58334:23;:::i;:::-;58327:5;58324:34;58314:62;;58372:1;58369;58362:12;58314:62;58262:120;:::o;58388:122::-;58461:24;58479:5;58461:24;:::i;:::-;58454:5;58451:35;58441:63;;58500:1;58497;58490:12;58441:63;58388:122;:::o;58516:118::-;58587:22;58603:5;58587:22;:::i;:::-;58580:5;58577:33;58567:61;;58624:1;58621;58614:12;58567:61;58516:118;:::o
Swarm Source
ipfs://bb2988675983ea3ba3fab7b66bd6816031414b7824db4cf6a3f789c558a17c6e
Loading...
Loading
Loading...
Loading
[ 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.