ERC-721
Overview
Max Total Supply
53 Monty
Holders
24
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MontyLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AdventuresOfMonty
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-03 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/[email protected]/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/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.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 {} /** * @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 {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/[email protected]/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/[email protected]/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: monty.sol pragma solidity ^0.8.9; contract AdventuresOfMonty is ERC721, ERC721Enumerable, ERC721Burnable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; mapping(address => bool) public allowedList; mapping(address => bool) public mintedAllowedList; //Only Public Mint mapping (address => uint256) public mintedPerWallet; uint256 public constant MAX_SUPPLY = 100; //Max supply minted by allowed list mint uint256 public constant MAX_ALLOWED_LIST_MINT = 20; //Max mint per wallet uint256 public constant MAX_MINT = 2; uint256 public allowedListMintCount; bool public revealed; bool public publicMintOpen; uint256 public publicMintPriceETH; string private baseURI; string private notRevealedURI = "ipfs://QmdPo8HDAD6eeCyGzmWtHdRKzo51rzwTfzpJLEnAJj8GWq"; event CrownRegistration(address indexed emisor, uint256 indexed tokenID, string uri, string crwAddress); constructor() ERC721("Adventures of Monty", "Monty") { // Purchase price 0.025 ETH publicMintPriceETH = 25000000000000000; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if(!revealed) { return notRevealedURI; } return super.tokenURI(tokenId); } function mintForAllowedList(address to) public { uint256 tokenId = _tokenIdCounter.current(); require(allowedList[to], "You are not allowed to mint"); require(!mintedAllowedList[to], "You have already minted your token"); require(allowedListMintCount < MAX_ALLOWED_LIST_MINT , "Exceeds MAX_ALLOWED_LIST_MINT"); require(tokenId < MAX_SUPPLY, "Exceeds MAX_SUPPLY"); _tokenIdCounter.increment(); _safeMint(to, tokenId); mintedAllowedList[to] = true; allowedListMintCount++; } function allowMint(address to) external onlyOwner { allowedList[to] = true; } function disallowMint(address to) external onlyOwner { allowedList[to] = false; } function startPublicMinting() external onlyOwner { publicMintOpen = true; } function revealCollection(string memory newBaseUri) external onlyOwner { baseURI = newBaseUri; revealed = true; } function publicMintWithETH(uint256 numNFTs) public payable { require(publicMintOpen, "Public minting has not started"); require(numNFTs > 0, "You must mint at least one NFT"); uint256 tokenId = _tokenIdCounter.current(); require(tokenId + numNFTs <= MAX_SUPPLY, "Exceeds MAX_SUPPLY"); require(mintedPerWallet[msg.sender] + numNFTs <= MAX_MINT, "Exceeds MAX_MINT"); require(msg.value >= publicMintPriceETH * numNFTs, "Insufficient Ether sent for minting"); for (uint256 i = 0; i < numNFTs; i++) { tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); mintedPerWallet[msg.sender] += 1; } } function toCrownSoulBound(uint256 tokenId, string memory crownAddress) public { require(revealed, "Reveal is required to soulbound to Crown"); require(_isApprovedOrOwner(_msgSender(), tokenId), "caller is not token owner or approved"); string memory uri = tokenURI(tokenId); burn(tokenId); emit CrownRegistration(msg.sender, tokenId, uri, crownAddress); } function withdrawETH() public onlyOwner { uint256 contractETHBalance = address(this).balance; require(contractETHBalance > 0, "No ETH to withdraw"); payable(owner()).transfer(contractETHBalance); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
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":"emisor","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"string","name":"crwAddress","type":"string"}],"name":"CrownRegistration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ALLOWED_LIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"allowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedListMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"disallowMint","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":[{"internalType":"address","name":"to","type":"address"}],"name":"mintForAllowedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAllowedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"publicMintWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri","type":"string"}],"name":"revealCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"crownAddress","type":"string"}],"name":"toCrownSoulBound","outputs":[],"stateMutability":"nonpayable","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":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280603581526020016200509d60359139601390816200002e91906200044b565b503480156200003c57600080fd5b506040518060400160405280601381526020017f416476656e7475726573206f66204d6f6e7479000000000000000000000000008152506040518060400160405280600581526020017f4d6f6e74790000000000000000000000000000000000000000000000000000008152508160009081620000ba91906200044b565b508060019081620000cc91906200044b565b505050620000ef620000e36200010360201b60201c565b6200010b60201b60201c565b6658d15e1762800060118190555062000532565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200025357607f821691505b6020821081036200026957620002686200020b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000294565b620002df868362000294565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200032c620003266200032084620002f7565b62000301565b620002f7565b9050919050565b6000819050919050565b62000348836200030b565b62000360620003578262000333565b848454620002a1565b825550505050565b600090565b6200037762000368565b620003848184846200033d565b505050565b5b81811015620003ac57620003a06000826200036d565b6001810190506200038a565b5050565b601f821115620003fb57620003c5816200026f565b620003d08462000284565b81016020851015620003e0578190505b620003f8620003ef8562000284565b83018262000389565b50505b505050565b600082821c905092915050565b6000620004206000198460080262000400565b1980831691505092915050565b60006200043b83836200040d565b9150826002028217905092915050565b6200045682620001d1565b67ffffffffffffffff811115620004725762000471620001dc565b5b6200047e82546200023a565b6200048b828285620003b0565b600060209050601f831160018114620004c35760008415620004ae578287015190505b620004ba85826200042d565b8655506200052a565b601f198416620004d3866200026f565b60005b82811015620004fd57848901518255600182019150602085019450602081019050620004d6565b868310156200051d578489015162000519601f8916826200040d565b8355505b6001600288020188555050505b505050505050565b614b5b80620005426000396000f3fe6080604052600436106102255760003560e01c80635fed744a11610123578063a22cb465116100ab578063e086e5ec1161006f578063e086e5ec1461080a578063e411bdf614610821578063e985e9c51461085e578063f0292a031461089b578063f2fde38b146108c657610225565b8063a22cb46514610727578063b88d4fde14610750578063bcc9ca5b14610779578063c486d672146107a4578063c87b56dd146107cd57610225565b8063715018a6116100f2578063715018a6146106665780638da5cb5b1461067d57806395d89b41146106a85780639da058e9146106d3578063a075fbde146106ea57610225565b80635fed744a146105985780636352211e146105c3578063640cff981461060057806370a082311461062957610225565b80632f745c59116101b157806342842e0e1161017557806342842e0e146104b557806342966c68146104de5780634f6ccce71461050757806350179bae14610544578063518302271461056d57610225565b80632f745c59146103bc57806332cb6b0c146103f95780633938aad0146104245780633a602b4d1461044f5780633db782501461048c57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd14610323578063257d735e1461034c5780632614e23c14610375578063267c146a146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130ed565b6108ef565b60405161025e9190613135565b60405180910390f35b34801561027357600080fd5b5061027c610901565b60405161028991906131e0565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613238565b610993565b6040516102c691906132a6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132ed565b6109d9565b005b34801561030457600080fd5b5061030d610af0565b60405161031a919061333c565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613357565b610afd565b005b34801561035857600080fd5b50610373600480360381019061036e91906133aa565b610b5d565b005b34801561038157600080fd5b5061038a610d94565b604051610397919061333c565b60405180910390f35b6103ba60048036038101906103b59190613238565b610d9a565b005b3480156103c857600080fd5b506103e360048036038101906103de91906132ed565b611001565b6040516103f0919061333c565b60405180910390f35b34801561040557600080fd5b5061040e6110a6565b60405161041b919061333c565b60405180910390f35b34801561043057600080fd5b506104396110ab565b604051610446919061333c565b60405180910390f35b34801561045b57600080fd5b50610476600480360381019061047191906133aa565b6110b1565b604051610483919061333c565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae91906133aa565b6110c9565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613357565b61112c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613238565b61114c565b005b34801561051357600080fd5b5061052e60048036038101906105299190613238565b6111a8565b60405161053b919061333c565b60405180910390f35b34801561055057600080fd5b5061056b6004803603810190610566919061350c565b611219565b005b34801561057957600080fd5b5061058261124f565b60405161058f9190613135565b60405180910390f35b3480156105a457600080fd5b506105ad611262565b6040516105ba919061333c565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613238565b611267565b6040516105f791906132a6565b60405180910390f35b34801561060c57600080fd5b50610627600480360381019061062291906133aa565b6112ed565b005b34801561063557600080fd5b50610650600480360381019061064b91906133aa565b611350565b60405161065d919061333c565b60405180910390f35b34801561067257600080fd5b5061067b611407565b005b34801561068957600080fd5b5061069261141b565b60405161069f91906132a6565b60405180910390f35b3480156106b457600080fd5b506106bd611445565b6040516106ca91906131e0565b60405180910390f35b3480156106df57600080fd5b506106e86114d7565b005b3480156106f657600080fd5b50610711600480360381019061070c91906133aa565b6114fc565b60405161071e9190613135565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613581565b61151c565b005b34801561075c57600080fd5b5061077760048036038101906107729190613662565b611532565b005b34801561078557600080fd5b5061078e611594565b60405161079b9190613135565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c691906136e5565b6115a7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613238565b6116b2565b60405161080191906131e0565b60405180910390f35b34801561081657600080fd5b5061081f61176b565b005b34801561082d57600080fd5b50610848600480360381019061084391906133aa565b61180c565b6040516108559190613135565b60405180910390f35b34801561086a57600080fd5b5061088560048036038101906108809190613741565b61182c565b6040516108929190613135565b60405180910390f35b3480156108a757600080fd5b506108b06118c0565b6040516108bd919061333c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906133aa565b6118c5565b005b60006108fa82611948565b9050919050565b606060008054610910906137b0565b80601f016020809104026020016040519081016040528092919081815260200182805461093c906137b0565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e826119c2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e482611267565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90613853565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a73611a0d565b73ffffffffffffffffffffffffffffffffffffffff161480610aa25750610aa181610a9c611a0d565b61182c565b5b610ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad8906138e5565b60405180910390fd5b610aeb8383611a15565b505050565b6000600880549050905090565b610b0e610b08611a0d565b82611ace565b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490613977565b60405180910390fd5b610b58838383611b63565b505050565b6000610b69600b611e5c565b9050600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee906139e3565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613a75565b60405180910390fd5b6014600f5410610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090613ae1565b60405180910390fd5b60648110610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613b4d565b60405180910390fd5b610d16600b611e6a565b610d208282611e80565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190610d8b90613b9c565b91905055505050565b600f5481565b601060019054906101000a900460ff16610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090613c30565b60405180910390fd5b60008111610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613c9c565b60405180910390fd5b6000610e38600b611e5c565b905060648282610e489190613cbc565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613b4d565b60405180910390fd5b600282600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed69190613cbc565b1115610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613d3c565b60405180910390fd5b81601154610f259190613d5c565b341015610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90613e10565b60405180910390fd5b60005b82811015610ffc57610f7c600b611e5c565b9150610f88600b611e6a565b610f923383611e80565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe29190613cbc565b925050819055508080610ff490613b9c565b915050610f6a565b505050565b600061100c83611350565b821061104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490613ea2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b60115481565b600e6020528060005260406000206000915090505481565b6110d1611e9e565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61114783838360405180602001604052806000815250611532565b505050565b61115d611157611a0d565b82611ace565b61119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613977565b60405180910390fd5b6111a581611f1c565b50565b60006111b2610af0565b82106111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613f34565b60405180910390fd5b6008828154811061120757611206613f54565b5b90600052602060002001549050919050565b611221611e9e565b8060129081611230919061412f565b506001601060006101000a81548160ff02191690831515021790555050565b601060009054906101000a900460ff1681565b601481565b6000806112738361206a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061424d565b60405180910390fd5b80915050919050565b6112f5611e9e565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b7906142df565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61140f611e9e565b61141960006120a7565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611454906137b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611480906137b0565b80156114cd5780601f106114a2576101008083540402835291602001916114cd565b820191906000526020600020905b8154815290600101906020018083116114b057829003601f168201915b5050505050905090565b6114df611e9e565b6001601060016101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b61152e611527611a0d565b838361216d565b5050565b61154361153d611a0d565b83611ace565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613977565b60405180910390fd5b61158e848484846122d9565b50505050565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff166115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90614371565b60405180910390fd5b611607611601611a0d565b83611ace565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614403565b60405180910390fd5b6000611651836116b2565b905061165c8361114c565b823373ffffffffffffffffffffffffffffffffffffffff167f32abe70a521c5c3431eb1ac5dfd23738bae8e0a25afde8918617300bb9c379ca83856040516116a5929190614423565b60405180910390a3505050565b6060601060009054906101000a900460ff1661175a57601380546116d5906137b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611701906137b0565b801561174e5780601f106117235761010080835404028352916020019161174e565b820191906000526020600020905b81548152906001019060200180831161173157829003601f168201915b50505050509050611766565b61176382612335565b90505b919050565b611773611e9e565b6000479050600081116117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906144a6565b60405180910390fd5b6117c361141b565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611808573d6000803e3d6000fd5b5050565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600281565b6118cd611e9e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614538565b60405180910390fd5b611945816120a7565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119bb57506119ba8261239d565b5b9050919050565b6119cb8161247f565b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a019061424d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a8883611267565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ada83611267565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c5750611b1b818561182c565b5b80611b5a57508373ffffffffffffffffffffffffffffffffffffffff16611b4284610993565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382611267565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd0906145ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f9061465c565b60405180910390fd5b611c5583838360016124c0565b8273ffffffffffffffffffffffffffffffffffffffff16611c7582611267565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc2906145ca565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5783838360016124d2565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611e9a8282604051806020016040528060008152506124d8565b5050565b611ea6611a0d565b73ffffffffffffffffffffffffffffffffffffffff16611ec461141b565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906146c8565b60405180910390fd5b565b6000611f2782611267565b9050611f378160008460016124c0565b611f4082611267565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120668160008460016124d2565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614734565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122cc9190613135565b60405180910390a3505050565b6122e4848484611b63565b6122f084848484612533565b61232f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612326906147c6565b60405180910390fd5b50505050565b6060612340826119c2565b600061234a6126ba565b9050600081511161236a5760405180602001604052806000815250612395565b806123748461274c565b604051602001612385929190614822565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061247857506124778261281a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166124a18361206a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124cc84848484612884565b50505050565b50505050565b6124e283836129e2565b6124ef6000848484612533565b61252e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612525906147c6565b60405180910390fd5b505050565b60006125548473ffffffffffffffffffffffffffffffffffffffff16612bff565b156126ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261257d611a0d565b8786866040518563ffffffff1660e01b815260040161259f949392919061489b565b6020604051808303816000875af19250505080156125db57506040513d601f19601f820116820180604052508101906125d891906148fc565b60015b61265d573d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b506000815103612655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264c906147c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126b2565b600190505b949350505050565b6060601280546126c9906137b0565b80601f01602080910402602001604051908101604052809291908181526020018280546126f5906137b0565b80156127425780601f1061271757610100808354040283529160200191612742565b820191906000526020600020905b81548152906001019060200180831161272557829003601f168201915b5050505050905090565b60606000600161275b84612c22565b01905060008167ffffffffffffffff81111561277a576127796133e1565b5b6040519080825280601f01601f1916602001820160405280156127ac5781602001600182028036833780820191505090505b509050600082602001820190505b60011561280f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280357612802614929565b5b049450600085036127ba575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289084848484612d75565b60018111156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906149ca565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361291b5761291681612d7b565b61295a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612959576129588582612dc4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361299c5761299781612f31565b6129db565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146129da576129d98482613002565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614a36565b60405180910390fd5b612a5a8161247f565b15612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614aa2565b60405180910390fd5b612aa86000838360016124c0565b612ab18161247f565b15612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae890614aa2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfb6000838360016124d2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612c80577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612c7657612c75614929565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612cbd576d04ee2d6d415b85acef81000000008381612cb357612cb2614929565b5b0492506020810190505b662386f26fc100008310612cec57662386f26fc100008381612ce257612ce1614929565b5b0492506010810190505b6305f5e1008310612d15576305f5e1008381612d0b57612d0a614929565b5b0492506008810190505b6127108310612d3a576127108381612d3057612d2f614929565b5b0492506004810190505b60648310612d5d5760648381612d5357612d52614929565b5b0492506002810190505b600a8310612d6c576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dd184611350565b612ddb9190614ac2565b9050600060076000848152602001908152602001600020549050818114612ec0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f459190614ac2565b9050600060096000848152602001908152602001600020549050600060088381548110612f7557612f74613f54565b5b906000526020600020015490508060088381548110612f9757612f96613f54565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fe657612fe5614af6565b5b6001900381819060005260206000200160009055905550505050565b600061300d83611350565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130ca81613095565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000602082840312156131035761310261308b565b5b6000613111848285016130d8565b91505092915050565b60008115159050919050565b61312f8161311a565b82525050565b600060208201905061314a6000830184613126565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561318a57808201518184015260208101905061316f565b60008484015250505050565b6000601f19601f8301169050919050565b60006131b282613150565b6131bc818561315b565b93506131cc81856020860161316c565b6131d581613196565b840191505092915050565b600060208201905081810360008301526131fa81846131a7565b905092915050565b6000819050919050565b61321581613202565b811461322057600080fd5b50565b6000813590506132328161320c565b92915050565b60006020828403121561324e5761324d61308b565b5b600061325c84828501613223565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061329082613265565b9050919050565b6132a081613285565b82525050565b60006020820190506132bb6000830184613297565b92915050565b6132ca81613285565b81146132d557600080fd5b50565b6000813590506132e7816132c1565b92915050565b600080604083850312156133045761330361308b565b5b6000613312858286016132d8565b925050602061332385828601613223565b9150509250929050565b61333681613202565b82525050565b6000602082019050613351600083018461332d565b92915050565b6000806000606084860312156133705761336f61308b565b5b600061337e868287016132d8565b935050602061338f868287016132d8565b92505060406133a086828701613223565b9150509250925092565b6000602082840312156133c0576133bf61308b565b5b60006133ce848285016132d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61341982613196565b810181811067ffffffffffffffff82111715613438576134376133e1565b5b80604052505050565b600061344b613081565b90506134578282613410565b919050565b600067ffffffffffffffff821115613477576134766133e1565b5b61348082613196565b9050602081019050919050565b82818337600083830152505050565b60006134af6134aa8461345c565b613441565b9050828152602081018484840111156134cb576134ca6133dc565b5b6134d684828561348d565b509392505050565b600082601f8301126134f3576134f26133d7565b5b813561350384826020860161349c565b91505092915050565b6000602082840312156135225761352161308b565b5b600082013567ffffffffffffffff8111156135405761353f613090565b5b61354c848285016134de565b91505092915050565b61355e8161311a565b811461356957600080fd5b50565b60008135905061357b81613555565b92915050565b600080604083850312156135985761359761308b565b5b60006135a6858286016132d8565b92505060206135b78582860161356c565b9150509250929050565b600067ffffffffffffffff8211156135dc576135db6133e1565b5b6135e582613196565b9050602081019050919050565b6000613605613600846135c1565b613441565b905082815260208101848484011115613621576136206133dc565b5b61362c84828561348d565b509392505050565b600082601f830112613649576136486133d7565b5b81356136598482602086016135f2565b91505092915050565b6000806000806080858703121561367c5761367b61308b565b5b600061368a878288016132d8565b945050602061369b878288016132d8565b93505060406136ac87828801613223565b925050606085013567ffffffffffffffff8111156136cd576136cc613090565b5b6136d987828801613634565b91505092959194509250565b600080604083850312156136fc576136fb61308b565b5b600061370a85828601613223565b925050602083013567ffffffffffffffff81111561372b5761372a613090565b5b613737858286016134de565b9150509250929050565b600080604083850312156137585761375761308b565b5b6000613766858286016132d8565b9250506020613777858286016132d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137c857607f821691505b6020821081036137db576137da613781565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061383d60218361315b565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006138cf603d8361315b565b91506138da82613873565b604082019050919050565b600060208201905081810360008301526138fe816138c2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613961602d8361315b565b915061396c82613905565b604082019050919050565b6000602082019050818103600083015261399081613954565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e740000000000600082015250565b60006139cd601b8361315b565b91506139d882613997565b602082019050919050565b600060208201905081810360008301526139fc816139c0565b9050919050565b7f596f75206861766520616c7265616479206d696e74656420796f757220746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5f60228361315b565b9150613a6a82613a03565b604082019050919050565b60006020820190508181036000830152613a8e81613a52565b9050919050565b7f45786365656473204d41585f414c4c4f5745445f4c4953545f4d494e54000000600082015250565b6000613acb601d8361315b565b9150613ad682613a95565b602082019050919050565b60006020820190508181036000830152613afa81613abe565b9050919050565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b6000613b3760128361315b565b9150613b4282613b01565b602082019050919050565b60006020820190508181036000830152613b6681613b2a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ba782613202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd957613bd8613b6d565b5b600182019050919050565b7f5075626c6963206d696e74696e6720686173206e6f7420737461727465640000600082015250565b6000613c1a601e8361315b565b9150613c2582613be4565b602082019050919050565b60006020820190508181036000830152613c4981613c0d565b9050919050565b7f596f75206d757374206d696e74206174206c65617374206f6e65204e46540000600082015250565b6000613c86601e8361315b565b9150613c9182613c50565b602082019050919050565b60006020820190508181036000830152613cb581613c79565b9050919050565b6000613cc782613202565b9150613cd283613202565b9250828201905080821115613cea57613ce9613b6d565b5b92915050565b7f45786365656473204d41585f4d494e5400000000000000000000000000000000600082015250565b6000613d2660108361315b565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b6000613d6782613202565b9150613d7283613202565b9250828202613d8081613202565b91508282048414831517613d9757613d96613b6d565b5b5092915050565b7f496e73756666696369656e742045746865722073656e7420666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b6000613dfa60238361315b565b9150613e0582613d9e565b604082019050919050565b60006020820190508181036000830152613e2981613ded565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e8c602b8361315b565b9150613e9782613e30565b604082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f1e602c8361315b565b9150613f2982613ec2565b604082019050919050565b60006020820190508181036000830152613f4d81613f11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613fe57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fa8565b613fef8683613fa8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061402c61402761402284613202565b614007565b613202565b9050919050565b6000819050919050565b61404683614011565b61405a61405282614033565b848454613fb5565b825550505050565b600090565b61406f614062565b61407a81848461403d565b505050565b5b8181101561409e57614093600082614067565b600181019050614080565b5050565b601f8211156140e3576140b481613f83565b6140bd84613f98565b810160208510156140cc578190505b6140e06140d885613f98565b83018261407f565b50505b505050565b600082821c905092915050565b6000614106600019846008026140e8565b1980831691505092915050565b600061411f83836140f5565b9150826002028217905092915050565b61413882613150565b67ffffffffffffffff811115614151576141506133e1565b5b61415b82546137b0565b6141668282856140a2565b600060209050601f8311600181146141995760008415614187578287015190505b6141918582614113565b8655506141f9565b601f1984166141a786613f83565b60005b828110156141cf578489015182556001820191506020850194506020810190506141aa565b868310156141ec57848901516141e8601f8916826140f5565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061423760188361315b565b915061424282614201565b602082019050919050565b600060208201905081810360008301526142668161422a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006142c960298361315b565b91506142d48261426d565b604082019050919050565b600060208201905081810360008301526142f8816142bc565b9050919050565b7f52657665616c20697320726571756972656420746f20736f756c626f756e642060008201527f746f2043726f776e000000000000000000000000000000000000000000000000602082015250565b600061435b60288361315b565b9150614366826142ff565b604082019050919050565b6000602082019050818103600083015261438a8161434e565b9050919050565b7f63616c6c6572206973206e6f7420746f6b656e206f776e6572206f722061707060008201527f726f766564000000000000000000000000000000000000000000000000000000602082015250565b60006143ed60258361315b565b91506143f882614391565b604082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b6000604082019050818103600083015261443d81856131a7565b9050818103602083015261445181846131a7565b90509392505050565b7f4e6f2045544820746f2077697468647261770000000000000000000000000000600082015250565b600061449060128361315b565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061452260268361315b565b915061452d826144c6565b604082019050919050565b6000602082019050818103600083015261455181614515565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006145b460258361315b565b91506145bf82614558565b604082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061464660248361315b565b9150614651826145ea565b604082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146b260208361315b565b91506146bd8261467c565b602082019050919050565b600060208201905081810360008301526146e1816146a5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061471e60198361315b565b9150614729826146e8565b602082019050919050565b6000602082019050818103600083015261474d81614711565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147b060328361315b565b91506147bb82614754565b604082019050919050565b600060208201905081810360008301526147df816147a3565b9050919050565b600081905092915050565b60006147fc82613150565b61480681856147e6565b935061481681856020860161316c565b80840191505092915050565b600061482e82856147f1565b915061483a82846147f1565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061486d82614846565b6148778185614851565b935061488781856020860161316c565b61489081613196565b840191505092915050565b60006080820190506148b06000830187613297565b6148bd6020830186613297565b6148ca604083018561332d565b81810360608301526148dc8184614862565b905095945050505050565b6000815190506148f6816130c1565b92915050565b6000602082840312156149125761491161308b565b5b6000614920848285016148e7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006149b460358361315b565b91506149bf82614958565b604082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a2060208361315b565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8c601c8361315b565b9150614a9782614a56565b602082019050919050565b60006020820190508181036000830152614abb81614a7f565b9050919050565b6000614acd82613202565b9150614ad883613202565b9250828203905081811115614af057614aef613b6d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207f800ee76616a6ac5a864cbcb7db18aecd3907d091578ff08177ebd32b920e7364736f6c63430008130033697066733a2f2f516d64506f38484441443665654379477a6d57744864524b7a6f3531727a7754667a704a4c456e414a6a38475771
Deployed Bytecode
0x6080604052600436106102255760003560e01c80635fed744a11610123578063a22cb465116100ab578063e086e5ec1161006f578063e086e5ec1461080a578063e411bdf614610821578063e985e9c51461085e578063f0292a031461089b578063f2fde38b146108c657610225565b8063a22cb46514610727578063b88d4fde14610750578063bcc9ca5b14610779578063c486d672146107a4578063c87b56dd146107cd57610225565b8063715018a6116100f2578063715018a6146106665780638da5cb5b1461067d57806395d89b41146106a85780639da058e9146106d3578063a075fbde146106ea57610225565b80635fed744a146105985780636352211e146105c3578063640cff981461060057806370a082311461062957610225565b80632f745c59116101b157806342842e0e1161017557806342842e0e146104b557806342966c68146104de5780634f6ccce71461050757806350179bae14610544578063518302271461056d57610225565b80632f745c59146103bc57806332cb6b0c146103f95780633938aad0146104245780633a602b4d1461044f5780633db782501461048c57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd14610323578063257d735e1461034c5780632614e23c14610375578063267c146a146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130ed565b6108ef565b60405161025e9190613135565b60405180910390f35b34801561027357600080fd5b5061027c610901565b60405161028991906131e0565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613238565b610993565b6040516102c691906132a6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132ed565b6109d9565b005b34801561030457600080fd5b5061030d610af0565b60405161031a919061333c565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613357565b610afd565b005b34801561035857600080fd5b50610373600480360381019061036e91906133aa565b610b5d565b005b34801561038157600080fd5b5061038a610d94565b604051610397919061333c565b60405180910390f35b6103ba60048036038101906103b59190613238565b610d9a565b005b3480156103c857600080fd5b506103e360048036038101906103de91906132ed565b611001565b6040516103f0919061333c565b60405180910390f35b34801561040557600080fd5b5061040e6110a6565b60405161041b919061333c565b60405180910390f35b34801561043057600080fd5b506104396110ab565b604051610446919061333c565b60405180910390f35b34801561045b57600080fd5b50610476600480360381019061047191906133aa565b6110b1565b604051610483919061333c565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae91906133aa565b6110c9565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613357565b61112c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613238565b61114c565b005b34801561051357600080fd5b5061052e60048036038101906105299190613238565b6111a8565b60405161053b919061333c565b60405180910390f35b34801561055057600080fd5b5061056b6004803603810190610566919061350c565b611219565b005b34801561057957600080fd5b5061058261124f565b60405161058f9190613135565b60405180910390f35b3480156105a457600080fd5b506105ad611262565b6040516105ba919061333c565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613238565b611267565b6040516105f791906132a6565b60405180910390f35b34801561060c57600080fd5b50610627600480360381019061062291906133aa565b6112ed565b005b34801561063557600080fd5b50610650600480360381019061064b91906133aa565b611350565b60405161065d919061333c565b60405180910390f35b34801561067257600080fd5b5061067b611407565b005b34801561068957600080fd5b5061069261141b565b60405161069f91906132a6565b60405180910390f35b3480156106b457600080fd5b506106bd611445565b6040516106ca91906131e0565b60405180910390f35b3480156106df57600080fd5b506106e86114d7565b005b3480156106f657600080fd5b50610711600480360381019061070c91906133aa565b6114fc565b60405161071e9190613135565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613581565b61151c565b005b34801561075c57600080fd5b5061077760048036038101906107729190613662565b611532565b005b34801561078557600080fd5b5061078e611594565b60405161079b9190613135565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c691906136e5565b6115a7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613238565b6116b2565b60405161080191906131e0565b60405180910390f35b34801561081657600080fd5b5061081f61176b565b005b34801561082d57600080fd5b50610848600480360381019061084391906133aa565b61180c565b6040516108559190613135565b60405180910390f35b34801561086a57600080fd5b5061088560048036038101906108809190613741565b61182c565b6040516108929190613135565b60405180910390f35b3480156108a757600080fd5b506108b06118c0565b6040516108bd919061333c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906133aa565b6118c5565b005b60006108fa82611948565b9050919050565b606060008054610910906137b0565b80601f016020809104026020016040519081016040528092919081815260200182805461093c906137b0565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e826119c2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e482611267565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90613853565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a73611a0d565b73ffffffffffffffffffffffffffffffffffffffff161480610aa25750610aa181610a9c611a0d565b61182c565b5b610ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad8906138e5565b60405180910390fd5b610aeb8383611a15565b505050565b6000600880549050905090565b610b0e610b08611a0d565b82611ace565b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490613977565b60405180910390fd5b610b58838383611b63565b505050565b6000610b69600b611e5c565b9050600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee906139e3565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613a75565b60405180910390fd5b6014600f5410610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090613ae1565b60405180910390fd5b60648110610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613b4d565b60405180910390fd5b610d16600b611e6a565b610d208282611e80565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190610d8b90613b9c565b91905055505050565b600f5481565b601060019054906101000a900460ff16610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090613c30565b60405180910390fd5b60008111610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613c9c565b60405180910390fd5b6000610e38600b611e5c565b905060648282610e489190613cbc565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613b4d565b60405180910390fd5b600282600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed69190613cbc565b1115610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613d3c565b60405180910390fd5b81601154610f259190613d5c565b341015610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90613e10565b60405180910390fd5b60005b82811015610ffc57610f7c600b611e5c565b9150610f88600b611e6a565b610f923383611e80565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe29190613cbc565b925050819055508080610ff490613b9c565b915050610f6a565b505050565b600061100c83611350565b821061104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490613ea2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b60115481565b600e6020528060005260406000206000915090505481565b6110d1611e9e565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61114783838360405180602001604052806000815250611532565b505050565b61115d611157611a0d565b82611ace565b61119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613977565b60405180910390fd5b6111a581611f1c565b50565b60006111b2610af0565b82106111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613f34565b60405180910390fd5b6008828154811061120757611206613f54565b5b90600052602060002001549050919050565b611221611e9e565b8060129081611230919061412f565b506001601060006101000a81548160ff02191690831515021790555050565b601060009054906101000a900460ff1681565b601481565b6000806112738361206a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061424d565b60405180910390fd5b80915050919050565b6112f5611e9e565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b7906142df565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61140f611e9e565b61141960006120a7565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611454906137b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611480906137b0565b80156114cd5780601f106114a2576101008083540402835291602001916114cd565b820191906000526020600020905b8154815290600101906020018083116114b057829003601f168201915b5050505050905090565b6114df611e9e565b6001601060016101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b61152e611527611a0d565b838361216d565b5050565b61154361153d611a0d565b83611ace565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613977565b60405180910390fd5b61158e848484846122d9565b50505050565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff166115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90614371565b60405180910390fd5b611607611601611a0d565b83611ace565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614403565b60405180910390fd5b6000611651836116b2565b905061165c8361114c565b823373ffffffffffffffffffffffffffffffffffffffff167f32abe70a521c5c3431eb1ac5dfd23738bae8e0a25afde8918617300bb9c379ca83856040516116a5929190614423565b60405180910390a3505050565b6060601060009054906101000a900460ff1661175a57601380546116d5906137b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611701906137b0565b801561174e5780601f106117235761010080835404028352916020019161174e565b820191906000526020600020905b81548152906001019060200180831161173157829003601f168201915b50505050509050611766565b61176382612335565b90505b919050565b611773611e9e565b6000479050600081116117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906144a6565b60405180910390fd5b6117c361141b565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611808573d6000803e3d6000fd5b5050565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600281565b6118cd611e9e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614538565b60405180910390fd5b611945816120a7565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119bb57506119ba8261239d565b5b9050919050565b6119cb8161247f565b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a019061424d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a8883611267565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ada83611267565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c5750611b1b818561182c565b5b80611b5a57508373ffffffffffffffffffffffffffffffffffffffff16611b4284610993565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382611267565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd0906145ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f9061465c565b60405180910390fd5b611c5583838360016124c0565b8273ffffffffffffffffffffffffffffffffffffffff16611c7582611267565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc2906145ca565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5783838360016124d2565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611e9a8282604051806020016040528060008152506124d8565b5050565b611ea6611a0d565b73ffffffffffffffffffffffffffffffffffffffff16611ec461141b565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906146c8565b60405180910390fd5b565b6000611f2782611267565b9050611f378160008460016124c0565b611f4082611267565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120668160008460016124d2565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614734565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122cc9190613135565b60405180910390a3505050565b6122e4848484611b63565b6122f084848484612533565b61232f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612326906147c6565b60405180910390fd5b50505050565b6060612340826119c2565b600061234a6126ba565b9050600081511161236a5760405180602001604052806000815250612395565b806123748461274c565b604051602001612385929190614822565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061247857506124778261281a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166124a18361206a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124cc84848484612884565b50505050565b50505050565b6124e283836129e2565b6124ef6000848484612533565b61252e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612525906147c6565b60405180910390fd5b505050565b60006125548473ffffffffffffffffffffffffffffffffffffffff16612bff565b156126ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261257d611a0d565b8786866040518563ffffffff1660e01b815260040161259f949392919061489b565b6020604051808303816000875af19250505080156125db57506040513d601f19601f820116820180604052508101906125d891906148fc565b60015b61265d573d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b506000815103612655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264c906147c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126b2565b600190505b949350505050565b6060601280546126c9906137b0565b80601f01602080910402602001604051908101604052809291908181526020018280546126f5906137b0565b80156127425780601f1061271757610100808354040283529160200191612742565b820191906000526020600020905b81548152906001019060200180831161272557829003601f168201915b5050505050905090565b60606000600161275b84612c22565b01905060008167ffffffffffffffff81111561277a576127796133e1565b5b6040519080825280601f01601f1916602001820160405280156127ac5781602001600182028036833780820191505090505b509050600082602001820190505b60011561280f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280357612802614929565b5b049450600085036127ba575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289084848484612d75565b60018111156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906149ca565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361291b5761291681612d7b565b61295a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612959576129588582612dc4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361299c5761299781612f31565b6129db565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146129da576129d98482613002565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614a36565b60405180910390fd5b612a5a8161247f565b15612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614aa2565b60405180910390fd5b612aa86000838360016124c0565b612ab18161247f565b15612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae890614aa2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfb6000838360016124d2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612c80577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612c7657612c75614929565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612cbd576d04ee2d6d415b85acef81000000008381612cb357612cb2614929565b5b0492506020810190505b662386f26fc100008310612cec57662386f26fc100008381612ce257612ce1614929565b5b0492506010810190505b6305f5e1008310612d15576305f5e1008381612d0b57612d0a614929565b5b0492506008810190505b6127108310612d3a576127108381612d3057612d2f614929565b5b0492506004810190505b60648310612d5d5760648381612d5357612d52614929565b5b0492506002810190505b600a8310612d6c576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dd184611350565b612ddb9190614ac2565b9050600060076000848152602001908152602001600020549050818114612ec0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f459190614ac2565b9050600060096000848152602001908152602001600020549050600060088381548110612f7557612f74613f54565b5b906000526020600020015490508060088381548110612f9757612f96613f54565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fe657612fe5614af6565b5b6001900381819060005260206000200160009055905550505050565b600061300d83611350565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130ca81613095565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000602082840312156131035761310261308b565b5b6000613111848285016130d8565b91505092915050565b60008115159050919050565b61312f8161311a565b82525050565b600060208201905061314a6000830184613126565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561318a57808201518184015260208101905061316f565b60008484015250505050565b6000601f19601f8301169050919050565b60006131b282613150565b6131bc818561315b565b93506131cc81856020860161316c565b6131d581613196565b840191505092915050565b600060208201905081810360008301526131fa81846131a7565b905092915050565b6000819050919050565b61321581613202565b811461322057600080fd5b50565b6000813590506132328161320c565b92915050565b60006020828403121561324e5761324d61308b565b5b600061325c84828501613223565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061329082613265565b9050919050565b6132a081613285565b82525050565b60006020820190506132bb6000830184613297565b92915050565b6132ca81613285565b81146132d557600080fd5b50565b6000813590506132e7816132c1565b92915050565b600080604083850312156133045761330361308b565b5b6000613312858286016132d8565b925050602061332385828601613223565b9150509250929050565b61333681613202565b82525050565b6000602082019050613351600083018461332d565b92915050565b6000806000606084860312156133705761336f61308b565b5b600061337e868287016132d8565b935050602061338f868287016132d8565b92505060406133a086828701613223565b9150509250925092565b6000602082840312156133c0576133bf61308b565b5b60006133ce848285016132d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61341982613196565b810181811067ffffffffffffffff82111715613438576134376133e1565b5b80604052505050565b600061344b613081565b90506134578282613410565b919050565b600067ffffffffffffffff821115613477576134766133e1565b5b61348082613196565b9050602081019050919050565b82818337600083830152505050565b60006134af6134aa8461345c565b613441565b9050828152602081018484840111156134cb576134ca6133dc565b5b6134d684828561348d565b509392505050565b600082601f8301126134f3576134f26133d7565b5b813561350384826020860161349c565b91505092915050565b6000602082840312156135225761352161308b565b5b600082013567ffffffffffffffff8111156135405761353f613090565b5b61354c848285016134de565b91505092915050565b61355e8161311a565b811461356957600080fd5b50565b60008135905061357b81613555565b92915050565b600080604083850312156135985761359761308b565b5b60006135a6858286016132d8565b92505060206135b78582860161356c565b9150509250929050565b600067ffffffffffffffff8211156135dc576135db6133e1565b5b6135e582613196565b9050602081019050919050565b6000613605613600846135c1565b613441565b905082815260208101848484011115613621576136206133dc565b5b61362c84828561348d565b509392505050565b600082601f830112613649576136486133d7565b5b81356136598482602086016135f2565b91505092915050565b6000806000806080858703121561367c5761367b61308b565b5b600061368a878288016132d8565b945050602061369b878288016132d8565b93505060406136ac87828801613223565b925050606085013567ffffffffffffffff8111156136cd576136cc613090565b5b6136d987828801613634565b91505092959194509250565b600080604083850312156136fc576136fb61308b565b5b600061370a85828601613223565b925050602083013567ffffffffffffffff81111561372b5761372a613090565b5b613737858286016134de565b9150509250929050565b600080604083850312156137585761375761308b565b5b6000613766858286016132d8565b9250506020613777858286016132d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137c857607f821691505b6020821081036137db576137da613781565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061383d60218361315b565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006138cf603d8361315b565b91506138da82613873565b604082019050919050565b600060208201905081810360008301526138fe816138c2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613961602d8361315b565b915061396c82613905565b604082019050919050565b6000602082019050818103600083015261399081613954565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e740000000000600082015250565b60006139cd601b8361315b565b91506139d882613997565b602082019050919050565b600060208201905081810360008301526139fc816139c0565b9050919050565b7f596f75206861766520616c7265616479206d696e74656420796f757220746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5f60228361315b565b9150613a6a82613a03565b604082019050919050565b60006020820190508181036000830152613a8e81613a52565b9050919050565b7f45786365656473204d41585f414c4c4f5745445f4c4953545f4d494e54000000600082015250565b6000613acb601d8361315b565b9150613ad682613a95565b602082019050919050565b60006020820190508181036000830152613afa81613abe565b9050919050565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b6000613b3760128361315b565b9150613b4282613b01565b602082019050919050565b60006020820190508181036000830152613b6681613b2a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ba782613202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd957613bd8613b6d565b5b600182019050919050565b7f5075626c6963206d696e74696e6720686173206e6f7420737461727465640000600082015250565b6000613c1a601e8361315b565b9150613c2582613be4565b602082019050919050565b60006020820190508181036000830152613c4981613c0d565b9050919050565b7f596f75206d757374206d696e74206174206c65617374206f6e65204e46540000600082015250565b6000613c86601e8361315b565b9150613c9182613c50565b602082019050919050565b60006020820190508181036000830152613cb581613c79565b9050919050565b6000613cc782613202565b9150613cd283613202565b9250828201905080821115613cea57613ce9613b6d565b5b92915050565b7f45786365656473204d41585f4d494e5400000000000000000000000000000000600082015250565b6000613d2660108361315b565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b6000613d6782613202565b9150613d7283613202565b9250828202613d8081613202565b91508282048414831517613d9757613d96613b6d565b5b5092915050565b7f496e73756666696369656e742045746865722073656e7420666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b6000613dfa60238361315b565b9150613e0582613d9e565b604082019050919050565b60006020820190508181036000830152613e2981613ded565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e8c602b8361315b565b9150613e9782613e30565b604082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f1e602c8361315b565b9150613f2982613ec2565b604082019050919050565b60006020820190508181036000830152613f4d81613f11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613fe57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fa8565b613fef8683613fa8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061402c61402761402284613202565b614007565b613202565b9050919050565b6000819050919050565b61404683614011565b61405a61405282614033565b848454613fb5565b825550505050565b600090565b61406f614062565b61407a81848461403d565b505050565b5b8181101561409e57614093600082614067565b600181019050614080565b5050565b601f8211156140e3576140b481613f83565b6140bd84613f98565b810160208510156140cc578190505b6140e06140d885613f98565b83018261407f565b50505b505050565b600082821c905092915050565b6000614106600019846008026140e8565b1980831691505092915050565b600061411f83836140f5565b9150826002028217905092915050565b61413882613150565b67ffffffffffffffff811115614151576141506133e1565b5b61415b82546137b0565b6141668282856140a2565b600060209050601f8311600181146141995760008415614187578287015190505b6141918582614113565b8655506141f9565b601f1984166141a786613f83565b60005b828110156141cf578489015182556001820191506020850194506020810190506141aa565b868310156141ec57848901516141e8601f8916826140f5565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061423760188361315b565b915061424282614201565b602082019050919050565b600060208201905081810360008301526142668161422a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006142c960298361315b565b91506142d48261426d565b604082019050919050565b600060208201905081810360008301526142f8816142bc565b9050919050565b7f52657665616c20697320726571756972656420746f20736f756c626f756e642060008201527f746f2043726f776e000000000000000000000000000000000000000000000000602082015250565b600061435b60288361315b565b9150614366826142ff565b604082019050919050565b6000602082019050818103600083015261438a8161434e565b9050919050565b7f63616c6c6572206973206e6f7420746f6b656e206f776e6572206f722061707060008201527f726f766564000000000000000000000000000000000000000000000000000000602082015250565b60006143ed60258361315b565b91506143f882614391565b604082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b6000604082019050818103600083015261443d81856131a7565b9050818103602083015261445181846131a7565b90509392505050565b7f4e6f2045544820746f2077697468647261770000000000000000000000000000600082015250565b600061449060128361315b565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061452260268361315b565b915061452d826144c6565b604082019050919050565b6000602082019050818103600083015261455181614515565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006145b460258361315b565b91506145bf82614558565b604082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061464660248361315b565b9150614651826145ea565b604082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146b260208361315b565b91506146bd8261467c565b602082019050919050565b600060208201905081810360008301526146e1816146a5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061471e60198361315b565b9150614729826146e8565b602082019050919050565b6000602082019050818103600083015261474d81614711565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147b060328361315b565b91506147bb82614754565b604082019050919050565b600060208201905081810360008301526147df816147a3565b9050919050565b600081905092915050565b60006147fc82613150565b61480681856147e6565b935061481681856020860161316c565b80840191505092915050565b600061482e82856147f1565b915061483a82846147f1565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061486d82614846565b6148778185614851565b935061488781856020860161316c565b61489081613196565b840191505092915050565b60006080820190506148b06000830187613297565b6148bd6020830186613297565b6148ca604083018561332d565b81810360608301526148dc8184614862565b905095945050505050565b6000815190506148f6816130c1565b92915050565b6000602082840312156149125761491161308b565b5b6000614920848285016148e7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006149b460358361315b565b91506149bf82614958565b604082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a2060208361315b565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8c601c8361315b565b9150614a9782614a56565b602082019050919050565b60006020820190508181036000830152614abb81614a7f565b9050919050565b6000614acd82613202565b9150614ad883613202565b9250828203905081811115614af057614aef613b6d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207f800ee76616a6ac5a864cbcb7db18aecd3907d091578ff08177ebd32b920e7364736f6c63430008130033
Deployed Bytecode Sourcemap
69903:4417:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74105:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47155:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48667:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48185:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64545:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49367:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71365:558;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70507:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72374:760;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64213:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70283:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70609:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70217:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72030:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49739:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62624:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64735:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72230:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70549:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70378:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46865:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71931:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46596:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24437:103;;;;;;;;;;;;;:::i;:::-;;23796:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47324:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72133:89;;;;;;;;;;;;;:::i;:::-;;70081:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48910:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49961:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70576:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73144:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71156:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73552:231;;;;;;;;;;;;;:::i;:::-;;70133:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49136:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70464:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24695:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74105:212;74244:4;74273:36;74297:11;74273:23;:36::i;:::-;74266:43;;74105:212;;;:::o;47155:100::-;47209:13;47242:5;47235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47155:100;:::o;48667:171::-;48743:7;48763:23;48778:7;48763:14;:23::i;:::-;48806:15;:24;48822:7;48806:24;;;;;;;;;;;;;;;;;;;;;48799:31;;48667:171;;;:::o;48185:416::-;48266:13;48282:23;48297:7;48282:14;:23::i;:::-;48266:39;;48330:5;48324:11;;:2;:11;;;48316:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48424:5;48408:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48433:37;48450:5;48457:12;:10;:12::i;:::-;48433:16;:37::i;:::-;48408:62;48386:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;48572:21;48581:2;48585:7;48572:8;:21::i;:::-;48255:346;48185:416;;:::o;64545:113::-;64606:7;64633:10;:17;;;;64626:24;;64545:113;:::o;49367:301::-;49528:41;49547:12;:10;:12::i;:::-;49561:7;49528:18;:41::i;:::-;49520:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49632:28;49642:4;49648:2;49652:7;49632:9;:28::i;:::-;49367:301;;;:::o;71365:558::-;71423:15;71441:25;:15;:23;:25::i;:::-;71423:43;;71485:11;:15;71497:2;71485:15;;;;;;;;;;;;;;;;;;;;;;;;;71477:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71552:17;:21;71570:2;71552:21;;;;;;;;;;;;;;;;;;;;;;;;;71551:22;71543:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70426:2;71631:20;;:44;71623:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70320:3;71729:7;:20;71721:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;71783:27;:15;:25;:27::i;:::-;71821:22;71831:2;71835:7;71821:9;:22::i;:::-;71878:4;71854:17;:21;71872:2;71854:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;71893:20;;:22;;;;;;;;;:::i;:::-;;;;;;71412:511;71365:558;:::o;70507:35::-;;;;:::o;72374:760::-;72452:14;;;;;;;;;;;72444:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72530:1;72520:7;:11;72512:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;72577:15;72595:25;:15;:23;:25::i;:::-;72577:43;;70320:3;72649:7;72639;:17;;;;:::i;:::-;:31;;72631:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70499:1;72742:7;72712:15;:27;72728:10;72712:27;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:49;;72704:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;72835:7;72814:18;;:28;;;;:::i;:::-;72801:9;:41;;72793:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;72898:9;72893:234;72917:7;72913:1;:11;72893:234;;;72956:25;:15;:23;:25::i;:::-;72946:35;;72996:27;:15;:25;:27::i;:::-;73038:30;73048:10;73060:7;73038:9;:30::i;:::-;73114:1;73083:15;:27;73099:10;73083:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;72926:3;;;;;:::i;:::-;;;;72893:234;;;;72433:701;72374:760;:::o;64213:256::-;64310:7;64346:23;64363:5;64346:16;:23::i;:::-;64338:5;:31;64330:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;64435:12;:19;64448:5;64435:19;;;;;;;;;;;;;;;:26;64455:5;64435:26;;;;;;;;;;;;64428:33;;64213:256;;;;:::o;70283:40::-;70320:3;70283:40;:::o;70609:33::-;;;;:::o;70217:51::-;;;;;;;;;;;;;;;;;:::o;72030:95::-;23682:13;:11;:13::i;:::-;72112:5:::1;72094:11;:15;72106:2;72094:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;72030:95:::0;:::o;49739:151::-;49843:39;49860:4;49866:2;49870:7;49843:39;;;;;;;;;;;;:16;:39::i;:::-;49739:151;;;:::o;62624:242::-;62742:41;62761:12;:10;:12::i;:::-;62775:7;62742:18;:41::i;:::-;62734:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62844:14;62850:7;62844:5;:14::i;:::-;62624:242;:::o;64735:233::-;64810:7;64846:30;:28;:30::i;:::-;64838:5;:38;64830:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64943:10;64954:5;64943:17;;;;;;;;:::i;:::-;;;;;;;;;;64936:24;;64735:233;;;:::o;72230:136::-;23682:13;:11;:13::i;:::-;72322:10:::1;72312:7;:20;;;;;;:::i;:::-;;72354:4;72343:8;;:15;;;;;;;;;;;;;;;;;;72230:136:::0;:::o;70549:20::-;;;;;;;;;;;;;:::o;70378:50::-;70426:2;70378:50;:::o;46865:223::-;46937:7;46957:13;46973:17;46982:7;46973:8;:17::i;:::-;46957:33;;47026:1;47009:19;;:5;:19;;;47001:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47075:5;47068:12;;;46865:223;;;:::o;71931:91::-;23682:13;:11;:13::i;:::-;72010:4:::1;71992:11;:15;72004:2;71992:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;71931:91:::0;:::o;46596:207::-;46668:7;46713:1;46696:19;;:5;:19;;;46688:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46779:9;:16;46789:5;46779:16;;;;;;;;;;;;;;;;46772:23;;46596:207;;;:::o;24437:103::-;23682:13;:11;:13::i;:::-;24502:30:::1;24529:1;24502:18;:30::i;:::-;24437:103::o:0;23796:87::-;23842:7;23869:6;;;;;;;;;;;23862:13;;23796:87;:::o;47324:104::-;47380:13;47413:7;47406:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47324:104;:::o;72133:89::-;23682:13;:11;:13::i;:::-;72210:4:::1;72193:14;;:21;;;;;;;;;;;;;;;;;;72133:89::o:0;70081:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;48910:155::-;49005:52;49024:12;:10;:12::i;:::-;49038:8;49048;49005:18;:52::i;:::-;48910:155;;:::o;49961:279::-;50092:41;50111:12;:10;:12::i;:::-;50125:7;50092:18;:41::i;:::-;50084:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50194:38;50208:4;50214:2;50218:7;50227:4;50194:13;:38::i;:::-;49961:279;;;;:::o;70576:26::-;;;;;;;;;;;;;:::o;73144:400::-;73240:8;;;;;;;;;;;73232:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73311:41;73330:12;:10;:12::i;:::-;73344:7;73311:18;:41::i;:::-;73303:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;73404:17;73424;73433:7;73424:8;:17::i;:::-;73404:37;;73451:13;73456:7;73451:4;:13::i;:::-;73509:7;73497:10;73479:57;;;73518:3;73523:12;73479:57;;;;;;;:::i;:::-;;;;;;;;73222:322;73144:400;;:::o;71156:201::-;71221:13;71251:8;;;;;;;;;;;71247:62;;71283:14;71276:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71247:62;71326:23;71341:7;71326:14;:23::i;:::-;71319:30;;71156:201;;;;:::o;73552:231::-;23682:13;:11;:13::i;:::-;73603:26:::1;73632:21;73603:50;;73693:1;73672:18;:22;73664:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;73738:7;:5;:7::i;:::-;73730:25;;:45;73756:18;73730:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;73592:191;73552:231::o:0;70133:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;49136:164::-;49233:4;49257:18;:25;49276:5;49257:25;;;;;;;;;;;;;;;:35;49283:8;49257:35;;;;;;;;;;;;;;;;;;;;;;;;;49250:42;;49136:164;;;;:::o;70464:36::-;70499:1;70464:36;:::o;24695:201::-;23682:13;:11;:13::i;:::-;24804:1:::1;24784:22;;:8;:22;;::::0;24776:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;24860:28;24879:8;24860:18;:28::i;:::-;24695:201:::0;:::o;63905:224::-;64007:4;64046:35;64031:50;;;:11;:50;;;;:90;;;;64085:36;64109:11;64085:23;:36::i;:::-;64031:90;64024:97;;63905:224;;;:::o;58230:135::-;58312:16;58320:7;58312;:16::i;:::-;58304:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58230:135;:::o;22341:98::-;22394:7;22421:10;22414:17;;22341:98;:::o;57543:174::-;57645:2;57618:15;:24;57634:7;57618:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57701:7;57697:2;57663:46;;57672:23;57687:7;57672:14;:23::i;:::-;57663:46;;;;;;;;;;;;57543:174;;:::o;52230:264::-;52323:4;52340:13;52356:23;52371:7;52356:14;:23::i;:::-;52340:39;;52409:5;52398:16;;:7;:16;;;:52;;;;52418:32;52435:5;52442:7;52418:16;:32::i;:::-;52398:52;:87;;;;52478:7;52454:31;;:20;52466:7;52454:11;:20::i;:::-;:31;;;52398:87;52390:96;;;52230:264;;;;:::o;56195:1229::-;56320:4;56293:31;;:23;56308:7;56293:14;:23::i;:::-;:31;;;56285:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56399:1;56385:16;;:2;:16;;;56377:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56455:42;56476:4;56482:2;56486:7;56495:1;56455:20;:42::i;:::-;56627:4;56600:31;;:23;56615:7;56600:14;:23::i;:::-;:31;;;56592:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56745:15;:24;56761:7;56745:24;;;;;;;;;;;;56738:31;;;;;;;;;;;57240:1;57221:9;:15;57231:4;57221:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;57273:1;57256:9;:13;57266:2;57256:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;57315:2;57296:7;:16;57304:7;57296:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57354:7;57350:2;57335:27;;57344:4;57335:27;;;;;;;;;;;;57375:41;57395:4;57401:2;57405:7;57414:1;57375:19;:41::i;:::-;56195:1229;;;:::o;3723:114::-;3788:7;3815;:14;;;3808:21;;3723:114;;;:::o;3845:127::-;3952:1;3934:7;:14;;;:19;;;;;;;;;;;3845:127;:::o;52836:110::-;52912:26;52922:2;52926:7;52912:26;;;;;;;;;;;;:9;:26::i;:::-;52836:110;;:::o;23961:132::-;24036:12;:10;:12::i;:::-;24025:23;;:7;:5;:7::i;:::-;:23;;;24017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23961:132::o;55075:783::-;55135:13;55151:23;55166:7;55151:14;:23::i;:::-;55135:39;;55187:51;55208:5;55223:1;55227:7;55236:1;55187:20;:51::i;:::-;55351:23;55366:7;55351:14;:23::i;:::-;55343:31;;55422:15;:24;55438:7;55422:24;;;;;;;;;;;;55415:31;;;;;;;;;;;55687:1;55667:9;:16;55677:5;55667:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;55717:7;:16;55725:7;55717:16;;;;;;;;;;;;55710:23;;;;;;;;;;;55779:7;55775:1;55751:36;;55760:5;55751:36;;;;;;;;;;;;55800:50;55820:5;55835:1;55839:7;55848:1;55800:19;:50::i;:::-;55124:734;55075:783;:::o;51505:117::-;51571:7;51598;:16;51606:7;51598:16;;;;;;;;;;;;;;;;;;;;;51591:23;;51505:117;;;:::o;25056:191::-;25130:16;25149:6;;;;;;;;;;;25130:25;;25175:8;25166:6;;:17;;;;;;;;;;;;;;;;;;25230:8;25199:40;;25220:8;25199:40;;;;;;;;;;;;25119:128;25056:191;:::o;57860:281::-;57981:8;57972:17;;:5;:17;;;57964:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58068:8;58030:18;:25;58049:5;58030:25;;;;;;;;;;;;;;;:35;58056:8;58030:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;58114:8;58092:41;;58107:5;58092:41;;;58124:8;58092:41;;;;;;:::i;:::-;;;;;;;;57860:281;;;:::o;51121:270::-;51234:28;51244:4;51250:2;51254:7;51234:9;:28::i;:::-;51281:47;51304:4;51310:2;51314:7;51323:4;51281:22;:47::i;:::-;51273:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;51121:270;;;;:::o;47499:281::-;47572:13;47598:23;47613:7;47598:14;:23::i;:::-;47634:21;47658:10;:8;:10::i;:::-;47634:34;;47710:1;47692:7;47686:21;:25;:86;;;;;;;;;;;;;;;;;47738:7;47747:18;:7;:16;:18::i;:::-;47721:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47686:86;47679:93;;;47499:281;;;:::o;46227:305::-;46329:4;46381:25;46366:40;;;:11;:40;;;;:105;;;;46438:33;46423:48;;;:11;:48;;;;46366:105;:158;;;;46488:36;46512:11;46488:23;:36::i;:::-;46366:158;46346:178;;46227:305;;;:::o;51935:128::-;52000:4;52053:1;52024:31;;:17;52033:7;52024:8;:17::i;:::-;:31;;;;52017:38;;51935:128;;;:::o;73863:234::-;74033:56;74060:4;74066:2;74070:7;74079:9;74033:26;:56::i;:::-;73863:234;;;;:::o;61352:115::-;;;;;:::o;53173:285::-;53268:18;53274:2;53278:7;53268:5;:18::i;:::-;53319:53;53350:1;53354:2;53358:7;53367:4;53319:22;:53::i;:::-;53297:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;53173:285;;;:::o;58929:853::-;59083:4;59104:15;:2;:13;;;:15::i;:::-;59100:675;;;59156:2;59140:36;;;59177:12;:10;:12::i;:::-;59191:4;59197:7;59206:4;59140:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59136:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59398:1;59381:6;:13;:18;59377:328;;59424:60;;;;;;;;;;:::i;:::-;;;;;;;;59377:328;59655:6;59649:13;59640:6;59636:2;59632:15;59625:38;59136:584;59272:41;;;59262:51;;;:6;:51;;;;59255:58;;;;;59100:675;59759:4;59752:11;;58929:853;;;;;;;:::o;71041:100::-;71093:13;71126:7;71119:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71041:100;:::o;19254:716::-;19310:13;19361:14;19398:1;19378:17;19389:5;19378:10;:17::i;:::-;:21;19361:38;;19414:20;19448:6;19437:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19414:41;;19470:11;19599:6;19595:2;19591:15;19583:6;19579:28;19572:35;;19636:288;19643:4;19636:288;;;19668:5;;;;;;;;19810:8;19805:2;19798:5;19794:14;19789:30;19784:3;19776:44;19866:2;19857:11;;;;;;:::i;:::-;;;;;19900:1;19891:5;:10;19636:288;19887:21;19636:288;19945:6;19938:13;;;;;19254:716;;;:::o;37747:157::-;37832:4;37871:25;37856:40;;;:11;:40;;;;37849:47;;37747:157;;;:::o;65042:915::-;65219:61;65246:4;65252:2;65256:12;65270:9;65219:26;:61::i;:::-;65309:1;65297:9;:13;65293:222;;;65440:63;;;;;;;;;;:::i;:::-;;;;;;;;65293:222;65527:15;65545:12;65527:30;;65590:1;65574:18;;:4;:18;;;65570:187;;65609:40;65641:7;65609:31;:40::i;:::-;65570:187;;;65679:2;65671:10;;:4;:10;;;65667:90;;65698:47;65731:4;65737:7;65698:32;:47::i;:::-;65667:90;65570:187;65785:1;65771:16;;:2;:16;;;65767:183;;65804:45;65841:7;65804:36;:45::i;:::-;65767:183;;;65877:4;65871:10;;:2;:10;;;65867:83;;65898:40;65926:2;65930:7;65898:27;:40::i;:::-;65867:83;65767:183;65208:749;65042:915;;;;:::o;53794:942::-;53888:1;53874:16;;:2;:16;;;53866:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53947:16;53955:7;53947;:16::i;:::-;53946:17;53938:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54009:48;54038:1;54042:2;54046:7;54055:1;54009:20;:48::i;:::-;54156:16;54164:7;54156;:16::i;:::-;54155:17;54147:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54571:1;54554:9;:13;54564:2;54554:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54615:2;54596:7;:16;54604:7;54596:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54660:7;54656:2;54635:33;;54652:1;54635:33;;;;;;;;;;;;54681:47;54709:1;54713:2;54717:7;54726:1;54681:19;:47::i;:::-;53794:942;;:::o;26734:326::-;26794:4;27051:1;27029:7;:19;;;:23;27022:30;;26734:326;;;:::o;16082:948::-;16135:7;16155:14;16172:1;16155:18;;16222:8;16213:5;:17;16209:106;;16260:8;16251:17;;;;;;:::i;:::-;;;;;16297:2;16287:12;;;;16209:106;16342:8;16333:5;:17;16329:106;;16380:8;16371:17;;;;;;:::i;:::-;;;;;16417:2;16407:12;;;;16329:106;16462:8;16453:5;:17;16449:106;;16500:8;16491:17;;;;;;:::i;:::-;;;;;16537:2;16527:12;;;;16449:106;16582:7;16573:5;:16;16569:103;;16619:7;16610:16;;;;;;:::i;:::-;;;;;16655:1;16645:11;;;;16569:103;16699:7;16690:5;:16;16686:103;;16736:7;16727:16;;;;;;:::i;:::-;;;;;16772:1;16762:11;;;;16686:103;16816:7;16807:5;:16;16803:103;;16853:7;16844:16;;;;;;:::i;:::-;;;;;16889:1;16879:11;;;;16803:103;16933:7;16924:5;:16;16920:68;;16971:1;16961:11;;;;16920:68;17016:6;17009:13;;;16082:948;;;:::o;60514:116::-;;;;;:::o;66680:164::-;66784:10;:17;;;;66757:15;:24;66773:7;66757:24;;;;;;;;;;;:44;;;;66812:10;66828:7;66812:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66680:164;:::o;67471:988::-;67737:22;67787:1;67762:22;67779:4;67762:16;:22::i;:::-;:26;;;;:::i;:::-;67737:51;;67799:18;67820:17;:26;67838:7;67820:26;;;;;;;;;;;;67799:47;;67967:14;67953:10;:28;67949:328;;67998:19;68020:12;:18;68033:4;68020:18;;;;;;;;;;;;;;;:34;68039:14;68020:34;;;;;;;;;;;;67998:56;;68104:11;68071:12;:18;68084:4;68071:18;;;;;;;;;;;;;;;:30;68090:10;68071:30;;;;;;;;;;;:44;;;;68221:10;68188:17;:30;68206:11;68188:30;;;;;;;;;;;:43;;;;67983:294;67949:328;68373:17;:26;68391:7;68373:26;;;;;;;;;;;68366:33;;;68417:12;:18;68430:4;68417:18;;;;;;;;;;;;;;;:34;68436:14;68417:34;;;;;;;;;;;68410:41;;;67552:907;;67471:988;;:::o;68754:1079::-;69007:22;69052:1;69032:10;:17;;;;:21;;;;:::i;:::-;69007:46;;69064:18;69085:15;:24;69101:7;69085:24;;;;;;;;;;;;69064:45;;69436:19;69458:10;69469:14;69458:26;;;;;;;;:::i;:::-;;;;;;;;;;69436:48;;69522:11;69497:10;69508;69497:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;69633:10;69602:15;:28;69618:11;69602:28;;;;;;;;;;;:41;;;;69774:15;:24;69790:7;69774:24;;;;;;;;;;;69767:31;;;69809:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68825:1008;;;68754:1079;:::o;66258:221::-;66343:14;66360:20;66377:2;66360:16;:20::i;:::-;66343:37;;66418:7;66391:12;:16;66404:2;66391:16;;;;;;;;;;;;;;;:24;66408:6;66391:24;;;;;;;;;;;:34;;;;66465:6;66436:17;:26;66454:7;66436:26;;;;;;;;;;;:35;;;;66332:147;66258:221;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:654::-;11689:6;11697;11746:2;11734:9;11725:7;11721:23;11717:32;11714:119;;;11752:79;;:::i;:::-;11714:119;11872:1;11897:53;11942:7;11933:6;11922:9;11918:22;11897:53;:::i;:::-;11887:63;;11843:117;12027:2;12016:9;12012:18;11999:32;12058:18;12050:6;12047:30;12044:117;;;12080:79;;:::i;:::-;12044:117;12185:63;12240:7;12231:6;12220:9;12216:22;12185:63;:::i;:::-;12175:73;;11970:288;11611:654;;;;;:::o;12271:474::-;12339:6;12347;12396:2;12384:9;12375:7;12371:23;12367:32;12364:119;;;12402:79;;:::i;:::-;12364:119;12522:1;12547:53;12592:7;12583:6;12572:9;12568:22;12547:53;:::i;:::-;12537:63;;12493:117;12649:2;12675:53;12720:7;12711:6;12700:9;12696:22;12675:53;:::i;:::-;12665:63;;12620:118;12271:474;;;;;:::o;12751:180::-;12799:77;12796:1;12789:88;12896:4;12893:1;12886:15;12920:4;12917:1;12910:15;12937:320;12981:6;13018:1;13012:4;13008:12;12998:22;;13065:1;13059:4;13055:12;13086:18;13076:81;;13142:4;13134:6;13130:17;13120:27;;13076:81;13204:2;13196:6;13193:14;13173:18;13170:38;13167:84;;13223:18;;:::i;:::-;13167:84;12988:269;12937:320;;;:::o;13263:220::-;13403:34;13399:1;13391:6;13387:14;13380:58;13472:3;13467:2;13459:6;13455:15;13448:28;13263:220;:::o;13489:366::-;13631:3;13652:67;13716:2;13711:3;13652:67;:::i;:::-;13645:74;;13728:93;13817:3;13728:93;:::i;:::-;13846:2;13841:3;13837:12;13830:19;;13489:366;;;:::o;13861:419::-;14027:4;14065:2;14054:9;14050:18;14042:26;;14114:9;14108:4;14104:20;14100:1;14089:9;14085:17;14078:47;14142:131;14268:4;14142:131;:::i;:::-;14134:139;;13861:419;;;:::o;14286:248::-;14426:34;14422:1;14414:6;14410:14;14403:58;14495:31;14490:2;14482:6;14478:15;14471:56;14286:248;:::o;14540:366::-;14682:3;14703:67;14767:2;14762:3;14703:67;:::i;:::-;14696:74;;14779:93;14868:3;14779:93;:::i;:::-;14897:2;14892:3;14888:12;14881:19;;14540:366;;;:::o;14912:419::-;15078:4;15116:2;15105:9;15101:18;15093:26;;15165:9;15159:4;15155:20;15151:1;15140:9;15136:17;15129:47;15193:131;15319:4;15193:131;:::i;:::-;15185:139;;14912:419;;;:::o;15337:232::-;15477:34;15473:1;15465:6;15461:14;15454:58;15546:15;15541:2;15533:6;15529:15;15522:40;15337:232;:::o;15575:366::-;15717:3;15738:67;15802:2;15797:3;15738:67;:::i;:::-;15731:74;;15814:93;15903:3;15814:93;:::i;:::-;15932:2;15927:3;15923:12;15916:19;;15575:366;;;:::o;15947:419::-;16113:4;16151:2;16140:9;16136:18;16128:26;;16200:9;16194:4;16190:20;16186:1;16175:9;16171:17;16164:47;16228:131;16354:4;16228:131;:::i;:::-;16220:139;;15947:419;;;:::o;16372:177::-;16512:29;16508:1;16500:6;16496:14;16489:53;16372:177;:::o;16555:366::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:419::-;17093:4;17131:2;17120:9;17116:18;17108:26;;17180:9;17174:4;17170:20;17166:1;17155:9;17151:17;17144:47;17208:131;17334:4;17208:131;:::i;:::-;17200:139;;16927:419;;;:::o;17352:221::-;17492:34;17488:1;17480:6;17476:14;17469:58;17561:4;17556:2;17548:6;17544:15;17537:29;17352:221;:::o;17579:366::-;17721:3;17742:67;17806:2;17801:3;17742:67;:::i;:::-;17735:74;;17818:93;17907:3;17818:93;:::i;:::-;17936:2;17931:3;17927:12;17920:19;;17579:366;;;:::o;17951:419::-;18117:4;18155:2;18144:9;18140:18;18132:26;;18204:9;18198:4;18194:20;18190:1;18179:9;18175:17;18168:47;18232:131;18358:4;18232:131;:::i;:::-;18224:139;;17951:419;;;:::o;18376:179::-;18516:31;18512:1;18504:6;18500:14;18493:55;18376:179;:::o;18561:366::-;18703:3;18724:67;18788:2;18783:3;18724:67;:::i;:::-;18717:74;;18800:93;18889:3;18800:93;:::i;:::-;18918:2;18913:3;18909:12;18902:19;;18561:366;;;:::o;18933:419::-;19099:4;19137:2;19126:9;19122:18;19114:26;;19186:9;19180:4;19176:20;19172:1;19161:9;19157:17;19150:47;19214:131;19340:4;19214:131;:::i;:::-;19206:139;;18933:419;;;:::o;19358:168::-;19498:20;19494:1;19486:6;19482:14;19475:44;19358:168;:::o;19532:366::-;19674:3;19695:67;19759:2;19754:3;19695:67;:::i;:::-;19688:74;;19771:93;19860:3;19771:93;:::i;:::-;19889:2;19884:3;19880:12;19873:19;;19532:366;;;:::o;19904:419::-;20070:4;20108:2;20097:9;20093:18;20085:26;;20157:9;20151:4;20147:20;20143:1;20132:9;20128:17;20121:47;20185:131;20311:4;20185:131;:::i;:::-;20177:139;;19904:419;;;:::o;20329:180::-;20377:77;20374:1;20367:88;20474:4;20471:1;20464:15;20498:4;20495:1;20488:15;20515:233;20554:3;20577:24;20595:5;20577:24;:::i;:::-;20568:33;;20623:66;20616:5;20613:77;20610:103;;20693:18;;:::i;:::-;20610:103;20740:1;20733:5;20729:13;20722:20;;20515:233;;;:::o;20754:180::-;20894:32;20890:1;20882:6;20878:14;20871:56;20754:180;:::o;20940:366::-;21082:3;21103:67;21167:2;21162:3;21103:67;:::i;:::-;21096:74;;21179:93;21268:3;21179:93;:::i;:::-;21297:2;21292:3;21288:12;21281:19;;20940:366;;;:::o;21312:419::-;21478:4;21516:2;21505:9;21501:18;21493:26;;21565:9;21559:4;21555:20;21551:1;21540:9;21536:17;21529:47;21593:131;21719:4;21593:131;:::i;:::-;21585:139;;21312:419;;;:::o;21737:180::-;21877:32;21873:1;21865:6;21861:14;21854:56;21737:180;:::o;21923:366::-;22065:3;22086:67;22150:2;22145:3;22086:67;:::i;:::-;22079:74;;22162:93;22251:3;22162:93;:::i;:::-;22280:2;22275:3;22271:12;22264:19;;21923:366;;;:::o;22295:419::-;22461:4;22499:2;22488:9;22484:18;22476:26;;22548:9;22542:4;22538:20;22534:1;22523:9;22519:17;22512:47;22576:131;22702:4;22576:131;:::i;:::-;22568:139;;22295:419;;;:::o;22720:191::-;22760:3;22779:20;22797:1;22779:20;:::i;:::-;22774:25;;22813:20;22831:1;22813:20;:::i;:::-;22808:25;;22856:1;22853;22849:9;22842:16;;22877:3;22874:1;22871:10;22868:36;;;22884:18;;:::i;:::-;22868:36;22720:191;;;;:::o;22917:166::-;23057:18;23053:1;23045:6;23041:14;23034:42;22917:166;:::o;23089:366::-;23231:3;23252:67;23316:2;23311:3;23252:67;:::i;:::-;23245:74;;23328:93;23417:3;23328:93;:::i;:::-;23446:2;23441:3;23437:12;23430:19;;23089:366;;;:::o;23461:419::-;23627:4;23665:2;23654:9;23650:18;23642:26;;23714:9;23708:4;23704:20;23700:1;23689:9;23685:17;23678:47;23742:131;23868:4;23742:131;:::i;:::-;23734:139;;23461:419;;;:::o;23886:410::-;23926:7;23949:20;23967:1;23949:20;:::i;:::-;23944:25;;23983:20;24001:1;23983:20;:::i;:::-;23978:25;;24038:1;24035;24031:9;24060:30;24078:11;24060:30;:::i;:::-;24049:41;;24239:1;24230:7;24226:15;24223:1;24220:22;24200:1;24193:9;24173:83;24150:139;;24269:18;;:::i;:::-;24150:139;23934:362;23886:410;;;;:::o;24302:222::-;24442:34;24438:1;24430:6;24426:14;24419:58;24511:5;24506:2;24498:6;24494:15;24487:30;24302:222;:::o;24530:366::-;24672:3;24693:67;24757:2;24752:3;24693:67;:::i;:::-;24686:74;;24769:93;24858:3;24769:93;:::i;:::-;24887:2;24882:3;24878:12;24871:19;;24530:366;;;:::o;24902:419::-;25068:4;25106:2;25095:9;25091:18;25083:26;;25155:9;25149:4;25145:20;25141:1;25130:9;25126:17;25119:47;25183:131;25309:4;25183:131;:::i;:::-;25175:139;;24902:419;;;:::o;25327:230::-;25467:34;25463:1;25455:6;25451:14;25444:58;25536:13;25531:2;25523:6;25519:15;25512:38;25327:230;:::o;25563:366::-;25705:3;25726:67;25790:2;25785:3;25726:67;:::i;:::-;25719:74;;25802:93;25891:3;25802:93;:::i;:::-;25920:2;25915:3;25911:12;25904:19;;25563:366;;;:::o;25935:419::-;26101:4;26139:2;26128:9;26124:18;26116:26;;26188:9;26182:4;26178:20;26174:1;26163:9;26159:17;26152:47;26216:131;26342:4;26216:131;:::i;:::-;26208:139;;25935:419;;;:::o;26360:231::-;26500:34;26496:1;26488:6;26484:14;26477:58;26569:14;26564:2;26556:6;26552:15;26545:39;26360:231;:::o;26597:366::-;26739:3;26760:67;26824:2;26819:3;26760:67;:::i;:::-;26753:74;;26836:93;26925:3;26836:93;:::i;:::-;26954:2;26949:3;26945:12;26938:19;;26597:366;;;:::o;26969:419::-;27135:4;27173:2;27162:9;27158:18;27150:26;;27222:9;27216:4;27212:20;27208:1;27197:9;27193:17;27186:47;27250:131;27376:4;27250:131;:::i;:::-;27242:139;;26969:419;;;:::o;27394:180::-;27442:77;27439:1;27432:88;27539:4;27536:1;27529:15;27563:4;27560:1;27553:15;27580:141;27629:4;27652:3;27644:11;;27675:3;27672:1;27665:14;27709:4;27706:1;27696:18;27688:26;;27580:141;;;:::o;27727:93::-;27764:6;27811:2;27806;27799:5;27795:14;27791:23;27781:33;;27727:93;;;:::o;27826:107::-;27870:8;27920:5;27914:4;27910:16;27889:37;;27826:107;;;;:::o;27939:393::-;28008:6;28058:1;28046:10;28042:18;28081:97;28111:66;28100:9;28081:97;:::i;:::-;28199:39;28229:8;28218:9;28199:39;:::i;:::-;28187:51;;28271:4;28267:9;28260:5;28256:21;28247:30;;28320:4;28310:8;28306:19;28299:5;28296:30;28286:40;;28015:317;;27939:393;;;;;:::o;28338:60::-;28366:3;28387:5;28380:12;;28338:60;;;:::o;28404:142::-;28454:9;28487:53;28505:34;28514:24;28532:5;28514:24;:::i;:::-;28505:34;:::i;:::-;28487:53;:::i;:::-;28474:66;;28404:142;;;:::o;28552:75::-;28595:3;28616:5;28609:12;;28552:75;;;:::o;28633:269::-;28743:39;28774:7;28743:39;:::i;:::-;28804:91;28853:41;28877:16;28853:41;:::i;:::-;28845:6;28838:4;28832:11;28804:91;:::i;:::-;28798:4;28791:105;28709:193;28633:269;;;:::o;28908:73::-;28953:3;28908:73;:::o;28987:189::-;29064:32;;:::i;:::-;29105:65;29163:6;29155;29149:4;29105:65;:::i;:::-;29040:136;28987:189;;:::o;29182:186::-;29242:120;29259:3;29252:5;29249:14;29242:120;;;29313:39;29350:1;29343:5;29313:39;:::i;:::-;29286:1;29279:5;29275:13;29266:22;;29242:120;;;29182:186;;:::o;29374:543::-;29475:2;29470:3;29467:11;29464:446;;;29509:38;29541:5;29509:38;:::i;:::-;29593:29;29611:10;29593:29;:::i;:::-;29583:8;29579:44;29776:2;29764:10;29761:18;29758:49;;;29797:8;29782:23;;29758:49;29820:80;29876:22;29894:3;29876:22;:::i;:::-;29866:8;29862:37;29849:11;29820:80;:::i;:::-;29479:431;;29464:446;29374:543;;;:::o;29923:117::-;29977:8;30027:5;30021:4;30017:16;29996:37;;29923:117;;;;:::o;30046:169::-;30090:6;30123:51;30171:1;30167:6;30159:5;30156:1;30152:13;30123:51;:::i;:::-;30119:56;30204:4;30198;30194:15;30184:25;;30097:118;30046:169;;;;:::o;30220:295::-;30296:4;30442:29;30467:3;30461:4;30442:29;:::i;:::-;30434:37;;30504:3;30501:1;30497:11;30491:4;30488:21;30480:29;;30220:295;;;;:::o;30520:1395::-;30637:37;30670:3;30637:37;:::i;:::-;30739:18;30731:6;30728:30;30725:56;;;30761:18;;:::i;:::-;30725:56;30805:38;30837:4;30831:11;30805:38;:::i;:::-;30890:67;30950:6;30942;30936:4;30890:67;:::i;:::-;30984:1;31008:4;30995:17;;31040:2;31032:6;31029:14;31057:1;31052:618;;;;31714:1;31731:6;31728:77;;;31780:9;31775:3;31771:19;31765:26;31756:35;;31728:77;31831:67;31891:6;31884:5;31831:67;:::i;:::-;31825:4;31818:81;31687:222;31022:887;;31052:618;31104:4;31100:9;31092:6;31088:22;31138:37;31170:4;31138:37;:::i;:::-;31197:1;31211:208;31225:7;31222:1;31219:14;31211:208;;;31304:9;31299:3;31295:19;31289:26;31281:6;31274:42;31355:1;31347:6;31343:14;31333:24;;31402:2;31391:9;31387:18;31374:31;;31248:4;31245:1;31241:12;31236:17;;31211:208;;;31447:6;31438:7;31435:19;31432:179;;;31505:9;31500:3;31496:19;31490:26;31548:48;31590:4;31582:6;31578:17;31567:9;31548:48;:::i;:::-;31540:6;31533:64;31455:156;31432:179;31657:1;31653;31645:6;31641:14;31637:22;31631:4;31624:36;31059:611;;;31022:887;;30612:1303;;;30520:1395;;:::o;31921:174::-;32061:26;32057:1;32049:6;32045:14;32038:50;31921:174;:::o;32101:366::-;32243:3;32264:67;32328:2;32323:3;32264:67;:::i;:::-;32257:74;;32340:93;32429:3;32340:93;:::i;:::-;32458:2;32453:3;32449:12;32442:19;;32101:366;;;:::o;32473:419::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32473:419;;;:::o;32898:228::-;33038:34;33034:1;33026:6;33022:14;33015:58;33107:11;33102:2;33094:6;33090:15;33083:36;32898:228;:::o;33132:366::-;33274:3;33295:67;33359:2;33354:3;33295:67;:::i;:::-;33288:74;;33371:93;33460:3;33371:93;:::i;:::-;33489:2;33484:3;33480:12;33473:19;;33132:366;;;:::o;33504:419::-;33670:4;33708:2;33697:9;33693:18;33685:26;;33757:9;33751:4;33747:20;33743:1;33732:9;33728:17;33721:47;33785:131;33911:4;33785:131;:::i;:::-;33777:139;;33504:419;;;:::o;33929:227::-;34069:34;34065:1;34057:6;34053:14;34046:58;34138:10;34133:2;34125:6;34121:15;34114:35;33929:227;:::o;34162:366::-;34304:3;34325:67;34389:2;34384:3;34325:67;:::i;:::-;34318:74;;34401:93;34490:3;34401:93;:::i;:::-;34519:2;34514:3;34510:12;34503:19;;34162:366;;;:::o;34534:419::-;34700:4;34738:2;34727:9;34723:18;34715:26;;34787:9;34781:4;34777:20;34773:1;34762:9;34758:17;34751:47;34815:131;34941:4;34815:131;:::i;:::-;34807:139;;34534:419;;;:::o;34959:224::-;35099:34;35095:1;35087:6;35083:14;35076:58;35168:7;35163:2;35155:6;35151:15;35144:32;34959:224;:::o;35189:366::-;35331:3;35352:67;35416:2;35411:3;35352:67;:::i;:::-;35345:74;;35428:93;35517:3;35428:93;:::i;:::-;35546:2;35541:3;35537:12;35530:19;;35189:366;;;:::o;35561:419::-;35727:4;35765:2;35754:9;35750:18;35742:26;;35814:9;35808:4;35804:20;35800:1;35789:9;35785:17;35778:47;35842:131;35968:4;35842:131;:::i;:::-;35834:139;;35561:419;;;:::o;35986:514::-;36147:4;36185:2;36174:9;36170:18;36162:26;;36234:9;36228:4;36224:20;36220:1;36209:9;36205:17;36198:47;36262:78;36335:4;36326:6;36262:78;:::i;:::-;36254:86;;36387:9;36381:4;36377:20;36372:2;36361:9;36357:18;36350:48;36415:78;36488:4;36479:6;36415:78;:::i;:::-;36407:86;;35986:514;;;;;:::o;36506:168::-;36646:20;36642:1;36634:6;36630:14;36623:44;36506:168;:::o;36680:366::-;36822:3;36843:67;36907:2;36902:3;36843:67;:::i;:::-;36836:74;;36919:93;37008:3;36919:93;:::i;:::-;37037:2;37032:3;37028:12;37021:19;;36680:366;;;:::o;37052:419::-;37218:4;37256:2;37245:9;37241:18;37233:26;;37305:9;37299:4;37295:20;37291:1;37280:9;37276:17;37269:47;37333:131;37459:4;37333:131;:::i;:::-;37325:139;;37052:419;;;:::o;37477:225::-;37617:34;37613:1;37605:6;37601:14;37594:58;37686:8;37681:2;37673:6;37669:15;37662:33;37477:225;:::o;37708:366::-;37850:3;37871:67;37935:2;37930:3;37871:67;:::i;:::-;37864:74;;37947:93;38036:3;37947:93;:::i;:::-;38065:2;38060:3;38056:12;38049:19;;37708:366;;;:::o;38080:419::-;38246:4;38284:2;38273:9;38269:18;38261:26;;38333:9;38327:4;38323:20;38319:1;38308:9;38304:17;38297:47;38361:131;38487:4;38361:131;:::i;:::-;38353:139;;38080:419;;;:::o;38505:224::-;38645:34;38641:1;38633:6;38629:14;38622:58;38714:7;38709:2;38701:6;38697:15;38690:32;38505:224;:::o;38735:366::-;38877:3;38898:67;38962:2;38957:3;38898:67;:::i;:::-;38891:74;;38974:93;39063:3;38974:93;:::i;:::-;39092:2;39087:3;39083:12;39076:19;;38735:366;;;:::o;39107:419::-;39273:4;39311:2;39300:9;39296:18;39288:26;;39360:9;39354:4;39350:20;39346:1;39335:9;39331:17;39324:47;39388:131;39514:4;39388:131;:::i;:::-;39380:139;;39107:419;;;:::o;39532:223::-;39672:34;39668:1;39660:6;39656:14;39649:58;39741:6;39736:2;39728:6;39724:15;39717:31;39532:223;:::o;39761:366::-;39903:3;39924:67;39988:2;39983:3;39924:67;:::i;:::-;39917:74;;40000:93;40089:3;40000:93;:::i;:::-;40118:2;40113:3;40109:12;40102:19;;39761:366;;;:::o;40133:419::-;40299:4;40337:2;40326:9;40322:18;40314:26;;40386:9;40380:4;40376:20;40372:1;40361:9;40357:17;40350:47;40414:131;40540:4;40414:131;:::i;:::-;40406:139;;40133:419;;;:::o;40558:182::-;40698:34;40694:1;40686:6;40682:14;40675:58;40558:182;:::o;40746:366::-;40888:3;40909:67;40973:2;40968:3;40909:67;:::i;:::-;40902:74;;40985:93;41074:3;40985:93;:::i;:::-;41103:2;41098:3;41094:12;41087:19;;40746:366;;;:::o;41118:419::-;41284:4;41322:2;41311:9;41307:18;41299:26;;41371:9;41365:4;41361:20;41357:1;41346:9;41342:17;41335:47;41399:131;41525:4;41399:131;:::i;:::-;41391:139;;41118:419;;;:::o;41543:175::-;41683:27;41679:1;41671:6;41667:14;41660:51;41543:175;:::o;41724:366::-;41866:3;41887:67;41951:2;41946:3;41887:67;:::i;:::-;41880:74;;41963:93;42052:3;41963:93;:::i;:::-;42081:2;42076:3;42072:12;42065:19;;41724:366;;;:::o;42096:419::-;42262:4;42300:2;42289:9;42285:18;42277:26;;42349:9;42343:4;42339:20;42335:1;42324:9;42320:17;42313:47;42377:131;42503:4;42377:131;:::i;:::-;42369:139;;42096:419;;;:::o;42521:237::-;42661:34;42657:1;42649:6;42645:14;42638:58;42730:20;42725:2;42717:6;42713:15;42706:45;42521:237;:::o;42764:366::-;42906:3;42927:67;42991:2;42986:3;42927:67;:::i;:::-;42920:74;;43003:93;43092:3;43003:93;:::i;:::-;43121:2;43116:3;43112:12;43105:19;;42764:366;;;:::o;43136:419::-;43302:4;43340:2;43329:9;43325:18;43317:26;;43389:9;43383:4;43379:20;43375:1;43364:9;43360:17;43353:47;43417:131;43543:4;43417:131;:::i;:::-;43409:139;;43136:419;;;:::o;43561:148::-;43663:11;43700:3;43685:18;;43561:148;;;;:::o;43715:390::-;43821:3;43849:39;43882:5;43849:39;:::i;:::-;43904:89;43986:6;43981:3;43904:89;:::i;:::-;43897:96;;44002:65;44060:6;44055:3;44048:4;44041:5;44037:16;44002:65;:::i;:::-;44092:6;44087:3;44083:16;44076:23;;43825:280;43715:390;;;;:::o;44111:435::-;44291:3;44313:95;44404:3;44395:6;44313:95;:::i;:::-;44306:102;;44425:95;44516:3;44507:6;44425:95;:::i;:::-;44418:102;;44537:3;44530:10;;44111:435;;;;;:::o;44552:98::-;44603:6;44637:5;44631:12;44621:22;;44552:98;;;:::o;44656:168::-;44739:11;44773:6;44768:3;44761:19;44813:4;44808:3;44804:14;44789:29;;44656:168;;;;:::o;44830:373::-;44916:3;44944:38;44976:5;44944:38;:::i;:::-;44998:70;45061:6;45056:3;44998:70;:::i;:::-;44991:77;;45077:65;45135:6;45130:3;45123:4;45116:5;45112:16;45077:65;:::i;:::-;45167:29;45189:6;45167:29;:::i;:::-;45162:3;45158:39;45151:46;;44920:283;44830:373;;;;:::o;45209:640::-;45404:4;45442:3;45431:9;45427:19;45419:27;;45456:71;45524:1;45513:9;45509:17;45500:6;45456:71;:::i;:::-;45537:72;45605:2;45594:9;45590:18;45581:6;45537:72;:::i;:::-;45619;45687:2;45676:9;45672:18;45663:6;45619:72;:::i;:::-;45738:9;45732:4;45728:20;45723:2;45712:9;45708:18;45701:48;45766:76;45837:4;45828:6;45766:76;:::i;:::-;45758:84;;45209:640;;;;;;;:::o;45855:141::-;45911:5;45942:6;45936:13;45927:22;;45958:32;45984:5;45958:32;:::i;:::-;45855:141;;;;:::o;46002:349::-;46071:6;46120:2;46108:9;46099:7;46095:23;46091:32;46088:119;;;46126:79;;:::i;:::-;46088:119;46246:1;46271:63;46326:7;46317:6;46306:9;46302:22;46271:63;:::i;:::-;46261:73;;46217:127;46002:349;;;;:::o;46357:180::-;46405:77;46402:1;46395:88;46502:4;46499:1;46492:15;46526:4;46523:1;46516:15;46543:240;46683:34;46679:1;46671:6;46667:14;46660:58;46752:23;46747:2;46739:6;46735:15;46728:48;46543:240;:::o;46789:366::-;46931:3;46952:67;47016:2;47011:3;46952:67;:::i;:::-;46945:74;;47028:93;47117:3;47028:93;:::i;:::-;47146:2;47141:3;47137:12;47130:19;;46789:366;;;:::o;47161:419::-;47327:4;47365:2;47354:9;47350:18;47342:26;;47414:9;47408:4;47404:20;47400:1;47389:9;47385:17;47378:47;47442:131;47568:4;47442:131;:::i;:::-;47434:139;;47161:419;;;:::o;47586:182::-;47726:34;47722:1;47714:6;47710:14;47703:58;47586:182;:::o;47774:366::-;47916:3;47937:67;48001:2;47996:3;47937:67;:::i;:::-;47930:74;;48013:93;48102:3;48013:93;:::i;:::-;48131:2;48126:3;48122:12;48115:19;;47774:366;;;:::o;48146:419::-;48312:4;48350:2;48339:9;48335:18;48327:26;;48399:9;48393:4;48389:20;48385:1;48374:9;48370:17;48363:47;48427:131;48553:4;48427:131;:::i;:::-;48419:139;;48146:419;;;:::o;48571:178::-;48711:30;48707:1;48699:6;48695:14;48688:54;48571:178;:::o;48755:366::-;48897:3;48918:67;48982:2;48977:3;48918:67;:::i;:::-;48911:74;;48994:93;49083:3;48994:93;:::i;:::-;49112:2;49107:3;49103:12;49096:19;;48755:366;;;:::o;49127:419::-;49293:4;49331:2;49320:9;49316:18;49308:26;;49380:9;49374:4;49370:20;49366:1;49355:9;49351:17;49344:47;49408:131;49534:4;49408:131;:::i;:::-;49400:139;;49127:419;;;:::o;49552:194::-;49592:4;49612:20;49630:1;49612:20;:::i;:::-;49607:25;;49646:20;49664:1;49646:20;:::i;:::-;49641:25;;49690:1;49687;49683:9;49675:17;;49714:1;49708:4;49705:11;49702:37;;;49719:18;;:::i;:::-;49702:37;49552:194;;;;:::o;49752:180::-;49800:77;49797:1;49790:88;49897:4;49894:1;49887:15;49921:4;49918:1;49911:15
Swarm Source
ipfs://7f800ee76616a6ac5a864cbcb7db18aecd3907d091578ff08177ebd32b920e73
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.