ERC-721
Overview
Max Total Supply
1,300 InakaTabi
Holders
562
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 InakaTabiLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
InakaTabi
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-14 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // 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.8.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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (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 See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; 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: inakatabi.sol pragma solidity ^0.8.9; contract InakaTabi is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("InakaTabi", "InakaTabi") {} string private baseURI = "https://"; string private extentionJson = ".json"; uint256 private maxSupply = 2000; bool private isSale = false; function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory _URI) public onlyOwner { baseURI = _URI; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) { string memory currentBaseURI = _baseURI(); require(_exists(tokenId), "Invalid token ID"); return string(abi.encodePacked(currentBaseURI, tokenId.toString(), extentionJson)); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function whiteSetIsSale(bool _isSale) public onlyOwner { isSale = _isSale; } bool private isComming = false; function whiteOpenSales() public onlyOwner { isSale = true; isComming = true; } function whiteCloseSale() public onlyOwner { isSale = false; } function whiteGetStatus() external view returns(bool[3] memory) { bool _isComming = isComming; bool _isClose = !isSale; bool _mintedOut = totalSupply() == maxSupply; return [ _isComming, _isClose, _mintedOut ]; } function whiteGetAddress() external view returns(bool) { return WhiteList[msg.sender].isWhite; } function whiteIsMinted() external view returns(bool) { return WhiteList[msg.sender].isMinted; } function whiteMint() public { if (isSale) { require(totalSupply() < maxSupply, "Sold out"); require(WhiteList[msg.sender].isWhite == true, "You're not white list"); require(WhiteList[msg.sender].isMinted == false, "you're already mint"); require(isMintClosed == false, "Minted out"); uint256 tokenId = _tokenIdCounter.current(); tokenId+=1; _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); WhiteList[msg.sender].isMinted = true; } else { revert("Not Sale"); } } function whiteTeamMint(uint256 _mintAmount) public onlyOwner returns(bool) { require(isMintClosed == false, "Minted out"); require(totalSupply() + _mintAmount < maxSupply+1, "Sold out"); uint256 tokenId = _tokenIdCounter.current(); for (uint256 i = 1; i <= _mintAmount; i++) { _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId + i); } return true; } bool private isMintClosed = false; function whiteMintClose() public onlyOwner { isMintClosed = true; } struct WhiteMap { uint256 idx; bool isWhite; bool isMinted; } mapping(address => WhiteMap) public WhiteList; address[] public WhiteGroup; function whiteAdd(address _address) public onlyOwner { WhiteMap storage _WhiteListAddress = WhiteList[_address]; if(_WhiteListAddress.idx == 0) { WhiteGroup.push(_address); uint256 currentIdx = WhiteGroup.length -1; _WhiteListAddress.idx = currentIdx + 1; _WhiteListAddress.isWhite = true; } } function whiteAddBulk(address[] memory _address) public onlyOwner { for (uint256 i = 0; i < _address.length; i++) { address _whiteAddressGroup = _address[i]; WhiteMap storage _WhiteListAddress = WhiteList[_whiteAddressGroup]; _WhiteListAddress.isWhite = true; if(_WhiteListAddress.idx == 0) { WhiteGroup.push(_whiteAddressGroup); uint256 currentIdx = WhiteGroup.length -1; _WhiteListAddress.idx = currentIdx + 1; } } } function whiteRm(address _address) public onlyOwner { delete WhiteList[_address]; } function whiteLength() public view returns(uint256) { return WhiteGroup.length; } }
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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"WhiteGroup","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhiteList","outputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"bool","name":"isWhite","type":"bool"},{"internalType":"bool","name":"isMinted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whiteAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"whiteAddBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteCloseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteGetAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteGetStatus","outputs":[{"internalType":"bool[3]","name":"","type":"bool[3]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteIsMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteMintClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteOpenSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whiteRm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSale","type":"bool"}],"name":"whiteSetIsSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whiteTeamMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600881526020017f68747470733a2f2f000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620002b4565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200009f929190620002b4565b506107d0600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff0219169083151502179055503480156200010457600080fd5b506040518060400160405280600981526020017f496e616b615461626900000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f496e616b61546162690000000000000000000000000000000000000000000000815250816000908051906020019062000189929190620002b4565b508060019080519060200190620001a2929190620002b4565b5050506000600b60006101000a81548160ff021916908315150217905550620001e0620001d4620001e660201b60201c565b620001ee60201b60201c565b620003c9565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c29062000393565b90600052602060002090601f016020900481019282620002e6576000855562000332565b82601f106200030157805160ff191683800117855562000332565b8280016001018555821562000332579182015b828111156200033157825182559160200191906001019062000314565b5b50905062000341919062000345565b5090565b5b808211156200036057600081600090555060010162000346565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ac57607f821691505b60208210811415620003c357620003c262000364565b5b50919050565b614c0180620003d96000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80636bc201571161013b578063a22cb465116100b8578063e1a966441161007c578063e1a9664414610666578063e9505b6814610684578063e985e9c5146106a2578063ed64ca45146106d2578063f2fde38b146106dc5761023d565b8063a22cb465146105d6578063b88d4fde146105f2578063c181249f1461060e578063c87b56dd14610618578063d68d79d3146106485761023d565b80638da5cb5b116100ff5780638da5cb5b146105325780638e96844a1461055057806395d89b411461056c578063988e30881461058a5780639f91a646146105ba5761023d565b80636bc20157146104b257806370a08231146104e4578063715018a6146105145780637479b6b61461051e5780638456cb59146105285761023d565b80632f745c59116101c95780634f6ccce71161018d5780634f6ccce7146103e857806355f804b31461041857806359544480146104345780635c975abb146104645780636352211e146104825761023d565b80632f745c591461035a57806334d038d91461038a5780633f4ba83a146103a657806342842e0e146103b057806342966c68146103cc5761023d565b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102fa57806329677019146103165780632c4e82ef146103205780632cc5cee71461033e5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c600480360381019061025791906133b9565b6106f8565b6040516102699190613401565b60405180910390f35b61027a61070a565b60405161028791906134b5565b60405180910390f35b6102aa60048036038101906102a5919061350d565b61079c565b6040516102b7919061357b565b60405180910390f35b6102da60048036038101906102d591906135c2565b6107e2565b005b6102e46108fa565b6040516102f19190613611565b60405180910390f35b610314600480360381019061030f919061362c565b610907565b005b61031e610967565b005b6103286109a7565b6040516103359190613401565b60405180910390f35b6103586004803603810190610353919061367f565b6109fe565b005b610374600480360381019061036f91906135c2565b610b07565b6040516103819190613611565b60405180910390f35b6103a4600480360381019061039f919061367f565b610bac565b005b6103ae610c29565b005b6103ca60048036038101906103c5919061362c565b610c3b565b005b6103e660048036038101906103e1919061350d565b610c5b565b005b61040260048036038101906103fd919061350d565b610cb7565b60405161040f9190613611565b60405180910390f35b610432600480360381019061042d91906137e1565b610d28565b005b61044e6004803603810190610449919061350d565b610d4a565b60405161045b9190613401565b60405180910390f35b61046c610e65565b6040516104799190613401565b60405180910390f35b61049c6004803603810190610497919061350d565b610e7c565b6040516104a9919061357b565b60405180910390f35b6104cc60048036038101906104c7919061367f565b610f03565b6040516104db9392919061382a565b60405180910390f35b6104fe60048036038101906104f9919061367f565b610f47565b60405161050b9190613611565b60405180910390f35b61051c610fff565b005b610526611013565b005b6105306112c4565b005b61053a6112d6565b604051610547919061357b565b60405180910390f35b61056a6004803603810190610565919061388d565b611300565b005b610574611325565b60405161058191906134b5565b60405180910390f35b6105a4600480360381019061059f919061350d565b6113b7565b6040516105b1919061357b565b60405180910390f35b6105d460048036038101906105cf9190613982565b6113f6565b005b6105f060048036038101906105eb91906139cb565b61153f565b005b61060c60048036038101906106079190613aac565b611555565b005b6106166115b7565b005b610632600480360381019061062d919061350d565b6115dc565b60405161063f91906134b5565b60405180910390f35b610650611667565b60405161065d9190613611565b60405180910390f35b61066e611674565b60405161067b9190613bda565b60405180910390f35b61068c6116e4565b6040516106999190613401565b60405180910390f35b6106bc60048036038101906106b79190613bf5565b61173b565b6040516106c99190613401565b60405180910390f35b6106da6117cf565b005b6106f660048036038101906106f1919061367f565b6117f4565b005b600061070382611878565b9050919050565b60606000805461071990613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461074590613c64565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b60006107a7826118f2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ed82610e7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590613d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087d61193d565b73ffffffffffffffffffffffffffffffffffffffff1614806108ac57506108ab816108a661193d565b61173b565b5b6108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290613d9a565b60405180910390fd5b6108f58383611945565b505050565b6000600880549050905090565b61091861091261193d565b826119fe565b610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613e2c565b60405180910390fd5b610962838383611a93565b505050565b61096f611d8d565b6001601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff021916908315150217905550565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905090565b610a06611d8d565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541415610b03576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001601280549050610acd9190613e7b565b9050600181610adc9190613eaf565b826000018190555060018260010160006101000a81548160ff021916908315150217905550505b5050565b6000610b1283610f47565b8210610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613f77565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb4611d8d565b601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff0219169055505050565b610c31611d8d565b610c39611e0b565b565b610c5683838360405180602001604052806000815250611555565b505050565b610c6c610c6661193d565b826119fe565b610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290613e2c565b60405180910390fd5b610cb481611e6e565b50565b6000610cc16108fa565b8210610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990614009565b60405180910390fd5b60088281548110610d1657610d15614029565b5b90600052602060002001549050919050565b610d30611d8d565b80600d9080519060200190610d46929190613248565b5050565b6000610d54611d8d565b60001515601060029054906101000a900460ff16151514610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906140a4565b60405180910390fd5b6001600f54610db99190613eaf565b82610dc26108fa565b610dcc9190613eaf565b10610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0390614110565b60405180910390fd5b6000610e18600c611e7a565b90506000600190505b838111610e5a57610e32600c611e88565b610e47338284610e429190613eaf565b611e9e565b8080610e5290614130565b915050610e21565b506001915050919050565b6000600b60009054906101000a900460ff16905090565b600080610e8883611ebc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906141c5565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf90614257565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611007611d8d565b6110116000611ef9565b565b601060009054906101000a900460ff161561128757600f546110336108fa565b10611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614110565b60405180910390fd5b60011515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16151514611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906142c3565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1615151461119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111969061432f565b60405180910390fd5b60001515601060029054906101000a900460ff161515146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec906140a4565b60405180910390fd5b6000611201600c611e7a565b90506001816112109190613eaf565b905061121c600c611e88565b6112263382611e9e565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff021916908315150217905550506112c2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b99061439b565b60405180910390fd5b565b6112cc611d8d565b6112d4611fbf565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611308611d8d565b80601060006101000a81548160ff02191690831515021790555050565b60606001805461133490613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461136090613c64565b80156113ad5780601f10611382576101008083540402835291602001916113ad565b820191906000526020600020905b81548152906001019060200180831161139057829003601f168201915b5050505050905090565b601281815481106113c757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113fe611d8d565b60005b815181101561153b57600082828151811061141f5761141e614029565b5b602002602001015190506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160010160006101000a81548160ff021916908315150217905550600081600001541415611526576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160128054905061150d9190613e7b565b905060018161151c9190613eaf565b8260000181905550505b5050808061153390614130565b915050611401565b5050565b61155161154a61193d565b8383612022565b5050565b61156661156061193d565b836119fe565b6115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613e2c565b60405180910390fd5b6115b18484848461218f565b50505050565b6115bf611d8d565b6001601060026101000a81548160ff021916908315150217905550565b606060006115e86121eb565b90506115f38361227d565b611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614407565b60405180910390fd5b8061163c846122be565b600e604051602001611650939291906144f7565b604051602081830303815290604052915050919050565b6000601280549050905090565b61167c6132ce565b6000601060019054906101000a900460ff1690506000601060009054906101000a900460ff161590506000600f546116b26108fa565b149050604051806060016040528084151515158152602001831515151581526020018215151515815250935050505090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117d7611d8d565b6000601060006101000a81548160ff021916908315150217905550565b6117fc611d8d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561186c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118639061459a565b60405180910390fd5b61187581611ef9565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118eb57506118ea82612396565b5b9050919050565b6118fb8161227d565b61193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906141c5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b883610e7c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611a0a83610e7c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4c5750611a4b818561173b565b5b80611a8a57508373ffffffffffffffffffffffffffffffffffffffff16611a728461079c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ab382610e7c565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b009061462c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b70906146be565b60405180910390fd5b611b868383836001612478565b8273ffffffffffffffffffffffffffffffffffffffff16611ba682610e7c565b73ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061462c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d888383836001612492565b505050565b611d9561193d565b73ffffffffffffffffffffffffffffffffffffffff16611db36112d6565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e009061472a565b60405180910390fd5b565b611e13612498565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e5761193d565b604051611e64919061357b565b60405180910390a1565b611e77816124e1565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b611eb8828260405180602001604052806000815250612534565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fc761258f565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861200b61193d565b604051612018919061357b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208890614796565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121829190613401565b60405180910390a3505050565b61219a848484611a93565b6121a6848484846125d9565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90614828565b60405180910390fd5b50505050565b6060600d80546121fa90613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461222690613c64565b80156122735780601f1061224857610100808354040283529160200191612273565b820191906000526020600020905b81548152906001019060200180831161225657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff1661229f83611ebc565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016122cd84612770565b01905060008167ffffffffffffffff8111156122ec576122eb6136b6565b5b6040519080825280601f01601f19166020018201604052801561231e5781602001600182028036833780820191505090505b509050600082602001820190505b60011561238b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161237557612374614848565b5b04945060008514156123865761238b565b61232c565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124715750612470826128c3565b5b9050919050565b61248061258f565b61248c8484848461292d565b50505050565b50505050565b6124a0610e65565b6124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d6906148c3565b60405180910390fd5b565b6124ea81612a8d565b6000600a6000838152602001908152602001600020805461250a90613c64565b90501461253157600a6000828152602001908152602001600020600061253091906132f0565b5b50565b61253e8383612bdb565b61254b60008484846125d9565b61258a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258190614828565b60405180910390fd5b505050565b612597610e65565b156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce9061492f565b60405180910390fd5b565b60006125fa8473ffffffffffffffffffffffffffffffffffffffff16612df9565b15612763578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261262361193d565b8786866040518563ffffffff1660e01b815260040161264594939291906149a4565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561269057506040513d601f19601f8201168201806040525081019061268d9190614a05565b60015b612713573d80600081146126c0576040519150601f19603f3d011682016040523d82523d6000602084013e6126c5565b606091505b5060008151141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614828565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612768565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ce577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c4576127c3614848565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280b576d04ee2d6d415b85acef8100000000838161280157612800614848565b5b0492506020810190505b662386f26fc10000831061283a57662386f26fc1000083816128305761282f614848565b5b0492506010810190505b6305f5e1008310612863576305f5e100838161285957612858614848565b5b0492506008810190505b612710831061288857612710838161287e5761287d614848565b5b0492506004810190505b606483106128ab57606483816128a1576128a0614848565b5b0492506002810190505b600a83106128ba576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61293984848484612e1c565b600181111561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490614aa4565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129c5576129c081612f42565b612a04565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612a0357612a028582612f8b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a4757612a42816130f8565b612a86565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612a8557612a8484826131c9565b5b5b5050505050565b6000612a9882610e7c565b9050612aa8816000846001612478565b612ab182610e7c565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd7816000846001612492565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614b10565b60405180910390fd5b612c548161227d565b15612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b90614b7c565b60405180910390fd5b612ca2600083836001612478565b612cab8161227d565b15612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614b7c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612df5600083836001612492565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001811115612f3c57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612eb05780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea89190613e7b565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f3b5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f339190613eaf565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f9884610f47565b612fa29190613e7b565b9050600060076000848152602001908152602001600020549050818114613087576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061310c9190613e7b565b905060006009600084815260200190815260200160002054905060006008838154811061313c5761313b614029565b5b90600052602060002001549050806008838154811061315e5761315d614029565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131ad576131ac614b9c565b5b6001900381819060005260206000200160009055905550505050565b60006131d483610f47565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461325490613c64565b90600052602060002090601f01602090048101928261327657600085556132bd565b82601f1061328f57805160ff19168380011785556132bd565b828001600101855582156132bd579182015b828111156132bc5782518255916020019190600101906132a1565b5b5090506132ca9190613330565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5080546132fc90613c64565b6000825580601f1061330e575061332d565b601f01602090049060005260206000209081019061332c9190613330565b5b50565b5b80821115613349576000816000905550600101613331565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61339681613361565b81146133a157600080fd5b50565b6000813590506133b38161338d565b92915050565b6000602082840312156133cf576133ce613357565b5b60006133dd848285016133a4565b91505092915050565b60008115159050919050565b6133fb816133e6565b82525050565b600060208201905061341660008301846133f2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561345657808201518184015260208101905061343b565b83811115613465576000848401525b50505050565b6000601f19601f8301169050919050565b60006134878261341c565b6134918185613427565b93506134a1818560208601613438565b6134aa8161346b565b840191505092915050565b600060208201905081810360008301526134cf818461347c565b905092915050565b6000819050919050565b6134ea816134d7565b81146134f557600080fd5b50565b600081359050613507816134e1565b92915050565b60006020828403121561352357613522613357565b5b6000613531848285016134f8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135658261353a565b9050919050565b6135758161355a565b82525050565b6000602082019050613590600083018461356c565b92915050565b61359f8161355a565b81146135aa57600080fd5b50565b6000813590506135bc81613596565b92915050565b600080604083850312156135d9576135d8613357565b5b60006135e7858286016135ad565b92505060206135f8858286016134f8565b9150509250929050565b61360b816134d7565b82525050565b60006020820190506136266000830184613602565b92915050565b60008060006060848603121561364557613644613357565b5b6000613653868287016135ad565b9350506020613664868287016135ad565b9250506040613675868287016134f8565b9150509250925092565b60006020828403121561369557613694613357565b5b60006136a3848285016135ad565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ee8261346b565b810181811067ffffffffffffffff8211171561370d5761370c6136b6565b5b80604052505050565b600061372061334d565b905061372c82826136e5565b919050565b600067ffffffffffffffff82111561374c5761374b6136b6565b5b6137558261346b565b9050602081019050919050565b82818337600083830152505050565b600061378461377f84613731565b613716565b9050828152602081018484840111156137a05761379f6136b1565b5b6137ab848285613762565b509392505050565b600082601f8301126137c8576137c76136ac565b5b81356137d8848260208601613771565b91505092915050565b6000602082840312156137f7576137f6613357565b5b600082013567ffffffffffffffff8111156138155761381461335c565b5b613821848285016137b3565b91505092915050565b600060608201905061383f6000830186613602565b61384c60208301856133f2565b61385960408301846133f2565b949350505050565b61386a816133e6565b811461387557600080fd5b50565b60008135905061388781613861565b92915050565b6000602082840312156138a3576138a2613357565b5b60006138b184828501613878565b91505092915050565b600067ffffffffffffffff8211156138d5576138d46136b6565b5b602082029050602081019050919050565b600080fd5b60006138fe6138f9846138ba565b613716565b90508083825260208201905060208402830185811115613921576139206138e6565b5b835b8181101561394a578061393688826135ad565b845260208401935050602081019050613923565b5050509392505050565b600082601f830112613969576139686136ac565b5b81356139798482602086016138eb565b91505092915050565b60006020828403121561399857613997613357565b5b600082013567ffffffffffffffff8111156139b6576139b561335c565b5b6139c284828501613954565b91505092915050565b600080604083850312156139e2576139e1613357565b5b60006139f0858286016135ad565b9250506020613a0185828601613878565b9150509250929050565b600067ffffffffffffffff821115613a2657613a256136b6565b5b613a2f8261346b565b9050602081019050919050565b6000613a4f613a4a84613a0b565b613716565b905082815260208101848484011115613a6b57613a6a6136b1565b5b613a76848285613762565b509392505050565b600082601f830112613a9357613a926136ac565b5b8135613aa3848260208601613a3c565b91505092915050565b60008060008060808587031215613ac657613ac5613357565b5b6000613ad4878288016135ad565b9450506020613ae5878288016135ad565b9350506040613af6878288016134f8565b925050606085013567ffffffffffffffff811115613b1757613b1661335c565b5b613b2387828801613a7e565b91505092959194509250565b600060039050919050565b600081905092915050565b6000819050919050565b613b58816133e6565b82525050565b6000613b6a8383613b4f565b60208301905092915050565b6000602082019050919050565b613b8c81613b2f565b613b968184613b3a565b9250613ba182613b45565b8060005b83811015613bd2578151613bb98782613b5e565b9650613bc483613b76565b925050600181019050613ba5565b505050505050565b6000606082019050613bef6000830184613b83565b92915050565b60008060408385031215613c0c57613c0b613357565b5b6000613c1a858286016135ad565b9250506020613c2b858286016135ad565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7c57607f821691505b60208210811415613c9057613c8f613c35565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cf2602183613427565b9150613cfd82613c96565b604082019050919050565b60006020820190508181036000830152613d2181613ce5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613d84603d83613427565b9150613d8f82613d28565b604082019050919050565b60006020820190508181036000830152613db381613d77565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613e16602d83613427565b9150613e2182613dba565b604082019050919050565b60006020820190508181036000830152613e4581613e09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e86826134d7565b9150613e91836134d7565b925082821015613ea457613ea3613e4c565b5b828203905092915050565b6000613eba826134d7565b9150613ec5836134d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efa57613ef9613e4c565b5b828201905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f61602b83613427565b9150613f6c82613f05565b604082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ff3602c83613427565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d696e746564206f757400000000000000000000000000000000000000000000600082015250565b600061408e600a83613427565b915061409982614058565b602082019050919050565b600060208201905081810360008301526140bd81614081565b9050919050565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006140fa600883613427565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b600061413b826134d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561416e5761416d613e4c565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141af601883613427565b91506141ba82614179565b602082019050919050565b600060208201905081810360008301526141de816141a2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614241602983613427565b915061424c826141e5565b604082019050919050565b6000602082019050818103600083015261427081614234565b9050919050565b7f596f75277265206e6f74207768697465206c6973740000000000000000000000600082015250565b60006142ad601583613427565b91506142b882614277565b602082019050919050565b600060208201905081810360008301526142dc816142a0565b9050919050565b7f796f7527726520616c7265616479206d696e7400000000000000000000000000600082015250565b6000614319601383613427565b9150614324826142e3565b602082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b7f4e6f742053616c65000000000000000000000000000000000000000000000000600082015250565b6000614385600883613427565b91506143908261434f565b602082019050919050565b600060208201905081810360008301526143b481614378565b9050919050565b7f496e76616c696420746f6b656e20494400000000000000000000000000000000600082015250565b60006143f1601083613427565b91506143fc826143bb565b602082019050919050565b60006020820190508181036000830152614420816143e4565b9050919050565b600081905092915050565b600061443d8261341c565b6144478185614427565b9350614457818560208601613438565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461448581613c64565b61448f8186614427565b945060018216600081146144aa57600181146144bb576144ee565b60ff198316865281860193506144ee565b6144c485614463565b60005b838110156144e6578154818901526001820191506020810190506144c7565b838801955050505b50505092915050565b60006145038286614432565b915061450f8285614432565b915061451b8284614478565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614584602683613427565b915061458f82614528565b604082019050919050565b600060208201905081810360008301526145b381614577565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614616602583613427565b9150614621826145ba565b604082019050919050565b6000602082019050818103600083015261464581614609565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146a8602483613427565b91506146b38261464c565b604082019050919050565b600060208201905081810360008301526146d78161469b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614714602083613427565b915061471f826146de565b602082019050919050565b6000602082019050818103600083015261474381614707565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614780601983613427565b915061478b8261474a565b602082019050919050565b600060208201905081810360008301526147af81614773565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614812603283613427565b915061481d826147b6565b604082019050919050565b6000602082019050818103600083015261484181614805565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006148ad601483613427565b91506148b882614877565b602082019050919050565b600060208201905081810360008301526148dc816148a0565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614919601083613427565b9150614924826148e3565b602082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149768261494f565b614980818561495a565b9350614990818560208601613438565b6149998161346b565b840191505092915050565b60006080820190506149b9600083018761356c565b6149c6602083018661356c565b6149d36040830185613602565b81810360608301526149e5818461496b565b905095945050505050565b6000815190506149ff8161338d565b92915050565b600060208284031215614a1b57614a1a613357565b5b6000614a29848285016149f0565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614a8e603583613427565b9150614a9982614a32565b604082019050919050565b60006020820190508181036000830152614abd81614a81565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614afa602083613427565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b66601c83613427565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202768d9b9522ce4c0fa7f5fa0e19afbd44ad0ee2c48e6d2c572cd63c10b5ac33764736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80636bc201571161013b578063a22cb465116100b8578063e1a966441161007c578063e1a9664414610666578063e9505b6814610684578063e985e9c5146106a2578063ed64ca45146106d2578063f2fde38b146106dc5761023d565b8063a22cb465146105d6578063b88d4fde146105f2578063c181249f1461060e578063c87b56dd14610618578063d68d79d3146106485761023d565b80638da5cb5b116100ff5780638da5cb5b146105325780638e96844a1461055057806395d89b411461056c578063988e30881461058a5780639f91a646146105ba5761023d565b80636bc20157146104b257806370a08231146104e4578063715018a6146105145780637479b6b61461051e5780638456cb59146105285761023d565b80632f745c59116101c95780634f6ccce71161018d5780634f6ccce7146103e857806355f804b31461041857806359544480146104345780635c975abb146104645780636352211e146104825761023d565b80632f745c591461035a57806334d038d91461038a5780633f4ba83a146103a657806342842e0e146103b057806342966c68146103cc5761023d565b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102fa57806329677019146103165780632c4e82ef146103205780632cc5cee71461033e5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c600480360381019061025791906133b9565b6106f8565b6040516102699190613401565b60405180910390f35b61027a61070a565b60405161028791906134b5565b60405180910390f35b6102aa60048036038101906102a5919061350d565b61079c565b6040516102b7919061357b565b60405180910390f35b6102da60048036038101906102d591906135c2565b6107e2565b005b6102e46108fa565b6040516102f19190613611565b60405180910390f35b610314600480360381019061030f919061362c565b610907565b005b61031e610967565b005b6103286109a7565b6040516103359190613401565b60405180910390f35b6103586004803603810190610353919061367f565b6109fe565b005b610374600480360381019061036f91906135c2565b610b07565b6040516103819190613611565b60405180910390f35b6103a4600480360381019061039f919061367f565b610bac565b005b6103ae610c29565b005b6103ca60048036038101906103c5919061362c565b610c3b565b005b6103e660048036038101906103e1919061350d565b610c5b565b005b61040260048036038101906103fd919061350d565b610cb7565b60405161040f9190613611565b60405180910390f35b610432600480360381019061042d91906137e1565b610d28565b005b61044e6004803603810190610449919061350d565b610d4a565b60405161045b9190613401565b60405180910390f35b61046c610e65565b6040516104799190613401565b60405180910390f35b61049c6004803603810190610497919061350d565b610e7c565b6040516104a9919061357b565b60405180910390f35b6104cc60048036038101906104c7919061367f565b610f03565b6040516104db9392919061382a565b60405180910390f35b6104fe60048036038101906104f9919061367f565b610f47565b60405161050b9190613611565b60405180910390f35b61051c610fff565b005b610526611013565b005b6105306112c4565b005b61053a6112d6565b604051610547919061357b565b60405180910390f35b61056a6004803603810190610565919061388d565b611300565b005b610574611325565b60405161058191906134b5565b60405180910390f35b6105a4600480360381019061059f919061350d565b6113b7565b6040516105b1919061357b565b60405180910390f35b6105d460048036038101906105cf9190613982565b6113f6565b005b6105f060048036038101906105eb91906139cb565b61153f565b005b61060c60048036038101906106079190613aac565b611555565b005b6106166115b7565b005b610632600480360381019061062d919061350d565b6115dc565b60405161063f91906134b5565b60405180910390f35b610650611667565b60405161065d9190613611565b60405180910390f35b61066e611674565b60405161067b9190613bda565b60405180910390f35b61068c6116e4565b6040516106999190613401565b60405180910390f35b6106bc60048036038101906106b79190613bf5565b61173b565b6040516106c99190613401565b60405180910390f35b6106da6117cf565b005b6106f660048036038101906106f1919061367f565b6117f4565b005b600061070382611878565b9050919050565b60606000805461071990613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461074590613c64565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b60006107a7826118f2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ed82610e7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590613d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087d61193d565b73ffffffffffffffffffffffffffffffffffffffff1614806108ac57506108ab816108a661193d565b61173b565b5b6108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290613d9a565b60405180910390fd5b6108f58383611945565b505050565b6000600880549050905090565b61091861091261193d565b826119fe565b610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613e2c565b60405180910390fd5b610962838383611a93565b505050565b61096f611d8d565b6001601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff021916908315150217905550565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905090565b610a06611d8d565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541415610b03576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001601280549050610acd9190613e7b565b9050600181610adc9190613eaf565b826000018190555060018260010160006101000a81548160ff021916908315150217905550505b5050565b6000610b1283610f47565b8210610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613f77565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb4611d8d565b601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff0219169055505050565b610c31611d8d565b610c39611e0b565b565b610c5683838360405180602001604052806000815250611555565b505050565b610c6c610c6661193d565b826119fe565b610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290613e2c565b60405180910390fd5b610cb481611e6e565b50565b6000610cc16108fa565b8210610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990614009565b60405180910390fd5b60088281548110610d1657610d15614029565b5b90600052602060002001549050919050565b610d30611d8d565b80600d9080519060200190610d46929190613248565b5050565b6000610d54611d8d565b60001515601060029054906101000a900460ff16151514610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906140a4565b60405180910390fd5b6001600f54610db99190613eaf565b82610dc26108fa565b610dcc9190613eaf565b10610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0390614110565b60405180910390fd5b6000610e18600c611e7a565b90506000600190505b838111610e5a57610e32600c611e88565b610e47338284610e429190613eaf565b611e9e565b8080610e5290614130565b915050610e21565b506001915050919050565b6000600b60009054906101000a900460ff16905090565b600080610e8883611ebc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906141c5565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf90614257565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611007611d8d565b6110116000611ef9565b565b601060009054906101000a900460ff161561128757600f546110336108fa565b10611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614110565b60405180910390fd5b60011515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16151514611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906142c3565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1615151461119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111969061432f565b60405180910390fd5b60001515601060029054906101000a900460ff161515146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec906140a4565b60405180910390fd5b6000611201600c611e7a565b90506001816112109190613eaf565b905061121c600c611e88565b6112263382611e9e565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff021916908315150217905550506112c2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b99061439b565b60405180910390fd5b565b6112cc611d8d565b6112d4611fbf565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611308611d8d565b80601060006101000a81548160ff02191690831515021790555050565b60606001805461133490613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461136090613c64565b80156113ad5780601f10611382576101008083540402835291602001916113ad565b820191906000526020600020905b81548152906001019060200180831161139057829003601f168201915b5050505050905090565b601281815481106113c757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113fe611d8d565b60005b815181101561153b57600082828151811061141f5761141e614029565b5b602002602001015190506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160010160006101000a81548160ff021916908315150217905550600081600001541415611526576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160128054905061150d9190613e7b565b905060018161151c9190613eaf565b8260000181905550505b5050808061153390614130565b915050611401565b5050565b61155161154a61193d565b8383612022565b5050565b61156661156061193d565b836119fe565b6115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613e2c565b60405180910390fd5b6115b18484848461218f565b50505050565b6115bf611d8d565b6001601060026101000a81548160ff021916908315150217905550565b606060006115e86121eb565b90506115f38361227d565b611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614407565b60405180910390fd5b8061163c846122be565b600e604051602001611650939291906144f7565b604051602081830303815290604052915050919050565b6000601280549050905090565b61167c6132ce565b6000601060019054906101000a900460ff1690506000601060009054906101000a900460ff161590506000600f546116b26108fa565b149050604051806060016040528084151515158152602001831515151581526020018215151515815250935050505090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117d7611d8d565b6000601060006101000a81548160ff021916908315150217905550565b6117fc611d8d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561186c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118639061459a565b60405180910390fd5b61187581611ef9565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118eb57506118ea82612396565b5b9050919050565b6118fb8161227d565b61193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906141c5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b883610e7c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611a0a83610e7c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4c5750611a4b818561173b565b5b80611a8a57508373ffffffffffffffffffffffffffffffffffffffff16611a728461079c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ab382610e7c565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b009061462c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b70906146be565b60405180910390fd5b611b868383836001612478565b8273ffffffffffffffffffffffffffffffffffffffff16611ba682610e7c565b73ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061462c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d888383836001612492565b505050565b611d9561193d565b73ffffffffffffffffffffffffffffffffffffffff16611db36112d6565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e009061472a565b60405180910390fd5b565b611e13612498565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e5761193d565b604051611e64919061357b565b60405180910390a1565b611e77816124e1565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b611eb8828260405180602001604052806000815250612534565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fc761258f565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861200b61193d565b604051612018919061357b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208890614796565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121829190613401565b60405180910390a3505050565b61219a848484611a93565b6121a6848484846125d9565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90614828565b60405180910390fd5b50505050565b6060600d80546121fa90613c64565b80601f016020809104026020016040519081016040528092919081815260200182805461222690613c64565b80156122735780601f1061224857610100808354040283529160200191612273565b820191906000526020600020905b81548152906001019060200180831161225657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff1661229f83611ebc565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016122cd84612770565b01905060008167ffffffffffffffff8111156122ec576122eb6136b6565b5b6040519080825280601f01601f19166020018201604052801561231e5781602001600182028036833780820191505090505b509050600082602001820190505b60011561238b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161237557612374614848565b5b04945060008514156123865761238b565b61232c565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124715750612470826128c3565b5b9050919050565b61248061258f565b61248c8484848461292d565b50505050565b50505050565b6124a0610e65565b6124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d6906148c3565b60405180910390fd5b565b6124ea81612a8d565b6000600a6000838152602001908152602001600020805461250a90613c64565b90501461253157600a6000828152602001908152602001600020600061253091906132f0565b5b50565b61253e8383612bdb565b61254b60008484846125d9565b61258a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258190614828565b60405180910390fd5b505050565b612597610e65565b156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce9061492f565b60405180910390fd5b565b60006125fa8473ffffffffffffffffffffffffffffffffffffffff16612df9565b15612763578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261262361193d565b8786866040518563ffffffff1660e01b815260040161264594939291906149a4565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561269057506040513d601f19601f8201168201806040525081019061268d9190614a05565b60015b612713573d80600081146126c0576040519150601f19603f3d011682016040523d82523d6000602084013e6126c5565b606091505b5060008151141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614828565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612768565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ce577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c4576127c3614848565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280b576d04ee2d6d415b85acef8100000000838161280157612800614848565b5b0492506020810190505b662386f26fc10000831061283a57662386f26fc1000083816128305761282f614848565b5b0492506010810190505b6305f5e1008310612863576305f5e100838161285957612858614848565b5b0492506008810190505b612710831061288857612710838161287e5761287d614848565b5b0492506004810190505b606483106128ab57606483816128a1576128a0614848565b5b0492506002810190505b600a83106128ba576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61293984848484612e1c565b600181111561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490614aa4565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129c5576129c081612f42565b612a04565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612a0357612a028582612f8b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a4757612a42816130f8565b612a86565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612a8557612a8484826131c9565b5b5b5050505050565b6000612a9882610e7c565b9050612aa8816000846001612478565b612ab182610e7c565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd7816000846001612492565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614b10565b60405180910390fd5b612c548161227d565b15612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b90614b7c565b60405180910390fd5b612ca2600083836001612478565b612cab8161227d565b15612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614b7c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612df5600083836001612492565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001811115612f3c57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612eb05780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea89190613e7b565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f3b5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f339190613eaf565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f9884610f47565b612fa29190613e7b565b9050600060076000848152602001908152602001600020549050818114613087576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061310c9190613e7b565b905060006009600084815260200190815260200160002054905060006008838154811061313c5761313b614029565b5b90600052602060002001549050806008838154811061315e5761315d614029565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131ad576131ac614b9c565b5b6001900381819060005260206000200160009055905550505050565b60006131d483610f47565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461325490613c64565b90600052602060002090601f01602090048101928261327657600085556132bd565b82601f1061328f57805160ff19168380011785556132bd565b828001600101855582156132bd579182015b828111156132bc5782518255916020019190600101906132a1565b5b5090506132ca9190613330565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5080546132fc90613c64565b6000825580601f1061330e575061332d565b601f01602090049060005260206000209081019061332c9190613330565b5b50565b5b80821115613349576000816000905550600101613331565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61339681613361565b81146133a157600080fd5b50565b6000813590506133b38161338d565b92915050565b6000602082840312156133cf576133ce613357565b5b60006133dd848285016133a4565b91505092915050565b60008115159050919050565b6133fb816133e6565b82525050565b600060208201905061341660008301846133f2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561345657808201518184015260208101905061343b565b83811115613465576000848401525b50505050565b6000601f19601f8301169050919050565b60006134878261341c565b6134918185613427565b93506134a1818560208601613438565b6134aa8161346b565b840191505092915050565b600060208201905081810360008301526134cf818461347c565b905092915050565b6000819050919050565b6134ea816134d7565b81146134f557600080fd5b50565b600081359050613507816134e1565b92915050565b60006020828403121561352357613522613357565b5b6000613531848285016134f8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135658261353a565b9050919050565b6135758161355a565b82525050565b6000602082019050613590600083018461356c565b92915050565b61359f8161355a565b81146135aa57600080fd5b50565b6000813590506135bc81613596565b92915050565b600080604083850312156135d9576135d8613357565b5b60006135e7858286016135ad565b92505060206135f8858286016134f8565b9150509250929050565b61360b816134d7565b82525050565b60006020820190506136266000830184613602565b92915050565b60008060006060848603121561364557613644613357565b5b6000613653868287016135ad565b9350506020613664868287016135ad565b9250506040613675868287016134f8565b9150509250925092565b60006020828403121561369557613694613357565b5b60006136a3848285016135ad565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ee8261346b565b810181811067ffffffffffffffff8211171561370d5761370c6136b6565b5b80604052505050565b600061372061334d565b905061372c82826136e5565b919050565b600067ffffffffffffffff82111561374c5761374b6136b6565b5b6137558261346b565b9050602081019050919050565b82818337600083830152505050565b600061378461377f84613731565b613716565b9050828152602081018484840111156137a05761379f6136b1565b5b6137ab848285613762565b509392505050565b600082601f8301126137c8576137c76136ac565b5b81356137d8848260208601613771565b91505092915050565b6000602082840312156137f7576137f6613357565b5b600082013567ffffffffffffffff8111156138155761381461335c565b5b613821848285016137b3565b91505092915050565b600060608201905061383f6000830186613602565b61384c60208301856133f2565b61385960408301846133f2565b949350505050565b61386a816133e6565b811461387557600080fd5b50565b60008135905061388781613861565b92915050565b6000602082840312156138a3576138a2613357565b5b60006138b184828501613878565b91505092915050565b600067ffffffffffffffff8211156138d5576138d46136b6565b5b602082029050602081019050919050565b600080fd5b60006138fe6138f9846138ba565b613716565b90508083825260208201905060208402830185811115613921576139206138e6565b5b835b8181101561394a578061393688826135ad565b845260208401935050602081019050613923565b5050509392505050565b600082601f830112613969576139686136ac565b5b81356139798482602086016138eb565b91505092915050565b60006020828403121561399857613997613357565b5b600082013567ffffffffffffffff8111156139b6576139b561335c565b5b6139c284828501613954565b91505092915050565b600080604083850312156139e2576139e1613357565b5b60006139f0858286016135ad565b9250506020613a0185828601613878565b9150509250929050565b600067ffffffffffffffff821115613a2657613a256136b6565b5b613a2f8261346b565b9050602081019050919050565b6000613a4f613a4a84613a0b565b613716565b905082815260208101848484011115613a6b57613a6a6136b1565b5b613a76848285613762565b509392505050565b600082601f830112613a9357613a926136ac565b5b8135613aa3848260208601613a3c565b91505092915050565b60008060008060808587031215613ac657613ac5613357565b5b6000613ad4878288016135ad565b9450506020613ae5878288016135ad565b9350506040613af6878288016134f8565b925050606085013567ffffffffffffffff811115613b1757613b1661335c565b5b613b2387828801613a7e565b91505092959194509250565b600060039050919050565b600081905092915050565b6000819050919050565b613b58816133e6565b82525050565b6000613b6a8383613b4f565b60208301905092915050565b6000602082019050919050565b613b8c81613b2f565b613b968184613b3a565b9250613ba182613b45565b8060005b83811015613bd2578151613bb98782613b5e565b9650613bc483613b76565b925050600181019050613ba5565b505050505050565b6000606082019050613bef6000830184613b83565b92915050565b60008060408385031215613c0c57613c0b613357565b5b6000613c1a858286016135ad565b9250506020613c2b858286016135ad565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7c57607f821691505b60208210811415613c9057613c8f613c35565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cf2602183613427565b9150613cfd82613c96565b604082019050919050565b60006020820190508181036000830152613d2181613ce5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613d84603d83613427565b9150613d8f82613d28565b604082019050919050565b60006020820190508181036000830152613db381613d77565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613e16602d83613427565b9150613e2182613dba565b604082019050919050565b60006020820190508181036000830152613e4581613e09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e86826134d7565b9150613e91836134d7565b925082821015613ea457613ea3613e4c565b5b828203905092915050565b6000613eba826134d7565b9150613ec5836134d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efa57613ef9613e4c565b5b828201905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f61602b83613427565b9150613f6c82613f05565b604082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ff3602c83613427565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d696e746564206f757400000000000000000000000000000000000000000000600082015250565b600061408e600a83613427565b915061409982614058565b602082019050919050565b600060208201905081810360008301526140bd81614081565b9050919050565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006140fa600883613427565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b600061413b826134d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561416e5761416d613e4c565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141af601883613427565b91506141ba82614179565b602082019050919050565b600060208201905081810360008301526141de816141a2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614241602983613427565b915061424c826141e5565b604082019050919050565b6000602082019050818103600083015261427081614234565b9050919050565b7f596f75277265206e6f74207768697465206c6973740000000000000000000000600082015250565b60006142ad601583613427565b91506142b882614277565b602082019050919050565b600060208201905081810360008301526142dc816142a0565b9050919050565b7f796f7527726520616c7265616479206d696e7400000000000000000000000000600082015250565b6000614319601383613427565b9150614324826142e3565b602082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b7f4e6f742053616c65000000000000000000000000000000000000000000000000600082015250565b6000614385600883613427565b91506143908261434f565b602082019050919050565b600060208201905081810360008301526143b481614378565b9050919050565b7f496e76616c696420746f6b656e20494400000000000000000000000000000000600082015250565b60006143f1601083613427565b91506143fc826143bb565b602082019050919050565b60006020820190508181036000830152614420816143e4565b9050919050565b600081905092915050565b600061443d8261341c565b6144478185614427565b9350614457818560208601613438565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461448581613c64565b61448f8186614427565b945060018216600081146144aa57600181146144bb576144ee565b60ff198316865281860193506144ee565b6144c485614463565b60005b838110156144e6578154818901526001820191506020810190506144c7565b838801955050505b50505092915050565b60006145038286614432565b915061450f8285614432565b915061451b8284614478565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614584602683613427565b915061458f82614528565b604082019050919050565b600060208201905081810360008301526145b381614577565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614616602583613427565b9150614621826145ba565b604082019050919050565b6000602082019050818103600083015261464581614609565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146a8602483613427565b91506146b38261464c565b604082019050919050565b600060208201905081810360008301526146d78161469b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614714602083613427565b915061471f826146de565b602082019050919050565b6000602082019050818103600083015261474381614707565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614780601983613427565b915061478b8261474a565b602082019050919050565b600060208201905081810360008301526147af81614773565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614812603283613427565b915061481d826147b6565b604082019050919050565b6000602082019050818103600083015261484181614805565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006148ad601483613427565b91506148b882614877565b602082019050919050565b600060208201905081810360008301526148dc816148a0565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614919601083613427565b9150614924826148e3565b602082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149768261494f565b614980818561495a565b9350614990818560208601613438565b6149998161346b565b840191505092915050565b60006080820190506149b9600083018761356c565b6149c6602083018661356c565b6149d36040830185613602565b81810360608301526149e5818461496b565b905095945050505050565b6000815190506149ff8161338d565b92915050565b600060208284031215614a1b57614a1a613357565b5b6000614a29848285016149f0565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614a8e603583613427565b9150614a9982614a32565b604082019050919050565b60006020820190508181036000830152614abd81614a81565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614afa602083613427565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b66601c83613427565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202768d9b9522ce4c0fa7f5fa0e19afbd44ad0ee2c48e6d2c572cd63c10b5ac33764736f6c63430008090033
Deployed Bytecode Sourcemap
69395:5260:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70916:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44705:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46217:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45735:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64031:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46917:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71273:102;;;:::i;:::-;;71781:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73481:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63699:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74442:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70124:65;;;:::i;:::-;;47323:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60155:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64221:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69957:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72670:485;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21963:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44415:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73393:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;44146:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19473:103;;;:::i;:::-;;72016:646;;;:::i;:::-;;70055:61;;;:::i;:::-;;18825:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71136:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44874:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73445:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73868:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46460:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47579:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73205:81;;;:::i;:::-;;70585:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74547:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71467:306;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71899:109;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46686:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71383:76;;;:::i;:::-;;19731:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70916:212;71055:4;71084:36;71108:11;71084:23;:36::i;:::-;71077:43;;70916:212;;;:::o;44705:100::-;44759:13;44792:5;44785:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44705:100;:::o;46217:171::-;46293:7;46313:23;46328:7;46313:14;:23::i;:::-;46356:15;:24;46372:7;46356:24;;;;;;;;;;;;;;;;;;;;;46349:31;;46217:171;;;:::o;45735:416::-;45816:13;45832:23;45847:7;45832:14;:23::i;:::-;45816:39;;45880:5;45874:11;;:2;:11;;;;45866:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45974:5;45958:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45983:37;46000:5;46007:12;:10;:12::i;:::-;45983:16;:37::i;:::-;45958:62;45936:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;46122:21;46131:2;46135:7;46122:8;:21::i;:::-;45805:346;45735:416;;:::o;64031:113::-;64092:7;64119:10;:17;;;;64112:24;;64031:113;:::o;46917:335::-;47112:41;47131:12;:10;:12::i;:::-;47145:7;47112:18;:41::i;:::-;47104:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47216:28;47226:4;47232:2;47236:7;47216:9;:28::i;:::-;46917:335;;;:::o;71273:102::-;18711:13;:11;:13::i;:::-;71336:4:::1;71327:6;;:13;;;;;;;;;;;;;;;;;;71363:4;71351:9;;:16;;;;;;;;;;;;;;;;;;71273:102::o:0;71781:110::-;71830:4;71854:9;:21;71864:10;71854:21;;;;;;;;;;;;;;;:29;;;;;;;;;;;;71847:36;;71781:110;:::o;73481:379::-;18711:13;:11;:13::i;:::-;73545:34:::1;73582:9;:19;73592:8;73582:19;;;;;;;;;;;;;;;73545:56;;73642:1;73617:17;:21;;;:26;73614:239;;;73660:10;73676:8;73660:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73700:18;73740:1;73721:10;:17;;;;:20;;;;:::i;:::-;73700:41;;73793:1;73780:10;:14;;;;:::i;:::-;73756:17;:21;;:38;;;;73837:4;73809:17;:25;;;:32;;;;;;;;;;;;;;;;;;73645:208;73614:239;73534:326;73481:379:::0;:::o;63699:256::-;63796:7;63832:23;63849:5;63832:16;:23::i;:::-;63824:5;:31;63816:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;63921:12;:19;63934:5;63921:19;;;;;;;;;;;;;;;:26;63941:5;63921:26;;;;;;;;;;;;63914:33;;63699:256;;;;:::o;74442:97::-;18711:13;:11;:13::i;:::-;74512:9:::1;:19;74522:8;74512:19;;;;;;;;;;;;;;;;74505:26:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74442:97:::0;:::o;70124:65::-;18711:13;:11;:13::i;:::-;70171:10:::1;:8;:10::i;:::-;70124:65::o:0;47323:185::-;47461:39;47478:4;47484:2;47488:7;47461:39;;;;;;;;;;;;:16;:39::i;:::-;47323:185;;;:::o;60155:242::-;60273:41;60292:12;:10;:12::i;:::-;60306:7;60273:18;:41::i;:::-;60265:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;60375:14;60381:7;60375:5;:14::i;:::-;60155:242;:::o;64221:233::-;64296:7;64332:30;:28;:30::i;:::-;64324:5;:38;64316:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64429:10;64440:5;64429:17;;;;;;;;:::i;:::-;;;;;;;;;;64422:24;;64221:233;;;:::o;69957:90::-;18711:13;:11;:13::i;:::-;70035:4:::1;70025:7;:14;;;;;;;;;;;;:::i;:::-;;69957:90:::0;:::o;72670:485::-;72739:4;18711:13;:11;:13::i;:::-;72780:5:::1;72764:21;;:12;;;;;;;;;;;:21;;;72756:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;72859:1;72849:9;;:11;;;;:::i;:::-;72835;72819:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:41;72811:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;72898:15;72916:25;:15;:23;:25::i;:::-;72898:43;;72961:9;72973:1;72961:13;;72956:158;72981:11;72976:1;:16;72956:158;;73018:27;:15;:25;:27::i;:::-;73064:34;73074:10;73096:1;73086:7;:11;;;;:::i;:::-;73064:9;:34::i;:::-;72994:3;;;;;:::i;:::-;;;;72956:158;;;;73135:4;73128:11;;;72670:485:::0;;;:::o;21963:86::-;22010:4;22034:7;;;;;;;;;;;22027:14;;21963:86;:::o;44415:223::-;44487:7;44507:13;44523:17;44532:7;44523:8;:17::i;:::-;44507:33;;44576:1;44559:19;;:5;:19;;;;44551:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44625:5;44618:12;;;44415:223;;;:::o;73393:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44146:207::-;44218:7;44263:1;44246:19;;:5;:19;;;;44238:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44329:9;:16;44339:5;44329:16;;;;;;;;;;;;;;;;44322:23;;44146:207;;;:::o;19473:103::-;18711:13;:11;:13::i;:::-;19538:30:::1;19565:1;19538:18;:30::i;:::-;19473:103::o:0;72016:646::-;72059:6;;;;;;;;;;;72055:600;;;72106:9;;72090:13;:11;:13::i;:::-;:25;72082:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72184:4;72151:37;;:9;:21;72161:10;72151:21;;;;;;;;;;;;;;;:29;;;;;;;;;;;;:37;;;72143:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;72271:5;72237:39;;:9;:21;72247:10;72237:21;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:39;;;72229:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;72339:5;72323:21;;:12;;;;;;;;;;;:21;;;72315:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;72374:15;72392:25;:15;:23;:25::i;:::-;72374:43;;72441:1;72432:10;;;;;:::i;:::-;;;72457:27;:15;:25;:27::i;:::-;72499:30;72509:10;72521:7;72499:9;:30::i;:::-;72579:4;72546:9;:21;72556:10;72546:21;;;;;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;72067:528;72055:600;;;72625:18;;;;;;;;;;:::i;:::-;;;;;;;;72055:600;72016:646::o;70055:61::-;18711:13;:11;:13::i;:::-;70100:8:::1;:6;:8::i;:::-;70055:61::o:0;18825:87::-;18871:7;18898:6;;;;;;;;;;;18891:13;;18825:87;:::o;71136:90::-;18711:13;:11;:13::i;:::-;71211:7:::1;71202:6;;:16;;;;;;;;;;;;;;;;;;71136:90:::0;:::o;44874:104::-;44930:13;44963:7;44956:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44874:104;:::o;73445:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73868:566::-;18711:13;:11;:13::i;:::-;73950:9:::1;73945:482;73969:8;:15;73965:1;:19;73945:482;;;74015:26;74044:8;74053:1;74044:11;;;;;;;;:::i;:::-;;;;;;;;74015:40;;74070:34;74107:9;:29;74117:18;74107:29;;;;;;;;;;;;;;;74070:66;;74179:4;74151:17;:25;;;:32;;;;;;;;;;;;;;;;;;74226:1;74201:17;:21;;;:26;74198:218;;;74248:10;74264:18;74248:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74302:18;74342:1;74323:10;:17;;;;:20;;;;:::i;:::-;74302:41;;74399:1;74386:10;:14;;;;:::i;:::-;74362:17;:21;;:38;;;;74229:187;74198:218;74000:427;;73986:3;;;;;:::i;:::-;;;;73945:482;;;;73868:566:::0;:::o;46460:155::-;46555:52;46574:12;:10;:12::i;:::-;46588:8;46598;46555:18;:52::i;:::-;46460:155;;:::o;47579:322::-;47753:41;47772:12;:10;:12::i;:::-;47786:7;47753:18;:41::i;:::-;47745:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47855:38;47869:4;47875:2;47879:7;47888:4;47855:13;:38::i;:::-;47579:322;;;;:::o;73205:81::-;18711:13;:11;:13::i;:::-;73274:4:::1;73259:12;;:19;;;;;;;;;;;;;;;;;;73205:81::o:0;70585:323::-;70684:13;70710:28;70741:10;:8;:10::i;:::-;70710:41;;70770:16;70778:7;70770;:16::i;:::-;70762:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;70849:14;70865:18;:7;:16;:18::i;:::-;70885:13;70832:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70818:82;;;70585:323;;;:::o;74547:103::-;74590:7;74617:10;:17;;;;74610:24;;74547:103;:::o;71467:306::-;71515:14;;:::i;:::-;71542:15;71560:9;;;;;;;;;;;71542:27;;71580:13;71599:6;;;;;;;;;;;71598:7;71580:25;;71616:15;71651:9;;71634:13;:11;:13::i;:::-;:26;71616:44;;71674:91;;;;;;;;71696:10;71674:91;;;;;;;;71721:8;71674:91;;;;;;;;71744:10;71674:91;;;;;;;;;;;;71467:306;:::o;71899:109::-;71946:4;71970:9;:21;71980:10;71970:21;;;;;;;;;;;;;;;:30;;;;;;;;;;;;71963:37;;71899:109;:::o;46686:164::-;46783:4;46807:18;:25;46826:5;46807:25;;;;;;;;;;;;;;;:35;46833:8;46807:35;;;;;;;;;;;;;;;;;;;;;;;;;46800:42;;46686:164;;;;:::o;71383:76::-;18711:13;:11;:13::i;:::-;71446:5:::1;71437:6;;:14;;;;;;;;;;;;;;;;;;71383:76::o:0;19731:201::-;18711:13;:11;:13::i;:::-;19840:1:::1;19820:22;;:8;:22;;;;19812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19896:28;19915:8;19896:18;:28::i;:::-;19731:201:::0;:::o;63391:224::-;63493:4;63532:35;63517:50;;;:11;:50;;;;:90;;;;63571:36;63595:11;63571:23;:36::i;:::-;63517:90;63510:97;;63391:224;;;:::o;56036:135::-;56118:16;56126:7;56118;:16::i;:::-;56110:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56036:135;:::o;17376:98::-;17429:7;17456:10;17449:17;;17376:98;:::o;55315:174::-;55417:2;55390:15;:24;55406:7;55390:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55473:7;55469:2;55435:46;;55444:23;55459:7;55444:14;:23::i;:::-;55435:46;;;;;;;;;;;;55315:174;;:::o;49934:264::-;50027:4;50044:13;50060:23;50075:7;50060:14;:23::i;:::-;50044:39;;50113:5;50102:16;;:7;:16;;;:52;;;;50122:32;50139:5;50146:7;50122:16;:32::i;:::-;50102:52;:87;;;;50182:7;50158:31;;:20;50170:7;50158:11;:20::i;:::-;:31;;;50102:87;50094:96;;;49934:264;;;;:::o;53933:1263::-;54092:4;54065:31;;:23;54080:7;54065:14;:23::i;:::-;:31;;;54057:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54171:1;54157:16;;:2;:16;;;;54149:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54227:42;54248:4;54254:2;54258:7;54267:1;54227:20;:42::i;:::-;54399:4;54372:31;;:23;54387:7;54372:14;:23::i;:::-;:31;;;54364:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54517:15;:24;54533:7;54517:24;;;;;;;;;;;;54510:31;;;;;;;;;;;55012:1;54993:9;:15;55003:4;54993:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55045:1;55028:9;:13;55038:2;55028:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55087:2;55068:7;:16;55076:7;55068:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55126:7;55122:2;55107:27;;55116:4;55107:27;;;;;;;;;;;;55147:41;55167:4;55173:2;55177:7;55186:1;55147:19;:41::i;:::-;53933:1263;;;:::o;18990:132::-;19065:12;:10;:12::i;:::-;19054:23;;:7;:5;:7::i;:::-;:23;;;19046:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18990:132::o;22818:120::-;21827:16;:14;:16::i;:::-;22887:5:::1;22877:7;;:15;;;;;;;;;;;;;;;;;;22908:22;22917:12;:10;:12::i;:::-;22908:22;;;;;;:::i;:::-;;;;;;;;22818:120::o:0;70462:115::-;70549:20;70561:7;70549:11;:20::i;:::-;70462:115;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;50540:110::-;50616:26;50626:2;50630:7;50616:26;;;;;;;;;;;;:9;:26::i;:::-;50540:110;;:::o;49209:117::-;49275:7;49302;:16;49310:7;49302:16;;;;;;;;;;;;;;;;;;;;;49295:23;;49209:117;;;:::o;20092:191::-;20166:16;20185:6;;;;;;;;;;;20166:25;;20211:8;20202:6;;:17;;;;;;;;;;;;;;;;;;20266:8;20235:40;;20256:8;20235:40;;;;;;;;;;;;20155:128;20092:191;:::o;22559:118::-;21568:19;:17;:19::i;:::-;22629:4:::1;22619:7;;:14;;;;;;;;;;;;;;;;;;22649:20;22656:12;:10;:12::i;:::-;22649:20;;;;;;:::i;:::-;;;;;;;;22559:118::o:0;55632:315::-;55787:8;55778:17;;:5;:17;;;;55770:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55874:8;55836:18;:25;55855:5;55836:25;;;;;;;;;;;;;;;:35;55862:8;55836:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55920:8;55898:41;;55913:5;55898:41;;;55930:8;55898:41;;;;;;:::i;:::-;;;;;;;;55632:315;;;:::o;48782:313::-;48938:28;48948:4;48954:2;48958:7;48938:9;:28::i;:::-;48985:47;49008:4;49014:2;49018:7;49027:4;48985:22;:47::i;:::-;48977:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48782:313;;;;:::o;69849:100::-;69901:13;69934:7;69927:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69849:100;:::o;49639:128::-;49704:4;49757:1;49728:31;;:17;49737:7;49728:8;:17::i;:::-;:31;;;;49721:38;;49639:128;;;:::o;14803:716::-;14859:13;14910:14;14947:1;14927:17;14938:5;14927:10;:17::i;:::-;:21;14910:38;;14963:20;14997:6;14986:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14963:41;;15019:11;15148:6;15144:2;15140:15;15132:6;15128:28;15121:35;;15185:288;15192:4;15185:288;;;15217:5;;;;;;;;15359:8;15354:2;15347:5;15343:14;15338:30;15333:3;15325:44;15415:2;15406:11;;;;;;:::i;:::-;;;;;15449:1;15440:5;:10;15436:21;;;15452:5;;15436:21;15185:288;;;15494:6;15487:13;;;;;14803:716;;;:::o;43777:305::-;43879:4;43931:25;43916:40;;;:11;:40;;;;:105;;;;43988:33;43973:48;;;:11;:48;;;;43916:105;:158;;;;44038:36;44062:11;44038:23;:36::i;:::-;43916:158;43896:178;;43777:305;;;:::o;70197:257::-;21568:19;:17;:19::i;:::-;70390:56:::1;70417:4;70423:2;70427:7;70436:9;70390:26;:56::i;:::-;70197:257:::0;;;;:::o;59452:158::-;;;;;:::o;22307:108::-;22374:8;:6;:8::i;:::-;22366:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22307:108::o;62152:206::-;62221:20;62233:7;62221:11;:20::i;:::-;62295:1;62264:10;:19;62275:7;62264:19;;;;;;;;;;;62258:33;;;;;:::i;:::-;;;:38;62254:97;;62320:10;:19;62331:7;62320:19;;;;;;;;;;;;62313:26;;;;:::i;:::-;62254:97;62152:206;:::o;50877:319::-;51006:18;51012:2;51016:7;51006:5;:18::i;:::-;51057:53;51088:1;51092:2;51096:7;51105:4;51057:22;:53::i;:::-;51035:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;50877:319;;;:::o;22122:108::-;22193:8;:6;:8::i;:::-;22192:9;22184:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22122:108::o;56735:853::-;56889:4;56910:15;:2;:13;;;:15::i;:::-;56906:675;;;56962:2;56946:36;;;56983:12;:10;:12::i;:::-;56997:4;57003:7;57012:4;56946:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56942:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57204:1;57187:6;:13;:18;57183:328;;;57230:60;;;;;;;;;;:::i;:::-;;;;;;;;57183:328;57461:6;57455:13;57446:6;57442:2;57438:15;57431:38;56942:584;57078:41;;;57068:51;;;:6;:51;;;;57061:58;;;;;56906:675;57565:4;57558:11;;56735:853;;;;;;;:::o;11669:922::-;11722:7;11742:14;11759:1;11742:18;;11809:6;11800:5;:15;11796:102;;11845:6;11836:15;;;;;;:::i;:::-;;;;;11880:2;11870:12;;;;11796:102;11925:6;11916:5;:15;11912:102;;11961:6;11952:15;;;;;;:::i;:::-;;;;;11996:2;11986:12;;;;11912:102;12041:6;12032:5;:15;12028:102;;12077:6;12068:15;;;;;;:::i;:::-;;;;;12112:2;12102:12;;;;12028:102;12157:5;12148;:14;12144:99;;12192:5;12183:14;;;;;;:::i;:::-;;;;;12226:1;12216:11;;;;12144:99;12270:5;12261;:14;12257:99;;12305:5;12296:14;;;;;;:::i;:::-;;;;;12339:1;12329:11;;;;12257:99;12383:5;12374;:14;12370:99;;12418:5;12409:14;;;;;;:::i;:::-;;;;;12452:1;12442:11;;;;12370:99;12496:5;12487;:14;12483:66;;12532:1;12522:11;;;;12483:66;12577:6;12570:13;;;11669:922;;;:::o;35209:157::-;35294:4;35333:25;35318:40;;;:11;:40;;;;35311:47;;35209:157;;;:::o;64528:915::-;64705:61;64732:4;64738:2;64742:12;64756:9;64705:26;:61::i;:::-;64795:1;64783:9;:13;64779:222;;;64926:63;;;;;;;;;;:::i;:::-;;;;;;;;64779:222;65013:15;65031:12;65013:30;;65076:1;65060:18;;:4;:18;;;65056:187;;;65095:40;65127:7;65095:31;:40::i;:::-;65056:187;;;65165:2;65157:10;;:4;:10;;;65153:90;;65184:47;65217:4;65223:7;65184:32;:47::i;:::-;65153:90;65056:187;65271:1;65257:16;;:2;:16;;;65253:183;;;65290:45;65327:7;65290:36;:45::i;:::-;65253:183;;;65363:4;65357:10;;:2;:10;;;65353:83;;65384:40;65412:2;65416:7;65384:27;:40::i;:::-;65353:83;65253:183;64694:749;64528:915;;;;:::o;52813:783::-;52873:13;52889:23;52904:7;52889:14;:23::i;:::-;52873:39;;52925:51;52946:5;52961:1;52965:7;52974:1;52925:20;:51::i;:::-;53089:23;53104:7;53089:14;:23::i;:::-;53081:31;;53160:15;:24;53176:7;53160:24;;;;;;;;;;;;53153:31;;;;;;;;;;;53425:1;53405:9;:16;53415:5;53405:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;53455:7;:16;53463:7;53455:16;;;;;;;;;;;;53448:23;;;;;;;;;;;53517:7;53513:1;53489:36;;53498:5;53489:36;;;;;;;;;;;;53538:50;53558:5;53573:1;53577:7;53586:1;53538:19;:50::i;:::-;52862:734;52813:783;:::o;51532:942::-;51626:1;51612:16;;:2;:16;;;;51604:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51685:16;51693:7;51685;:16::i;:::-;51684:17;51676:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51747:48;51776:1;51780:2;51784:7;51793:1;51747:20;:48::i;:::-;51894:16;51902:7;51894;:16::i;:::-;51893:17;51885:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:1;52292:9;:13;52302:2;52292:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52353:2;52334:7;:16;52342:7;52334:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52398:7;52394:2;52373:33;;52390:1;52373:33;;;;;;;;;;;;52419:47;52447:1;52451:2;52455:7;52464:1;52419:19;:47::i;:::-;51532:942;;:::o;24178:326::-;24238:4;24495:1;24473:7;:19;;;:23;24466:30;;24178:326;;;:::o;58320:410::-;58510:1;58498:9;:13;58494:229;;;58548:1;58532:18;;:4;:18;;;58528:87;;58590:9;58571;:15;58581:4;58571:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;58528:87;58647:1;58633:16;;:2;:16;;;58629:83;;58687:9;58670;:13;58680:2;58670:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;58629:83;58494:229;58320:410;;;;:::o;66166:164::-;66270:10;:17;;;;66243:15;:24;66259:7;66243:24;;;;;;;;;;;:44;;;;66298:10;66314:7;66298:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66166:164;:::o;66957:988::-;67223:22;67273:1;67248:22;67265:4;67248:16;:22::i;:::-;:26;;;;:::i;:::-;67223:51;;67285:18;67306:17;:26;67324:7;67306:26;;;;;;;;;;;;67285:47;;67453:14;67439:10;:28;67435:328;;67484:19;67506:12;:18;67519:4;67506:18;;;;;;;;;;;;;;;:34;67525:14;67506:34;;;;;;;;;;;;67484:56;;67590:11;67557:12;:18;67570:4;67557:18;;;;;;;;;;;;;;;:30;67576:10;67557:30;;;;;;;;;;;:44;;;;67707:10;67674:17;:30;67692:11;67674:30;;;;;;;;;;;:43;;;;67469:294;67435:328;67859:17;:26;67877:7;67859:26;;;;;;;;;;;67852:33;;;67903:12;:18;67916:4;67903:18;;;;;;;;;;;;;;;:34;67922:14;67903:34;;;;;;;;;;;67896:41;;;67038:907;;66957:988;;:::o;68240:1079::-;68493:22;68538:1;68518:10;:17;;;;:21;;;;:::i;:::-;68493:46;;68550:18;68571:15;:24;68587:7;68571:24;;;;;;;;;;;;68550:45;;68922:19;68944:10;68955:14;68944:26;;;;;;;;:::i;:::-;;;;;;;;;;68922:48;;69008:11;68983:10;68994;68983:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;69119:10;69088:15;:28;69104:11;69088:28;;;;;;;;;;;:41;;;;69260:15;:24;69276:7;69260:24;;;;;;;;;;;69253:31;;;69295:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68311:1008;;;68240:1079;:::o;65744:221::-;65829:14;65846:20;65863:2;65846:16;:20::i;:::-;65829:37;;65904:7;65877:12;:16;65890:2;65877:16;;;;;;;;;;;;;;;:24;65894:6;65877:24;;;;;;;;;;;:34;;;;65951:6;65922:17;:26;65940:7;65922:26;;;;;;;;;;;:35;;;;65818:147;65744:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:418::-;9008:4;9046:2;9035:9;9031:18;9023:26;;9059:71;9127:1;9116:9;9112:17;9103:6;9059:71;:::i;:::-;9140:66;9202:2;9191:9;9187:18;9178:6;9140:66;:::i;:::-;9216;9278:2;9267:9;9263:18;9254:6;9216:66;:::i;:::-;8871:418;;;;;;:::o;9295:116::-;9365:21;9380:5;9365:21;:::i;:::-;9358:5;9355:32;9345:60;;9401:1;9398;9391:12;9345:60;9295:116;:::o;9417:133::-;9460:5;9498:6;9485:20;9476:29;;9514:30;9538:5;9514:30;:::i;:::-;9417:133;;;;:::o;9556:323::-;9612:6;9661:2;9649:9;9640:7;9636:23;9632:32;9629:119;;;9667:79;;:::i;:::-;9629:119;9787:1;9812:50;9854:7;9845:6;9834:9;9830:22;9812:50;:::i;:::-;9802:60;;9758:114;9556:323;;;;:::o;9885:311::-;9962:4;10052:18;10044:6;10041:30;10038:56;;;10074:18;;:::i;:::-;10038:56;10124:4;10116:6;10112:17;10104:25;;10184:4;10178;10174:15;10166:23;;9885:311;;;:::o;10202:117::-;10311:1;10308;10301:12;10342:710;10438:5;10463:81;10479:64;10536:6;10479:64;:::i;:::-;10463:81;:::i;:::-;10454:90;;10564:5;10593:6;10586:5;10579:21;10627:4;10620:5;10616:16;10609:23;;10680:4;10672:6;10668:17;10660:6;10656:30;10709:3;10701:6;10698:15;10695:122;;;10728:79;;:::i;:::-;10695:122;10843:6;10826:220;10860:6;10855:3;10852:15;10826:220;;;10935:3;10964:37;10997:3;10985:10;10964:37;:::i;:::-;10959:3;10952:50;11031:4;11026:3;11022:14;11015:21;;10902:144;10886:4;10881:3;10877:14;10870:21;;10826:220;;;10830:21;10444:608;;10342:710;;;;;:::o;11075:370::-;11146:5;11195:3;11188:4;11180:6;11176:17;11172:27;11162:122;;11203:79;;:::i;:::-;11162:122;11320:6;11307:20;11345:94;11435:3;11427:6;11420:4;11412:6;11408:17;11345:94;:::i;:::-;11336:103;;11152:293;11075:370;;;;:::o;11451:539::-;11535:6;11584:2;11572:9;11563:7;11559:23;11555:32;11552:119;;;11590:79;;:::i;:::-;11552:119;11738:1;11727:9;11723:17;11710:31;11768:18;11760:6;11757:30;11754:117;;;11790:79;;:::i;:::-;11754:117;11895:78;11965:7;11956:6;11945:9;11941:22;11895:78;:::i;:::-;11885:88;;11681:302;11451:539;;;;:::o;11996:468::-;12061:6;12069;12118:2;12106:9;12097:7;12093:23;12089:32;12086:119;;;12124:79;;:::i;:::-;12086:119;12244:1;12269:53;12314:7;12305:6;12294:9;12290:22;12269:53;:::i;:::-;12259:63;;12215:117;12371:2;12397:50;12439:7;12430:6;12419:9;12415:22;12397:50;:::i;:::-;12387:60;;12342:115;11996:468;;;;;:::o;12470:307::-;12531:4;12621:18;12613:6;12610:30;12607:56;;;12643:18;;:::i;:::-;12607:56;12681:29;12703:6;12681:29;:::i;:::-;12673:37;;12765:4;12759;12755:15;12747:23;;12470:307;;;:::o;12783:410::-;12860:5;12885:65;12901:48;12942:6;12901:48;:::i;:::-;12885:65;:::i;:::-;12876:74;;12973:6;12966:5;12959:21;13011:4;13004:5;13000:16;13049:3;13040:6;13035:3;13031:16;13028:25;13025:112;;;13056:79;;:::i;:::-;13025:112;13146:41;13180:6;13175:3;13170;13146:41;:::i;:::-;12866:327;12783:410;;;;;:::o;13212:338::-;13267:5;13316:3;13309:4;13301:6;13297:17;13293:27;13283:122;;13324:79;;:::i;:::-;13283:122;13441:6;13428:20;13466:78;13540:3;13532:6;13525:4;13517:6;13513:17;13466:78;:::i;:::-;13457:87;;13273:277;13212:338;;;;:::o;13556:943::-;13651:6;13659;13667;13675;13724:3;13712:9;13703:7;13699:23;13695:33;13692:120;;;13731:79;;:::i;:::-;13692:120;13851:1;13876:53;13921:7;13912:6;13901:9;13897:22;13876:53;:::i;:::-;13866:63;;13822:117;13978:2;14004:53;14049:7;14040:6;14029:9;14025:22;14004:53;:::i;:::-;13994:63;;13949:118;14106:2;14132:53;14177:7;14168:6;14157:9;14153:22;14132:53;:::i;:::-;14122:63;;14077:118;14262:2;14251:9;14247:18;14234:32;14293:18;14285:6;14282:30;14279:117;;;14315:79;;:::i;:::-;14279:117;14420:62;14474:7;14465:6;14454:9;14450:22;14420:62;:::i;:::-;14410:72;;14205:287;13556:943;;;;;;;:::o;14505:101::-;14567:6;14595:4;14585:14;;14505:101;;;:::o;14612:140::-;14706:11;14743:3;14728:18;;14612:140;;;;:::o;14758:95::-;14820:4;14843:3;14835:11;;14758:95;;;:::o;14859:99::-;14930:21;14945:5;14930:21;:::i;:::-;14925:3;14918:34;14859:99;;:::o;14964:167::-;15027:10;15048:40;15084:3;15076:6;15048:40;:::i;:::-;15120:4;15115:3;15111:14;15097:28;;14964:167;;;;:::o;15137:108::-;15202:4;15234;15229:3;15225:14;15217:22;;15137:108;;;:::o;15277:670::-;15407:49;15450:5;15407:49;:::i;:::-;15472:81;15546:6;15541:3;15472:81;:::i;:::-;15465:88;;15577:51;15622:5;15577:51;:::i;:::-;15651:7;15682:1;15667:273;15692:6;15689:1;15686:13;15667:273;;;15768:6;15762:13;15795:57;15848:3;15833:13;15795:57;:::i;:::-;15788:64;;15875:55;15923:6;15875:55;:::i;:::-;15865:65;;15727:213;15714:1;15711;15707:9;15702:14;;15667:273;;;15671:14;15383:564;;;15277:670;;:::o;15953:302::-;16086:4;16124:2;16113:9;16109:18;16101:26;;16137:111;16245:1;16234:9;16230:17;16221:6;16137:111;:::i;:::-;15953:302;;;;:::o;16261:474::-;16329:6;16337;16386:2;16374:9;16365:7;16361:23;16357:32;16354:119;;;16392:79;;:::i;:::-;16354:119;16512:1;16537:53;16582:7;16573:6;16562:9;16558:22;16537:53;:::i;:::-;16527:63;;16483:117;16639:2;16665:53;16710:7;16701:6;16690:9;16686:22;16665:53;:::i;:::-;16655:63;;16610:118;16261:474;;;;;:::o;16741:180::-;16789:77;16786:1;16779:88;16886:4;16883:1;16876:15;16910:4;16907:1;16900:15;16927:320;16971:6;17008:1;17002:4;16998:12;16988:22;;17055:1;17049:4;17045:12;17076:18;17066:81;;17132:4;17124:6;17120:17;17110:27;;17066:81;17194:2;17186:6;17183:14;17163:18;17160:38;17157:84;;;17213:18;;:::i;:::-;17157:84;16978:269;16927:320;;;:::o;17253:220::-;17393:34;17389:1;17381:6;17377:14;17370:58;17462:3;17457:2;17449:6;17445:15;17438:28;17253:220;:::o;17479:366::-;17621:3;17642:67;17706:2;17701:3;17642:67;:::i;:::-;17635:74;;17718:93;17807:3;17718:93;:::i;:::-;17836:2;17831:3;17827:12;17820:19;;17479:366;;;:::o;17851:419::-;18017:4;18055:2;18044:9;18040:18;18032:26;;18104:9;18098:4;18094:20;18090:1;18079:9;18075:17;18068:47;18132:131;18258:4;18132:131;:::i;:::-;18124:139;;17851:419;;;:::o;18276:248::-;18416:34;18412:1;18404:6;18400:14;18393:58;18485:31;18480:2;18472:6;18468:15;18461:56;18276:248;:::o;18530:366::-;18672:3;18693:67;18757:2;18752:3;18693:67;:::i;:::-;18686:74;;18769:93;18858:3;18769:93;:::i;:::-;18887:2;18882:3;18878:12;18871:19;;18530:366;;;:::o;18902:419::-;19068:4;19106:2;19095:9;19091:18;19083:26;;19155:9;19149:4;19145:20;19141:1;19130:9;19126:17;19119:47;19183:131;19309:4;19183:131;:::i;:::-;19175:139;;18902:419;;;:::o;19327:232::-;19467:34;19463:1;19455:6;19451:14;19444:58;19536:15;19531:2;19523:6;19519:15;19512:40;19327:232;:::o;19565:366::-;19707:3;19728:67;19792:2;19787:3;19728:67;:::i;:::-;19721:74;;19804:93;19893:3;19804:93;:::i;:::-;19922:2;19917:3;19913:12;19906:19;;19565:366;;;:::o;19937:419::-;20103:4;20141:2;20130:9;20126:18;20118:26;;20190:9;20184:4;20180:20;20176:1;20165:9;20161:17;20154:47;20218:131;20344:4;20218:131;:::i;:::-;20210:139;;19937:419;;;:::o;20362:180::-;20410:77;20407:1;20400:88;20507:4;20504:1;20497:15;20531:4;20528:1;20521:15;20548:191;20588:4;20608:20;20626:1;20608:20;:::i;:::-;20603:25;;20642:20;20660:1;20642:20;:::i;:::-;20637:25;;20681:1;20678;20675:8;20672:34;;;20686:18;;:::i;:::-;20672:34;20731:1;20728;20724:9;20716:17;;20548:191;;;;:::o;20745:305::-;20785:3;20804:20;20822:1;20804:20;:::i;:::-;20799:25;;20838:20;20856:1;20838:20;:::i;:::-;20833:25;;20992:1;20924:66;20920:74;20917:1;20914:81;20911:107;;;20998:18;;:::i;:::-;20911:107;21042:1;21039;21035:9;21028:16;;20745:305;;;;:::o;21056:230::-;21196:34;21192:1;21184:6;21180:14;21173:58;21265:13;21260:2;21252:6;21248:15;21241:38;21056:230;:::o;21292:366::-;21434:3;21455:67;21519:2;21514:3;21455:67;:::i;:::-;21448:74;;21531:93;21620:3;21531:93;:::i;:::-;21649:2;21644:3;21640:12;21633:19;;21292:366;;;:::o;21664:419::-;21830:4;21868:2;21857:9;21853:18;21845:26;;21917:9;21911:4;21907:20;21903:1;21892:9;21888:17;21881:47;21945:131;22071:4;21945:131;:::i;:::-;21937:139;;21664:419;;;:::o;22089:231::-;22229:34;22225:1;22217:6;22213:14;22206:58;22298:14;22293:2;22285:6;22281:15;22274:39;22089:231;:::o;22326:366::-;22468:3;22489:67;22553:2;22548:3;22489:67;:::i;:::-;22482:74;;22565:93;22654:3;22565:93;:::i;:::-;22683:2;22678:3;22674:12;22667:19;;22326:366;;;:::o;22698:419::-;22864:4;22902:2;22891:9;22887:18;22879:26;;22951:9;22945:4;22941:20;22937:1;22926:9;22922:17;22915:47;22979:131;23105:4;22979:131;:::i;:::-;22971:139;;22698:419;;;:::o;23123:180::-;23171:77;23168:1;23161:88;23268:4;23265:1;23258:15;23292:4;23289:1;23282:15;23309:160;23449:12;23445:1;23437:6;23433:14;23426:36;23309:160;:::o;23475:366::-;23617:3;23638:67;23702:2;23697:3;23638:67;:::i;:::-;23631:74;;23714:93;23803:3;23714:93;:::i;:::-;23832:2;23827:3;23823:12;23816:19;;23475:366;;;:::o;23847:419::-;24013:4;24051:2;24040:9;24036:18;24028:26;;24100:9;24094:4;24090:20;24086:1;24075:9;24071:17;24064:47;24128:131;24254:4;24128:131;:::i;:::-;24120:139;;23847:419;;;:::o;24272:158::-;24412:10;24408:1;24400:6;24396:14;24389:34;24272:158;:::o;24436:365::-;24578:3;24599:66;24663:1;24658:3;24599:66;:::i;:::-;24592:73;;24674:93;24763:3;24674:93;:::i;:::-;24792:2;24787:3;24783:12;24776:19;;24436:365;;;:::o;24807:419::-;24973:4;25011:2;25000:9;24996:18;24988:26;;25060:9;25054:4;25050:20;25046:1;25035:9;25031:17;25024:47;25088:131;25214:4;25088:131;:::i;:::-;25080:139;;24807:419;;;:::o;25232:233::-;25271:3;25294:24;25312:5;25294:24;:::i;:::-;25285:33;;25340:66;25333:5;25330:77;25327:103;;;25410:18;;:::i;:::-;25327:103;25457:1;25450:5;25446:13;25439:20;;25232:233;;;:::o;25471:174::-;25611:26;25607:1;25599:6;25595:14;25588:50;25471:174;:::o;25651:366::-;25793:3;25814:67;25878:2;25873:3;25814:67;:::i;:::-;25807:74;;25890:93;25979:3;25890:93;:::i;:::-;26008:2;26003:3;25999:12;25992:19;;25651:366;;;:::o;26023:419::-;26189:4;26227:2;26216:9;26212:18;26204:26;;26276:9;26270:4;26266:20;26262:1;26251:9;26247:17;26240:47;26304:131;26430:4;26304:131;:::i;:::-;26296:139;;26023:419;;;:::o;26448:228::-;26588:34;26584:1;26576:6;26572:14;26565:58;26657:11;26652:2;26644:6;26640:15;26633:36;26448:228;:::o;26682:366::-;26824:3;26845:67;26909:2;26904:3;26845:67;:::i;:::-;26838:74;;26921:93;27010:3;26921:93;:::i;:::-;27039:2;27034:3;27030:12;27023:19;;26682:366;;;:::o;27054:419::-;27220:4;27258:2;27247:9;27243:18;27235:26;;27307:9;27301:4;27297:20;27293:1;27282:9;27278:17;27271:47;27335:131;27461:4;27335:131;:::i;:::-;27327:139;;27054:419;;;:::o;27479:171::-;27619:23;27615:1;27607:6;27603:14;27596:47;27479:171;:::o;27656:366::-;27798:3;27819:67;27883:2;27878:3;27819:67;:::i;:::-;27812:74;;27895:93;27984:3;27895:93;:::i;:::-;28013:2;28008:3;28004:12;27997:19;;27656:366;;;:::o;28028:419::-;28194:4;28232:2;28221:9;28217:18;28209:26;;28281:9;28275:4;28271:20;28267:1;28256:9;28252:17;28245:47;28309:131;28435:4;28309:131;:::i;:::-;28301:139;;28028:419;;;:::o;28453:169::-;28593:21;28589:1;28581:6;28577:14;28570:45;28453:169;:::o;28628:366::-;28770:3;28791:67;28855:2;28850:3;28791:67;:::i;:::-;28784:74;;28867:93;28956:3;28867:93;:::i;:::-;28985:2;28980:3;28976:12;28969:19;;28628:366;;;:::o;29000:419::-;29166:4;29204:2;29193:9;29189:18;29181:26;;29253:9;29247:4;29243:20;29239:1;29228:9;29224:17;29217:47;29281:131;29407:4;29281:131;:::i;:::-;29273:139;;29000:419;;;:::o;29425:158::-;29565:10;29561:1;29553:6;29549:14;29542:34;29425:158;:::o;29589:365::-;29731:3;29752:66;29816:1;29811:3;29752:66;:::i;:::-;29745:73;;29827:93;29916:3;29827:93;:::i;:::-;29945:2;29940:3;29936:12;29929:19;;29589:365;;;:::o;29960:419::-;30126:4;30164:2;30153:9;30149:18;30141:26;;30213:9;30207:4;30203:20;30199:1;30188:9;30184:17;30177:47;30241:131;30367:4;30241:131;:::i;:::-;30233:139;;29960:419;;;:::o;30385:166::-;30525:18;30521:1;30513:6;30509:14;30502:42;30385:166;:::o;30557:366::-;30699:3;30720:67;30784:2;30779:3;30720:67;:::i;:::-;30713:74;;30796:93;30885:3;30796:93;:::i;:::-;30914:2;30909:3;30905:12;30898:19;;30557:366;;;:::o;30929:419::-;31095:4;31133:2;31122:9;31118:18;31110:26;;31182:9;31176:4;31172:20;31168:1;31157:9;31153:17;31146:47;31210:131;31336:4;31210:131;:::i;:::-;31202:139;;30929:419;;;:::o;31354:148::-;31456:11;31493:3;31478:18;;31354:148;;;;:::o;31508:377::-;31614:3;31642:39;31675:5;31642:39;:::i;:::-;31697:89;31779:6;31774:3;31697:89;:::i;:::-;31690:96;;31795:52;31840:6;31835:3;31828:4;31821:5;31817:16;31795:52;:::i;:::-;31872:6;31867:3;31863:16;31856:23;;31618:267;31508:377;;;;:::o;31891:141::-;31940:4;31963:3;31955:11;;31986:3;31983:1;31976:14;32020:4;32017:1;32007:18;31999:26;;31891:141;;;:::o;32062:845::-;32165:3;32202:5;32196:12;32231:36;32257:9;32231:36;:::i;:::-;32283:89;32365:6;32360:3;32283:89;:::i;:::-;32276:96;;32403:1;32392:9;32388:17;32419:1;32414:137;;;;32565:1;32560:341;;;;32381:520;;32414:137;32498:4;32494:9;32483;32479:25;32474:3;32467:38;32534:6;32529:3;32525:16;32518:23;;32414:137;;32560:341;32627:38;32659:5;32627:38;:::i;:::-;32687:1;32701:154;32715:6;32712:1;32709:13;32701:154;;;32789:7;32783:14;32779:1;32774:3;32770:11;32763:35;32839:1;32830:7;32826:15;32815:26;;32737:4;32734:1;32730:12;32725:17;;32701:154;;;32884:6;32879:3;32875:16;32868:23;;32567:334;;32381:520;;32169:738;;32062:845;;;;:::o;32913:589::-;33138:3;33160:95;33251:3;33242:6;33160:95;:::i;:::-;33153:102;;33272:95;33363:3;33354:6;33272:95;:::i;:::-;33265:102;;33384:92;33472:3;33463:6;33384:92;:::i;:::-;33377:99;;33493:3;33486:10;;32913:589;;;;;;:::o;33508:225::-;33648:34;33644:1;33636:6;33632:14;33625:58;33717:8;33712:2;33704:6;33700:15;33693:33;33508:225;:::o;33739:366::-;33881:3;33902:67;33966:2;33961:3;33902:67;:::i;:::-;33895:74;;33978:93;34067:3;33978:93;:::i;:::-;34096:2;34091:3;34087:12;34080:19;;33739:366;;;:::o;34111:419::-;34277:4;34315:2;34304:9;34300:18;34292:26;;34364:9;34358:4;34354:20;34350:1;34339:9;34335:17;34328:47;34392:131;34518:4;34392:131;:::i;:::-;34384:139;;34111:419;;;:::o;34536:224::-;34676:34;34672:1;34664:6;34660:14;34653:58;34745:7;34740:2;34732:6;34728:15;34721:32;34536:224;:::o;34766:366::-;34908:3;34929:67;34993:2;34988:3;34929:67;:::i;:::-;34922:74;;35005:93;35094:3;35005:93;:::i;:::-;35123:2;35118:3;35114:12;35107:19;;34766:366;;;:::o;35138:419::-;35304:4;35342:2;35331:9;35327:18;35319:26;;35391:9;35385:4;35381:20;35377:1;35366:9;35362:17;35355:47;35419:131;35545:4;35419:131;:::i;:::-;35411:139;;35138:419;;;:::o;35563:223::-;35703:34;35699:1;35691:6;35687:14;35680:58;35772:6;35767:2;35759:6;35755:15;35748:31;35563:223;:::o;35792:366::-;35934:3;35955:67;36019:2;36014:3;35955:67;:::i;:::-;35948:74;;36031:93;36120:3;36031:93;:::i;:::-;36149:2;36144:3;36140:12;36133:19;;35792:366;;;:::o;36164:419::-;36330:4;36368:2;36357:9;36353:18;36345:26;;36417:9;36411:4;36407:20;36403:1;36392:9;36388:17;36381:47;36445:131;36571:4;36445:131;:::i;:::-;36437:139;;36164:419;;;:::o;36589:182::-;36729:34;36725:1;36717:6;36713:14;36706:58;36589:182;:::o;36777:366::-;36919:3;36940:67;37004:2;36999:3;36940:67;:::i;:::-;36933:74;;37016:93;37105:3;37016:93;:::i;:::-;37134:2;37129:3;37125:12;37118:19;;36777:366;;;:::o;37149:419::-;37315:4;37353:2;37342:9;37338:18;37330:26;;37402:9;37396:4;37392:20;37388:1;37377:9;37373:17;37366:47;37430:131;37556:4;37430:131;:::i;:::-;37422:139;;37149:419;;;:::o;37574:175::-;37714:27;37710:1;37702:6;37698:14;37691:51;37574:175;:::o;37755:366::-;37897:3;37918:67;37982:2;37977:3;37918:67;:::i;:::-;37911:74;;37994:93;38083:3;37994:93;:::i;:::-;38112:2;38107:3;38103:12;38096:19;;37755:366;;;:::o;38127:419::-;38293:4;38331:2;38320:9;38316:18;38308:26;;38380:9;38374:4;38370:20;38366:1;38355:9;38351:17;38344:47;38408:131;38534:4;38408:131;:::i;:::-;38400:139;;38127:419;;;:::o;38552:237::-;38692:34;38688:1;38680:6;38676:14;38669:58;38761:20;38756:2;38748:6;38744:15;38737:45;38552:237;:::o;38795:366::-;38937:3;38958:67;39022:2;39017:3;38958:67;:::i;:::-;38951:74;;39034:93;39123:3;39034:93;:::i;:::-;39152:2;39147:3;39143:12;39136:19;;38795:366;;;:::o;39167:419::-;39333:4;39371:2;39360:9;39356:18;39348:26;;39420:9;39414:4;39410:20;39406:1;39395:9;39391:17;39384:47;39448:131;39574:4;39448:131;:::i;:::-;39440:139;;39167:419;;;:::o;39592:180::-;39640:77;39637:1;39630:88;39737:4;39734:1;39727:15;39761:4;39758:1;39751:15;39778:170;39918:22;39914:1;39906:6;39902:14;39895:46;39778:170;:::o;39954:366::-;40096:3;40117:67;40181:2;40176:3;40117:67;:::i;:::-;40110:74;;40193:93;40282:3;40193:93;:::i;:::-;40311:2;40306:3;40302:12;40295:19;;39954:366;;;:::o;40326:419::-;40492:4;40530:2;40519:9;40515:18;40507:26;;40579:9;40573:4;40569:20;40565:1;40554:9;40550:17;40543:47;40607:131;40733:4;40607:131;:::i;:::-;40599:139;;40326:419;;;:::o;40751:166::-;40891:18;40887:1;40879:6;40875:14;40868:42;40751:166;:::o;40923:366::-;41065:3;41086:67;41150:2;41145:3;41086:67;:::i;:::-;41079:74;;41162:93;41251:3;41162:93;:::i;:::-;41280:2;41275:3;41271:12;41264:19;;40923:366;;;:::o;41295:419::-;41461:4;41499:2;41488:9;41484:18;41476:26;;41548:9;41542:4;41538:20;41534:1;41523:9;41519:17;41512:47;41576:131;41702:4;41576:131;:::i;:::-;41568:139;;41295:419;;;:::o;41720:98::-;41771:6;41805:5;41799:12;41789:22;;41720:98;;;:::o;41824:168::-;41907:11;41941:6;41936:3;41929:19;41981:4;41976:3;41972:14;41957:29;;41824:168;;;;:::o;41998:360::-;42084:3;42112:38;42144:5;42112:38;:::i;:::-;42166:70;42229:6;42224:3;42166:70;:::i;:::-;42159:77;;42245:52;42290:6;42285:3;42278:4;42271:5;42267:16;42245:52;:::i;:::-;42322:29;42344:6;42322:29;:::i;:::-;42317:3;42313:39;42306:46;;42088:270;41998:360;;;;:::o;42364:640::-;42559:4;42597:3;42586:9;42582:19;42574:27;;42611:71;42679:1;42668:9;42664:17;42655:6;42611:71;:::i;:::-;42692:72;42760:2;42749:9;42745:18;42736:6;42692:72;:::i;:::-;42774;42842:2;42831:9;42827:18;42818:6;42774:72;:::i;:::-;42893:9;42887:4;42883:20;42878:2;42867:9;42863:18;42856:48;42921:76;42992:4;42983:6;42921:76;:::i;:::-;42913:84;;42364:640;;;;;;;:::o;43010:141::-;43066:5;43097:6;43091:13;43082:22;;43113:32;43139:5;43113:32;:::i;:::-;43010:141;;;;:::o;43157:349::-;43226:6;43275:2;43263:9;43254:7;43250:23;43246:32;43243:119;;;43281:79;;:::i;:::-;43243:119;43401:1;43426:63;43481:7;43472:6;43461:9;43457:22;43426:63;:::i;:::-;43416:73;;43372:127;43157:349;;;;:::o;43512:240::-;43652:34;43648:1;43640:6;43636:14;43629:58;43721:23;43716:2;43708:6;43704:15;43697:48;43512:240;:::o;43758:366::-;43900:3;43921:67;43985:2;43980:3;43921:67;:::i;:::-;43914:74;;43997:93;44086:3;43997:93;:::i;:::-;44115:2;44110:3;44106:12;44099:19;;43758:366;;;:::o;44130:419::-;44296:4;44334:2;44323:9;44319:18;44311:26;;44383:9;44377:4;44373:20;44369:1;44358:9;44354:17;44347:47;44411:131;44537:4;44411:131;:::i;:::-;44403:139;;44130:419;;;:::o;44555:182::-;44695:34;44691:1;44683:6;44679:14;44672:58;44555:182;:::o;44743:366::-;44885:3;44906:67;44970:2;44965:3;44906:67;:::i;:::-;44899:74;;44982:93;45071:3;44982:93;:::i;:::-;45100:2;45095:3;45091:12;45084:19;;44743:366;;;:::o;45115:419::-;45281:4;45319:2;45308:9;45304:18;45296:26;;45368:9;45362:4;45358:20;45354:1;45343:9;45339:17;45332:47;45396:131;45522:4;45396:131;:::i;:::-;45388:139;;45115:419;;;:::o;45540:178::-;45680:30;45676:1;45668:6;45664:14;45657:54;45540:178;:::o;45724:366::-;45866:3;45887:67;45951:2;45946:3;45887:67;:::i;:::-;45880:74;;45963:93;46052:3;45963:93;:::i;:::-;46081:2;46076:3;46072:12;46065:19;;45724:366;;;:::o;46096:419::-;46262:4;46300:2;46289:9;46285:18;46277:26;;46349:9;46343:4;46339:20;46335:1;46324:9;46320:17;46313:47;46377:131;46503:4;46377:131;:::i;:::-;46369:139;;46096:419;;;:::o;46521:180::-;46569:77;46566:1;46559:88;46666:4;46663:1;46656:15;46690:4;46687:1;46680:15
Swarm Source
ipfs://2768d9b9522ce4c0fa7f5fa0e19afbd44ad0ee2c48e6d2c572cd63c10b5ac337
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.