More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 249 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 59903868 | 129 days ago | IN | 0 POL | 0.00144636 | ||||
Set Approval For... | 56207844 | 224 days ago | IN | 0 POL | 0.00244363 | ||||
Set Approval For... | 49367250 | 400 days ago | IN | 0 POL | 0.00168065 | ||||
Safe Transfer Fr... | 43546625 | 548 days ago | IN | 0 POL | 0.00798534 | ||||
Set Approval For... | 43098354 | 560 days ago | IN | 0 POL | 0.00401096 | ||||
Set Approval For... | 43098323 | 560 days ago | IN | 0 POL | 0.00695361 | ||||
Set Approval For... | 42211196 | 582 days ago | IN | 0 POL | 0.00690731 | ||||
Set Approval For... | 40792702 | 619 days ago | IN | 0 POL | 0.03417392 | ||||
Set Approval For... | 40578649 | 625 days ago | IN | 0 POL | 0.00272152 | ||||
Set Approval For... | 40173831 | 635 days ago | IN | 0 POL | 0.00565363 | ||||
Set Approval For... | 39777033 | 646 days ago | IN | 0 POL | 0.0062464 | ||||
Set Approval For... | 39602899 | 651 days ago | IN | 0 POL | 0.00921392 | ||||
Set Approval For... | 39363297 | 657 days ago | IN | 0 POL | 0.00962595 | ||||
Set Approval For... | 39018414 | 666 days ago | IN | 0 POL | 0.01121121 | ||||
Set Approval For... | 38014108 | 691 days ago | IN | 0 POL | 0.00184465 | ||||
Set Approval For... | 38014071 | 691 days ago | IN | 0 POL | 0.00184405 | ||||
Set Approval For... | 38013995 | 691 days ago | IN | 0 POL | 0.00188945 | ||||
Set Approval For... | 37947923 | 693 days ago | IN | 0 POL | 0.00266787 | ||||
Set Approval For... | 37859476 | 695 days ago | IN | 0 POL | 0.00282083 | ||||
Set Approval For... | 37718212 | 699 days ago | IN | 0 POL | 0.00134013 | ||||
Safe Transfer Fr... | 37696934 | 699 days ago | IN | 0 POL | 0.00458075 | ||||
Safe Transfer Fr... | 37674271 | 700 days ago | IN | 0 POL | 0.00226239 | ||||
Safe Transfer Fr... | 37665407 | 700 days ago | IN | 0 POL | 0.00543906 | ||||
Set Approval For... | 37586973 | 702 days ago | IN | 0 POL | 0.00382302 | ||||
Set Approval For... | 37516158 | 704 days ago | IN | 0 POL | 0.00174468 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
36979448 | 717 days ago | 50 POL | ||||
36965081 | 718 days ago | 25 POL | ||||
36932232 | 718 days ago | 50 POL | ||||
36900825 | 719 days ago | 50 POL | ||||
36837791 | 721 days ago | 50 POL | ||||
36835283 | 721 days ago | 25 POL | ||||
36795675 | 722 days ago | 25 POL | ||||
36678958 | 725 days ago | 34 POL | ||||
36675181 | 725 days ago | 34 POL | ||||
36675123 | 725 days ago | 34 POL | ||||
36673940 | 725 days ago | 34 POL | ||||
36673360 | 725 days ago | 17 POL | ||||
36667024 | 725 days ago | 17 POL | ||||
36666831 | 725 days ago | 17 POL | ||||
36666785 | 725 days ago | 17 POL | ||||
36634161 | 726 days ago | 17 POL | ||||
36629345 | 726 days ago | 17 POL | ||||
36628897 | 726 days ago | 17 POL | ||||
36515422 | 729 days ago | 52 POL | ||||
36510339 | 729 days ago | 13 POL | ||||
36505255 | 729 days ago | 13 POL | ||||
36470832 | 730 days ago | 13 POL | ||||
36464186 | 730 days ago | 13 POL | ||||
36428820 | 731 days ago | 13 POL | ||||
36422539 | 731 days ago | 13 POL |
Loading...
Loading
Contract Name:
WorldCupPredictionV1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-11-18 */ /** * 2022-11-18 sportspredict.io - World Cup Qatar 2022 Prediction NFT */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: WorldCupV01.sol /** * 2022-11-18 sportspredict.io - World Cup Qatar 2022 Prediction NFT */ pragma solidity ^0.8.4; contract WorldCupPredictionV1 is ERC1155, ReentrancyGuard, Ownable { using SafeMath for uint256; uint256 initialCost = 10 ** 19; uint256 increaseUnit = 10 ** 18; uint256 increaseStep = 100; uint256 maxSupplyPerUser = 10; uint256 maxSupplyPerToken = 2000; string public constant name = "World Cup Qatar 2022 Prediction NFT"; string public constant symbol = "WCQPN"; uint256 public endTime = 1670032800; // 3 December 2022 (02:00 AM UTC) uint256 public totalMinted; // total minted NFT amounts uint256 public totalPool; // total amount of MATIC mapping(uint256 => uint256) public totalSupply; mapping(address => mapping(uint256 => uint256)) public supplyByUser; mapping(uint256 => string) private _tokenURIs; string public prefixURI = "https://gateway.pinata.cloud/ipfs/QmYUFmzrdgQRMZSYZg2pDysxGBvKAanxRHCnJKahY73LLo/"; address public TreasuryWallet = 0xd573a3dde93c8BabDfB1fBbc40D096AA2d8Fe067; //our secret multi-sig wallet and we will save all of money here until world cup is ended uint256 public TreasuryFee = 1000; //10% of total amount constructor() ERC1155("") {} function uri(uint256 _tokenId) override public view returns (string memory) { return string( abi.encodePacked( prefixURI, Strings.toString(_tokenId), ".json" ) ); } function setPrefixURI(string memory newUri) public onlyOwner{ prefixURI = newUri; } function mint(uint256 token_id, uint256 supply) public payable { require(block.timestamp < endTime, "time is expired"); uint256 supplies = totalSupply[token_id]; require(supply <= maxSupplyPerUser, "you can mint less than max supply per user"); require(supplyByUser[msg.sender][token_id] < maxSupplyPerUser, "You have already minted this token"); require(supplies + supply < maxSupplyPerToken, "can't mint this token anymore"); uint256 amount; if (((supplies + supply) % increaseStep) < maxSupplyPerUser && supplies > increaseStep) { amount = getPriceBySupplies(supplies) * (supply - (supplies + supply) % increaseStep) + getPriceBySupplies(supplies + supply) * ((supplies + supply) % increaseStep); } else { amount = getPriceBySupplies(supplies) * supply; } require(msg.value == amount, "influence --- amount"); _mint(msg.sender, token_id, supply, ""); totalSupply[token_id] += supply; supplyByUser[msg.sender][token_id] += supply; totalMinted += supply; totalPool += amount; divisionOfBenefit(msg.value); } function batchMint(uint256[] memory _ids, uint256[] memory quantities) public payable { require(block.timestamp < endTime, "time is expired"); uint256 totalAmount; for (uint256 i = 0; i < _ids.length; i++) { uint256 _id = _ids[i]; uint256 supply = quantities[i]; uint256 supplies = totalSupply[_id]; require(supply <= maxSupplyPerUser, "you can mint less than max supply per user"); require(supplyByUser[msg.sender][_id] < maxSupplyPerUser, "You have already minted this token"); require(supplies + supply <= maxSupplyPerToken, "can't mint this token anymore"); uint256 additional = supplies % increaseStep; uint256 stepToIncrease = increaseStep - additional; uint256 amount; if (supply >= stepToIncrease) { uint256 countToIncrease = supply - stepToIncrease; uint256 amountIncreased = getPriceBySupplies(supplies + supply) * countToIncrease; uint256 amountNotIncreased = getPriceBySupplies(supplies) * (supply - countToIncrease); amount = amountIncreased + amountNotIncreased; } else { amount = getPriceBySupplies(supplies) * supply; } totalAmount += amount; } totalPool += totalAmount; require(msg.value == totalAmount, "influence --- amount"); _mintBatch(msg.sender, _ids, quantities, ""); for (uint256 i = 0; i < _ids.length; i++) { uint256 _id = _ids[i]; uint256 supply = quantities[i]; totalSupply[_id] += supply; supplyByUser[msg.sender][_id] += supply; totalMinted += supply; } divisionOfBenefit(msg.value); } function divisionOfBenefit(uint256 amount) private { (bool success,) = TreasuryWallet.call{value : amount}(""); require(success, "TransferHelper: MATIC_TRANSFER_FAILED"); } function getInitialCost() public view returns (uint256) { return initialCost; } function getIncreaseUnit() public view returns (uint256) { return increaseUnit; } function getIncreaseStep() public view returns (uint256) { return increaseStep; } function getMaxSupplyPerUser() public view returns (uint256) { return maxSupplyPerUser; } function getMaxSupplyPerToken() public view returns (uint256) { return maxSupplyPerToken; } function getPriceBySupplies(uint256 supplies) internal view returns (uint256) { return initialCost + (supplies / increaseStep) * increaseUnit; } function setDivision(address _newTreasuryWallet, uint256 _newTreasuryFee) public onlyOwner { require(_newTreasuryWallet != address(0), "ERC20: burn from the zero address"); TreasuryWallet = _newTreasuryWallet; TreasuryFee = _newTreasuryFee; } function setEndTime(uint256 newTime) public onlyOwner { endTime = newTime; } function setInitialCost(uint256 _newCost) public onlyOwner { initialCost = _newCost; } function setIncreaseUnit(uint256 _newUnit) public onlyOwner { increaseUnit = _newUnit; } function setIncreaseStep(uint256 _newStep) public onlyOwner { increaseStep = _newStep; } function setMaxSupplyPerUser(uint256 _newMaxSupply) public onlyOwner { maxSupplyPerUser = _newMaxSupply; } function setMaxSupplyPerToken(uint256 _newMaxSupply) public onlyOwner { maxSupplyPerToken = _newMaxSupply; } function getTokenPrice(uint256 token_id) public view returns (uint256) { uint256 supplies = totalSupply[token_id]; return getPriceBySupplies(supplies); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"TreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TreasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIncreaseStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIncreaseUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitialCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupplyPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupplyPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasuryWallet","type":"address"},{"internalType":"uint256","name":"_newTreasuryFee","type":"uint256"}],"name":"setDivision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStep","type":"uint256"}],"name":"setIncreaseStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newUnit","type":"uint256"}],"name":"setIncreaseUnit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setInitialCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupplyPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupplyPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setPrefixURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052678ac7230489e80000600555670de0b6b3a76400006006556064600755600a6008556107d060095563638aada0600a5560405180608001604052806051815260200162004d4360519139601090805190602001906200006592919062000209565b5073d573a3dde93c8babdfb1fbbc40d096aa2d8fe067601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8601255348015620000ce57600080fd5b5060405180602001604052806000815250620000f0816200011f60201b60201c565b506001600381905550620001196200010d6200013b60201b60201c565b6200014360201b60201c565b6200031e565b80600290805190602001906200013792919062000209565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021790620002b9565b90600052602060002090601f0160209004810192826200023b576000855562000287565b82601f106200025657805160ff191683800117855562000287565b8280016001018555821562000287579182015b828111156200028657825182559160200191906001019062000269565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b60006002820490506001821680620002d257607f821691505b60208210811415620002e957620002e8620002ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614a15806200032e6000396000f3fe6080604052600436106102195760003560e01c806395d89b4111610123578063c7e489a7116100ab578063ecfb49a31161006f578063ecfb49a3146107ca578063f1432f9d146107f5578063f242432a1461081e578063f2fde38b14610847578063f9fa64391461087057610219565b8063c7e489a7146106e5578063ccb98ffc1461070e578063dcd0026814610737578063dcdab77e14610762578063e985e9c51461078d57610219565b8063a2309ff8116100f2578063a2309ff8146105ec578063b2c94ee614610617578063b4aa011d14610640578063bd85b0391461066b578063c457fb37146106a857610219565b806395d89b41146105425780639af2a6811461056d578063a0c5407814610598578063a22cb465146105c357610219565b80634e1273f4116101a65780636dbcf96b116101755780636dbcf96b1461046f578063715018a6146104985780637341ede4146104af57806387700c83146104ec5780638da5cb5b1461051757610219565b80634e1273f4146103c457806365fd766c14610401578063682498c51461042a578063688d22321461045357610219565b806311ffeaf2116101ed57806311ffeaf21461030057806312cf370c1461032b5780631b2ef1ca146103545780632eb2c2d6146103705780633197cbb61461039957610219565b8062fdd58e1461021e57806301ffc9a71461025b57806306fdde03146102985780630e89341c146102c3575b600080fd5b34801561022a57600080fd5b50610245600480360381019061024091906132a4565b61089b565b6040516102529190613dae565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906133d4565b610964565b60405161028f9190613b11565b60405180910390f35b3480156102a457600080fd5b506102ad610a46565b6040516102ba9190613b2c565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190613477565b610a62565b6040516102f79190613b2c565b60405180910390f35b34801561030c57600080fd5b50610315610a96565b60405161032291906139db565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613477565b610abc565b005b61036e600480360381019061036991906134a4565b610ace565b005b34801561037c57600080fd5b50610397600480360381019061039291906130fe565b610e48565b005b3480156103a557600080fd5b506103ae610ee9565b6040516103bb9190613dae565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906132e4565b610eef565b6040516103f89190613ab8565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190613477565b611008565b005b34801561043657600080fd5b50610451600480360381019061044c91906132a4565b61101a565b005b61046d6004803603810190610468919061335c565b6110de565b005b34801561047b57600080fd5b5061049660048036038101906104919190613477565b611518565b005b3480156104a457600080fd5b506104ad61152a565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906132a4565b61153e565b6040516104e39190613dae565b60405180910390f35b3480156104f857600080fd5b50610501611563565b60405161050e9190613dae565b60405180910390f35b34801561052357600080fd5b5061052c61156d565b60405161053991906139db565b60405180910390f35b34801561054e57600080fd5b50610557611597565b6040516105649190613b2c565b60405180910390f35b34801561057957600080fd5b506105826115d0565b60405161058f9190613dae565b60405180910390f35b3480156105a457600080fd5b506105ad6115da565b6040516105ba9190613b2c565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613264565b611668565b005b3480156105f857600080fd5b5061060161167e565b60405161060e9190613dae565b60405180910390f35b34801561062357600080fd5b5061063e6004803603810190610639919061342e565b611684565b005b34801561064c57600080fd5b506106556116a6565b6040516106629190613dae565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190613477565b6116b0565b60405161069f9190613dae565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613477565b6116c8565b6040516106dc9190613dae565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613477565b6116f2565b005b34801561071a57600080fd5b5061073560048036038101906107309190613477565b611704565b005b34801561074357600080fd5b5061074c611716565b6040516107599190613dae565b60405180910390f35b34801561076e57600080fd5b5061077761171c565b6040516107849190613dae565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af91906130be565b611726565b6040516107c19190613b11565b60405180910390f35b3480156107d657600080fd5b506107df6117ba565b6040516107ec9190613dae565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613477565b6117c0565b005b34801561082a57600080fd5b50610845600480360381019061084091906131cd565b6117d2565b005b34801561085357600080fd5b5061086e60048036038101906108699190613091565b611873565b005b34801561087c57600080fd5b506108856118f7565b6040516108929190613dae565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613bae565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3f5750610a3e82611901565b5b9050919050565b6040518060600160405280602381526020016149bd6023913981565b60606010610a6f8361196b565b604051602001610a80929190613997565b6040516020818303038152906040529050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ac4611a43565b8060078190555050565b600a544210610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990613b8e565b60405180910390fd5b6000600d6000848152602001908152602001600020549050600854821115610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6690613c4e565b60405180910390fd5b600854600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205410610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613c0e565b60405180910390fd5b6009548282610c129190613f6d565b10610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990613c6e565b60405180910390fd5b60006008546007548484610c669190613f6d565b610c7091906141e4565b108015610c7e575060075482115b15610d02576007548383610c929190613f6d565b610c9c91906141e4565b610cb08484610cab9190613f6d565b611ac1565b610cba9190613ff4565b6007548484610cc99190613f6d565b610cd391906141e4565b84610cde919061404e565b610ce784611ac1565b610cf19190613ff4565b610cfb9190613f6d565b9050610d19565b82610d0c83611ac1565b610d169190613ff4565b90505b803414610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613bee565b60405180910390fd5b610d7633858560405180602001604052806000815250611af2565b82600d60008681526020019081526020016000206000828254610d999190613f6d565b9250508190555082600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000828254610e009190613f6d565b9250508190555082600b6000828254610e199190613f6d565b9250508190555080600c6000828254610e329190613f6d565b92505081905550610e4234611ca3565b50505050565b610e50611d75565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e965750610e9585610e90611d75565b611726565b5b610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613bce565b60405180910390fd5b610ee28585858585611d7d565b5050505050565b600a5481565b60608151835114610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613d2e565b60405180910390fd5b6000835167ffffffffffffffff811115610f5257610f516142d1565b5b604051908082528060200260200182016040528015610f805781602001602082028036833780820191505090505b50905060005b8451811015610ffd57610fcd858281518110610fa557610fa46142a2565b5b6020026020010151858381518110610fc057610fbf6142a2565b5b602002602001015161089b565b828281518110610fe057610fdf6142a2565b5b60200260200101818152505080610ff69061419b565b9050610f86565b508091505092915050565b611010611a43565b8060088190555050565b611022611a43565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990613cce565b60405180910390fd5b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806012819055505050565b600a544210611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990613b8e565b60405180910390fd5b600080600090505b8351811015611389576000848281518110611148576111476142a2565b5b602002602001015190506000848381518110611167576111666142a2565b5b602002602001015190506000600d60008481526020019081526020016000205490506008548211156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590613c4e565b60405180910390fd5b600854600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205410611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613c0e565b60405180910390fd5b60095482826112719190613f6d565b11156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613c6e565b60405180910390fd5b6000600754826112c291906141e4565b90506000816007546112d4919061404e565b9050600081851061134b57600082866112ed919061404e565b905060008161130688886113019190613f6d565b611ac1565b6113109190613ff4565b905060008288611320919061404e565b61132988611ac1565b6113339190613ff4565b905080826113419190613f6d565b9350505050611362565b8461135585611ac1565b61135f9190613ff4565b90505b808861136e9190613f6d565b975050505050505080806113819061419b565b91505061112a565b5080600c600082825461139c9190613f6d565b925050819055508034146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613bee565b60405180910390fd5b6114003384846040518060200160405280600081525061209f565b60005b8351811015611509576000848281518110611421576114206142a2565b5b6020026020010151905060008483815181106114405761143f6142a2565b5b6020026020010151905080600d6000848152602001908152602001600020600082825461146d9190613f6d565b9250508190555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008282546114d49190613f6d565b9250508190555080600b60008282546114ed9190613f6d565b92505081905550505080806115019061419b565b915050611403565b5061151334611ca3565b505050565b611520611a43565b8060098190555050565b611532611a43565b61153c60006122cc565b565b600e602052816000526040600020602052806000526040600020600091509150505481565b6000600654905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f574351504e00000000000000000000000000000000000000000000000000000081525081565b6000600554905090565b601080546115e790614138565b80601f016020809104026020016040519081016040528092919081815260200182805461161390614138565b80156116605780601f1061163557610100808354040283529160200191611660565b820191906000526020600020905b81548152906001019060200180831161164357829003601f168201915b505050505081565b61167a611673611d75565b8383612392565b5050565b600b5481565b61168c611a43565b80601090805190602001906116a2929190612d69565b5050565b6000600754905090565b600d6020528060005260406000206000915090505481565b600080600d60008481526020019081526020016000205490506116ea81611ac1565b915050919050565b6116fa611a43565b8060068190555050565b61170c611a43565b80600a8190555050565b60125481565b6000600854905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b6117c8611a43565b8060058190555050565b6117da611d75565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611820575061181f8561181a611d75565b611726565b5b61185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185690613bce565b60405180910390fd5b61186c85858585856124ff565b5050505050565b61187b611a43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613b6e565b60405180910390fd5b6118f4816122cc565b50565b6000600954905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600161197a8461279b565b01905060008167ffffffffffffffff811115611999576119986142d1565b5b6040519080825280601f01601f1916602001820160405280156119cb5781602001600182028036833780820191505090505b509050600082602001820190505b600115611a38578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a2257611a21614244565b5b0494506000851415611a3357611a38565b6119d9565b819350505050919050565b611a4b611d75565b73ffffffffffffffffffffffffffffffffffffffff16611a6961156d565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690613cae565b60405180910390fd5b565b600060065460075483611ad49190613fc3565b611ade9190613ff4565b600554611aeb9190613f6d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613d6e565b60405180910390fd5b6000611b6c611d75565b90506000611b79856128ee565b90506000611b86856128ee565b9050611b9783600089858589612968565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf69190613f6d565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c74929190613dc9565b60405180910390a4611c8b83600089858589612970565b611c9a83600089898989612978565b50505050505050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611ceb906139c6565b60006040518083038185875af1925050503d8060008114611d28576040519150601f19603f3d011682016040523d82523d6000602084013e611d2d565b606091505b5050905080611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890613cee565b60405180910390fd5b5050565b600033905090565b8151835114611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890613d4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613c2e565b60405180910390fd5b6000611e3b611d75565b9050611e4b818787878787612968565b60005b8451811015611ffc576000858281518110611e6c57611e6b6142a2565b5b602002602001015190506000858381518110611e8b57611e8a6142a2565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390613c8e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fe19190613f6d565b9250508190555050505080611ff59061419b565b9050611e4e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612073929190613ada565b60405180910390a4612089818787878787612970565b612097818787878787612b5f565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690613d6e565b60405180910390fd5b8151835114612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90613d4e565b60405180910390fd5b600061215d611d75565b905061216e81600087878787612968565b60005b84518110156122275783818151811061218d5761218c6142a2565b5b60200260200101516000808784815181106121ab576121aa6142a2565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220d9190613f6d565b92505081905550808061221f9061419b565b915050612171565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161229f929190613ada565b60405180910390a46122b681600087878787612970565b6122c581600087878787612b5f565b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890613d0e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f29190613b11565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690613c2e565b60405180910390fd5b6000612579611d75565b90506000612586856128ee565b90506000612593856128ee565b90506125a3838989858589612968565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263190613c8e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ef9190613f6d565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161276c929190613dc9565b60405180910390a4612782848a8a86868a612970565b612790848a8a8a8a8a612978565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127f9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127ef576127ee614244565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612836576d04ee2d6d415b85acef8100000000838161282c5761282b614244565b5b0492506020810190505b662386f26fc10000831061286557662386f26fc10000838161285b5761285a614244565b5b0492506010810190505b6305f5e100831061288e576305f5e100838161288457612883614244565b5b0492506008810190505b61271083106128b35761271083816128a9576128a8614244565b5b0492506004810190505b606483106128d657606483816128cc576128cb614244565b5b0492506002810190505b600a83106128e5576001810190505b80915050919050565b60606000600167ffffffffffffffff81111561290d5761290c6142d1565b5b60405190808252806020026020018201604052801561293b5781602001602082028036833780820191505090505b5090508281600081518110612953576129526142a2565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6129978473ffffffffffffffffffffffffffffffffffffffff16612d46565b15612b57578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016129dd959493929190613a5e565b602060405180830381600087803b1580156129f757600080fd5b505af1925050508015612a2857506040513d601f19601f82011682018060405250810190612a259190613401565b60015b612ace57612a34614300565b806308c379a01415612a915750612a496148ca565b80612a545750612a93565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a889190613b2c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac590613d8e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4c90613b4e565b60405180910390fd5b505b505050505050565b612b7e8473ffffffffffffffffffffffffffffffffffffffff16612d46565b15612d3e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612bc49594939291906139f6565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c9190613401565b60015b612cb557612c1b614300565b806308c379a01415612c785750612c306148ca565b80612c3b5750612c7a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f9190613b2c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cac90613d8e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3390613b4e565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612d7590614138565b90600052602060002090601f016020900481019282612d975760008555612dde565b82601f10612db057805160ff1916838001178555612dde565b82800160010185558215612dde579182015b82811115612ddd578251825591602001919060010190612dc2565b5b509050612deb9190612def565b5090565b5b80821115612e08576000816000905550600101612df0565b5090565b6000612e1f612e1a84613e17565b613df2565b90508083825260208201905082856020860282011115612e4257612e41614327565b5b60005b85811015612e725781612e588882612f70565b845260208401935060208301925050600181019050612e45565b5050509392505050565b6000612e8f612e8a84613e43565b613df2565b90508083825260208201905082856020860282011115612eb257612eb1614327565b5b60005b85811015612ee25781612ec8888261307c565b845260208401935060208301925050600181019050612eb5565b5050509392505050565b6000612eff612efa84613e6f565b613df2565b905082815260208101848484011115612f1b57612f1a61432c565b5b612f268482856140f6565b509392505050565b6000612f41612f3c84613ea0565b613df2565b905082815260208101848484011115612f5d57612f5c61432c565b5b612f688482856140f6565b509392505050565b600081359050612f7f81614960565b92915050565b600082601f830112612f9a57612f99614322565b5b8135612faa848260208601612e0c565b91505092915050565b600082601f830112612fc857612fc7614322565b5b8135612fd8848260208601612e7c565b91505092915050565b600081359050612ff081614977565b92915050565b6000813590506130058161498e565b92915050565b60008151905061301a8161498e565b92915050565b600082601f83011261303557613034614322565b5b8135613045848260208601612eec565b91505092915050565b600082601f83011261306357613062614322565b5b8135613073848260208601612f2e565b91505092915050565b60008135905061308b816149a5565b92915050565b6000602082840312156130a7576130a6614336565b5b60006130b584828501612f70565b91505092915050565b600080604083850312156130d5576130d4614336565b5b60006130e385828601612f70565b92505060206130f485828601612f70565b9150509250929050565b600080600080600060a0868803121561311a57613119614336565b5b600061312888828901612f70565b955050602061313988828901612f70565b945050604086013567ffffffffffffffff81111561315a57613159614331565b5b61316688828901612fb3565b935050606086013567ffffffffffffffff81111561318757613186614331565b5b61319388828901612fb3565b925050608086013567ffffffffffffffff8111156131b4576131b3614331565b5b6131c088828901613020565b9150509295509295909350565b600080600080600060a086880312156131e9576131e8614336565b5b60006131f788828901612f70565b955050602061320888828901612f70565b94505060406132198882890161307c565b935050606061322a8882890161307c565b925050608086013567ffffffffffffffff81111561324b5761324a614331565b5b61325788828901613020565b9150509295509295909350565b6000806040838503121561327b5761327a614336565b5b600061328985828601612f70565b925050602061329a85828601612fe1565b9150509250929050565b600080604083850312156132bb576132ba614336565b5b60006132c985828601612f70565b92505060206132da8582860161307c565b9150509250929050565b600080604083850312156132fb576132fa614336565b5b600083013567ffffffffffffffff81111561331957613318614331565b5b61332585828601612f85565b925050602083013567ffffffffffffffff81111561334657613345614331565b5b61335285828601612fb3565b9150509250929050565b6000806040838503121561337357613372614336565b5b600083013567ffffffffffffffff81111561339157613390614331565b5b61339d85828601612fb3565b925050602083013567ffffffffffffffff8111156133be576133bd614331565b5b6133ca85828601612fb3565b9150509250929050565b6000602082840312156133ea576133e9614336565b5b60006133f884828501612ff6565b91505092915050565b60006020828403121561341757613416614336565b5b60006134258482850161300b565b91505092915050565b60006020828403121561344457613443614336565b5b600082013567ffffffffffffffff81111561346257613461614331565b5b61346e8482850161304e565b91505092915050565b60006020828403121561348d5761348c614336565b5b600061349b8482850161307c565b91505092915050565b600080604083850312156134bb576134ba614336565b5b60006134c98582860161307c565b92505060206134da8582860161307c565b9150509250929050565b60006134f08383613979565b60208301905092915050565b61350581614082565b82525050565b600061351682613ef6565b6135208185613f24565b935061352b83613ed1565b8060005b8381101561355c57815161354388826134e4565b975061354e83613f17565b92505060018101905061352f565b5085935050505092915050565b61357281614094565b82525050565b600061358382613f01565b61358d8185613f35565b935061359d818560208601614105565b6135a68161433b565b840191505092915050565b60006135bc82613f0c565b6135c68185613f51565b93506135d6818560208601614105565b6135df8161433b565b840191505092915050565b60006135f582613f0c565b6135ff8185613f62565b935061360f818560208601614105565b80840191505092915050565b6000815461362881614138565b6136328186613f62565b9450600182166000811461364d576001811461365e57613691565b60ff19831686528186019350613691565b61366785613ee1565b60005b838110156136895781548189015260018201915060208101905061366a565b838801955050505b50505092915050565b60006136a7602883613f51565b91506136b282614359565b604082019050919050565b60006136ca602683613f51565b91506136d5826143a8565b604082019050919050565b60006136ed600f83613f51565b91506136f8826143f7565b602082019050919050565b6000613710602a83613f51565b915061371b82614420565b604082019050919050565b6000613733602e83613f51565b915061373e8261446f565b604082019050919050565b6000613756601483613f51565b9150613761826144be565b602082019050919050565b6000613779602283613f51565b9150613784826144e7565b604082019050919050565b600061379c602583613f51565b91506137a782614536565b604082019050919050565b60006137bf602a83613f51565b91506137ca82614585565b604082019050919050565b60006137e2601d83613f51565b91506137ed826145d4565b602082019050919050565b6000613805602a83613f51565b9150613810826145fd565b604082019050919050565b6000613828600583613f62565b91506138338261464c565b600582019050919050565b600061384b602083613f51565b915061385682614675565b602082019050919050565b600061386e602183613f51565b91506138798261469e565b604082019050919050565b6000613891602583613f51565b915061389c826146ed565b604082019050919050565b60006138b4600083613f46565b91506138bf8261473c565b600082019050919050565b60006138d7602983613f51565b91506138e28261473f565b604082019050919050565b60006138fa602983613f51565b91506139058261478e565b604082019050919050565b600061391d602883613f51565b9150613928826147dd565b604082019050919050565b6000613940602183613f51565b915061394b8261482c565b604082019050919050565b6000613963603483613f51565b915061396e8261487b565b604082019050919050565b613982816140ec565b82525050565b613991816140ec565b82525050565b60006139a3828561361b565b91506139af82846135ea565b91506139ba8261381b565b91508190509392505050565b60006139d1826138a7565b9150819050919050565b60006020820190506139f060008301846134fc565b92915050565b600060a082019050613a0b60008301886134fc565b613a1860208301876134fc565b8181036040830152613a2a818661350b565b90508181036060830152613a3e818561350b565b90508181036080830152613a528184613578565b90509695505050505050565b600060a082019050613a7360008301886134fc565b613a8060208301876134fc565b613a8d6040830186613988565b613a9a6060830185613988565b8181036080830152613aac8184613578565b90509695505050505050565b60006020820190508181036000830152613ad2818461350b565b905092915050565b60006040820190508181036000830152613af4818561350b565b90508181036020830152613b08818461350b565b90509392505050565b6000602082019050613b266000830184613569565b92915050565b60006020820190508181036000830152613b4681846135b1565b905092915050565b60006020820190508181036000830152613b678161369a565b9050919050565b60006020820190508181036000830152613b87816136bd565b9050919050565b60006020820190508181036000830152613ba7816136e0565b9050919050565b60006020820190508181036000830152613bc781613703565b9050919050565b60006020820190508181036000830152613be781613726565b9050919050565b60006020820190508181036000830152613c0781613749565b9050919050565b60006020820190508181036000830152613c278161376c565b9050919050565b60006020820190508181036000830152613c478161378f565b9050919050565b60006020820190508181036000830152613c67816137b2565b9050919050565b60006020820190508181036000830152613c87816137d5565b9050919050565b60006020820190508181036000830152613ca7816137f8565b9050919050565b60006020820190508181036000830152613cc78161383e565b9050919050565b60006020820190508181036000830152613ce781613861565b9050919050565b60006020820190508181036000830152613d0781613884565b9050919050565b60006020820190508181036000830152613d27816138ca565b9050919050565b60006020820190508181036000830152613d47816138ed565b9050919050565b60006020820190508181036000830152613d6781613910565b9050919050565b60006020820190508181036000830152613d8781613933565b9050919050565b60006020820190508181036000830152613da781613956565b9050919050565b6000602082019050613dc36000830184613988565b92915050565b6000604082019050613dde6000830185613988565b613deb6020830184613988565b9392505050565b6000613dfc613e0d565b9050613e08828261416a565b919050565b6000604051905090565b600067ffffffffffffffff821115613e3257613e316142d1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e5e57613e5d6142d1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e8a57613e896142d1565b5b613e938261433b565b9050602081019050919050565b600067ffffffffffffffff821115613ebb57613eba6142d1565b5b613ec48261433b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f78826140ec565b9150613f83836140ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fb857613fb7614215565b5b828201905092915050565b6000613fce826140ec565b9150613fd9836140ec565b925082613fe957613fe8614244565b5b828204905092915050565b6000613fff826140ec565b915061400a836140ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561404357614042614215565b5b828202905092915050565b6000614059826140ec565b9150614064836140ec565b92508282101561407757614076614215565b5b828203905092915050565b600061408d826140cc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614123578082015181840152602081019050614108565b83811115614132576000848401525b50505050565b6000600282049050600182168061415057607f821691505b6020821081141561416457614163614273565b5b50919050565b6141738261433b565b810181811067ffffffffffffffff82111715614192576141916142d1565b5b80604052505050565b60006141a6826140ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141d9576141d8614215565b5b600182019050919050565b60006141ef826140ec565b91506141fa836140ec565b92508261420a57614209614244565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561431f5760046000803e61431c60005161434c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f74696d6520697320657870697265640000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f696e666c75656e6365202d2d2d20616d6f756e74000000000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e746564207468697320746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f796f752063616e206d696e74206c657373207468616e206d617820737570706c60008201527f7920706572207573657200000000000000000000000000000000000000000000602082015250565b7f63616e2774206d696e74207468697320746f6b656e20616e796d6f7265000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e7366657248656c7065723a204d415449435f5452414e534645525f4660008201527f41494c4544000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d10156148da5761495d565b6148e2613e0d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561490a57505061495d565b808201805167ffffffffffffffff811115614928575050505061495d565b80602083010160043d03850181111561494557505050505061495d565b6149548260200185018661416a565b82955050505050505b90565b61496981614082565b811461497457600080fd5b50565b61498081614094565b811461498b57600080fd5b50565b614997816140a0565b81146149a257600080fd5b50565b6149ae816140ec565b81146149b957600080fd5b5056fe576f726c642043757020516174617220323032322050726564696374696f6e204e4654a2646970667358221220eff215a2043ae9773a3bf8b29c4184f8353eda66a062cdda7c60cd0f771f809364736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5955466d7a72646751524d5a53595a673270447973784742764b41616e785248436e4a4b61685937334c4c6f2f
Deployed Bytecode
0x6080604052600436106102195760003560e01c806395d89b4111610123578063c7e489a7116100ab578063ecfb49a31161006f578063ecfb49a3146107ca578063f1432f9d146107f5578063f242432a1461081e578063f2fde38b14610847578063f9fa64391461087057610219565b8063c7e489a7146106e5578063ccb98ffc1461070e578063dcd0026814610737578063dcdab77e14610762578063e985e9c51461078d57610219565b8063a2309ff8116100f2578063a2309ff8146105ec578063b2c94ee614610617578063b4aa011d14610640578063bd85b0391461066b578063c457fb37146106a857610219565b806395d89b41146105425780639af2a6811461056d578063a0c5407814610598578063a22cb465146105c357610219565b80634e1273f4116101a65780636dbcf96b116101755780636dbcf96b1461046f578063715018a6146104985780637341ede4146104af57806387700c83146104ec5780638da5cb5b1461051757610219565b80634e1273f4146103c457806365fd766c14610401578063682498c51461042a578063688d22321461045357610219565b806311ffeaf2116101ed57806311ffeaf21461030057806312cf370c1461032b5780631b2ef1ca146103545780632eb2c2d6146103705780633197cbb61461039957610219565b8062fdd58e1461021e57806301ffc9a71461025b57806306fdde03146102985780630e89341c146102c3575b600080fd5b34801561022a57600080fd5b50610245600480360381019061024091906132a4565b61089b565b6040516102529190613dae565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906133d4565b610964565b60405161028f9190613b11565b60405180910390f35b3480156102a457600080fd5b506102ad610a46565b6040516102ba9190613b2c565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190613477565b610a62565b6040516102f79190613b2c565b60405180910390f35b34801561030c57600080fd5b50610315610a96565b60405161032291906139db565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613477565b610abc565b005b61036e600480360381019061036991906134a4565b610ace565b005b34801561037c57600080fd5b50610397600480360381019061039291906130fe565b610e48565b005b3480156103a557600080fd5b506103ae610ee9565b6040516103bb9190613dae565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906132e4565b610eef565b6040516103f89190613ab8565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190613477565b611008565b005b34801561043657600080fd5b50610451600480360381019061044c91906132a4565b61101a565b005b61046d6004803603810190610468919061335c565b6110de565b005b34801561047b57600080fd5b5061049660048036038101906104919190613477565b611518565b005b3480156104a457600080fd5b506104ad61152a565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906132a4565b61153e565b6040516104e39190613dae565b60405180910390f35b3480156104f857600080fd5b50610501611563565b60405161050e9190613dae565b60405180910390f35b34801561052357600080fd5b5061052c61156d565b60405161053991906139db565b60405180910390f35b34801561054e57600080fd5b50610557611597565b6040516105649190613b2c565b60405180910390f35b34801561057957600080fd5b506105826115d0565b60405161058f9190613dae565b60405180910390f35b3480156105a457600080fd5b506105ad6115da565b6040516105ba9190613b2c565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613264565b611668565b005b3480156105f857600080fd5b5061060161167e565b60405161060e9190613dae565b60405180910390f35b34801561062357600080fd5b5061063e6004803603810190610639919061342e565b611684565b005b34801561064c57600080fd5b506106556116a6565b6040516106629190613dae565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190613477565b6116b0565b60405161069f9190613dae565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613477565b6116c8565b6040516106dc9190613dae565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613477565b6116f2565b005b34801561071a57600080fd5b5061073560048036038101906107309190613477565b611704565b005b34801561074357600080fd5b5061074c611716565b6040516107599190613dae565b60405180910390f35b34801561076e57600080fd5b5061077761171c565b6040516107849190613dae565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af91906130be565b611726565b6040516107c19190613b11565b60405180910390f35b3480156107d657600080fd5b506107df6117ba565b6040516107ec9190613dae565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613477565b6117c0565b005b34801561082a57600080fd5b50610845600480360381019061084091906131cd565b6117d2565b005b34801561085357600080fd5b5061086e60048036038101906108699190613091565b611873565b005b34801561087c57600080fd5b506108856118f7565b6040516108929190613dae565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613bae565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3f5750610a3e82611901565b5b9050919050565b6040518060600160405280602381526020016149bd6023913981565b60606010610a6f8361196b565b604051602001610a80929190613997565b6040516020818303038152906040529050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ac4611a43565b8060078190555050565b600a544210610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990613b8e565b60405180910390fd5b6000600d6000848152602001908152602001600020549050600854821115610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6690613c4e565b60405180910390fd5b600854600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205410610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613c0e565b60405180910390fd5b6009548282610c129190613f6d565b10610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990613c6e565b60405180910390fd5b60006008546007548484610c669190613f6d565b610c7091906141e4565b108015610c7e575060075482115b15610d02576007548383610c929190613f6d565b610c9c91906141e4565b610cb08484610cab9190613f6d565b611ac1565b610cba9190613ff4565b6007548484610cc99190613f6d565b610cd391906141e4565b84610cde919061404e565b610ce784611ac1565b610cf19190613ff4565b610cfb9190613f6d565b9050610d19565b82610d0c83611ac1565b610d169190613ff4565b90505b803414610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613bee565b60405180910390fd5b610d7633858560405180602001604052806000815250611af2565b82600d60008681526020019081526020016000206000828254610d999190613f6d565b9250508190555082600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000828254610e009190613f6d565b9250508190555082600b6000828254610e199190613f6d565b9250508190555080600c6000828254610e329190613f6d565b92505081905550610e4234611ca3565b50505050565b610e50611d75565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e965750610e9585610e90611d75565b611726565b5b610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613bce565b60405180910390fd5b610ee28585858585611d7d565b5050505050565b600a5481565b60608151835114610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613d2e565b60405180910390fd5b6000835167ffffffffffffffff811115610f5257610f516142d1565b5b604051908082528060200260200182016040528015610f805781602001602082028036833780820191505090505b50905060005b8451811015610ffd57610fcd858281518110610fa557610fa46142a2565b5b6020026020010151858381518110610fc057610fbf6142a2565b5b602002602001015161089b565b828281518110610fe057610fdf6142a2565b5b60200260200101818152505080610ff69061419b565b9050610f86565b508091505092915050565b611010611a43565b8060088190555050565b611022611a43565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990613cce565b60405180910390fd5b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806012819055505050565b600a544210611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990613b8e565b60405180910390fd5b600080600090505b8351811015611389576000848281518110611148576111476142a2565b5b602002602001015190506000848381518110611167576111666142a2565b5b602002602001015190506000600d60008481526020019081526020016000205490506008548211156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590613c4e565b60405180910390fd5b600854600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205410611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613c0e565b60405180910390fd5b60095482826112719190613f6d565b11156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613c6e565b60405180910390fd5b6000600754826112c291906141e4565b90506000816007546112d4919061404e565b9050600081851061134b57600082866112ed919061404e565b905060008161130688886113019190613f6d565b611ac1565b6113109190613ff4565b905060008288611320919061404e565b61132988611ac1565b6113339190613ff4565b905080826113419190613f6d565b9350505050611362565b8461135585611ac1565b61135f9190613ff4565b90505b808861136e9190613f6d565b975050505050505080806113819061419b565b91505061112a565b5080600c600082825461139c9190613f6d565b925050819055508034146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613bee565b60405180910390fd5b6114003384846040518060200160405280600081525061209f565b60005b8351811015611509576000848281518110611421576114206142a2565b5b6020026020010151905060008483815181106114405761143f6142a2565b5b6020026020010151905080600d6000848152602001908152602001600020600082825461146d9190613f6d565b9250508190555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008282546114d49190613f6d565b9250508190555080600b60008282546114ed9190613f6d565b92505081905550505080806115019061419b565b915050611403565b5061151334611ca3565b505050565b611520611a43565b8060098190555050565b611532611a43565b61153c60006122cc565b565b600e602052816000526040600020602052806000526040600020600091509150505481565b6000600654905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f574351504e00000000000000000000000000000000000000000000000000000081525081565b6000600554905090565b601080546115e790614138565b80601f016020809104026020016040519081016040528092919081815260200182805461161390614138565b80156116605780601f1061163557610100808354040283529160200191611660565b820191906000526020600020905b81548152906001019060200180831161164357829003601f168201915b505050505081565b61167a611673611d75565b8383612392565b5050565b600b5481565b61168c611a43565b80601090805190602001906116a2929190612d69565b5050565b6000600754905090565b600d6020528060005260406000206000915090505481565b600080600d60008481526020019081526020016000205490506116ea81611ac1565b915050919050565b6116fa611a43565b8060068190555050565b61170c611a43565b80600a8190555050565b60125481565b6000600854905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b6117c8611a43565b8060058190555050565b6117da611d75565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611820575061181f8561181a611d75565b611726565b5b61185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185690613bce565b60405180910390fd5b61186c85858585856124ff565b5050505050565b61187b611a43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613b6e565b60405180910390fd5b6118f4816122cc565b50565b6000600954905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600161197a8461279b565b01905060008167ffffffffffffffff811115611999576119986142d1565b5b6040519080825280601f01601f1916602001820160405280156119cb5781602001600182028036833780820191505090505b509050600082602001820190505b600115611a38578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a2257611a21614244565b5b0494506000851415611a3357611a38565b6119d9565b819350505050919050565b611a4b611d75565b73ffffffffffffffffffffffffffffffffffffffff16611a6961156d565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690613cae565b60405180910390fd5b565b600060065460075483611ad49190613fc3565b611ade9190613ff4565b600554611aeb9190613f6d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613d6e565b60405180910390fd5b6000611b6c611d75565b90506000611b79856128ee565b90506000611b86856128ee565b9050611b9783600089858589612968565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf69190613f6d565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c74929190613dc9565b60405180910390a4611c8b83600089858589612970565b611c9a83600089898989612978565b50505050505050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611ceb906139c6565b60006040518083038185875af1925050503d8060008114611d28576040519150601f19603f3d011682016040523d82523d6000602084013e611d2d565b606091505b5050905080611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890613cee565b60405180910390fd5b5050565b600033905090565b8151835114611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890613d4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613c2e565b60405180910390fd5b6000611e3b611d75565b9050611e4b818787878787612968565b60005b8451811015611ffc576000858281518110611e6c57611e6b6142a2565b5b602002602001015190506000858381518110611e8b57611e8a6142a2565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390613c8e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fe19190613f6d565b9250508190555050505080611ff59061419b565b9050611e4e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612073929190613ada565b60405180910390a4612089818787878787612970565b612097818787878787612b5f565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690613d6e565b60405180910390fd5b8151835114612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90613d4e565b60405180910390fd5b600061215d611d75565b905061216e81600087878787612968565b60005b84518110156122275783818151811061218d5761218c6142a2565b5b60200260200101516000808784815181106121ab576121aa6142a2565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220d9190613f6d565b92505081905550808061221f9061419b565b915050612171565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161229f929190613ada565b60405180910390a46122b681600087878787612970565b6122c581600087878787612b5f565b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890613d0e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f29190613b11565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690613c2e565b60405180910390fd5b6000612579611d75565b90506000612586856128ee565b90506000612593856128ee565b90506125a3838989858589612968565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263190613c8e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ef9190613f6d565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161276c929190613dc9565b60405180910390a4612782848a8a86868a612970565b612790848a8a8a8a8a612978565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127f9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127ef576127ee614244565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612836576d04ee2d6d415b85acef8100000000838161282c5761282b614244565b5b0492506020810190505b662386f26fc10000831061286557662386f26fc10000838161285b5761285a614244565b5b0492506010810190505b6305f5e100831061288e576305f5e100838161288457612883614244565b5b0492506008810190505b61271083106128b35761271083816128a9576128a8614244565b5b0492506004810190505b606483106128d657606483816128cc576128cb614244565b5b0492506002810190505b600a83106128e5576001810190505b80915050919050565b60606000600167ffffffffffffffff81111561290d5761290c6142d1565b5b60405190808252806020026020018201604052801561293b5781602001602082028036833780820191505090505b5090508281600081518110612953576129526142a2565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6129978473ffffffffffffffffffffffffffffffffffffffff16612d46565b15612b57578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016129dd959493929190613a5e565b602060405180830381600087803b1580156129f757600080fd5b505af1925050508015612a2857506040513d601f19601f82011682018060405250810190612a259190613401565b60015b612ace57612a34614300565b806308c379a01415612a915750612a496148ca565b80612a545750612a93565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a889190613b2c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac590613d8e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4c90613b4e565b60405180910390fd5b505b505050505050565b612b7e8473ffffffffffffffffffffffffffffffffffffffff16612d46565b15612d3e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612bc49594939291906139f6565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c9190613401565b60015b612cb557612c1b614300565b806308c379a01415612c785750612c306148ca565b80612c3b5750612c7a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f9190613b2c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cac90613d8e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3390613b4e565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612d7590614138565b90600052602060002090601f016020900481019282612d975760008555612dde565b82601f10612db057805160ff1916838001178555612dde565b82800160010185558215612dde579182015b82811115612ddd578251825591602001919060010190612dc2565b5b509050612deb9190612def565b5090565b5b80821115612e08576000816000905550600101612df0565b5090565b6000612e1f612e1a84613e17565b613df2565b90508083825260208201905082856020860282011115612e4257612e41614327565b5b60005b85811015612e725781612e588882612f70565b845260208401935060208301925050600181019050612e45565b5050509392505050565b6000612e8f612e8a84613e43565b613df2565b90508083825260208201905082856020860282011115612eb257612eb1614327565b5b60005b85811015612ee25781612ec8888261307c565b845260208401935060208301925050600181019050612eb5565b5050509392505050565b6000612eff612efa84613e6f565b613df2565b905082815260208101848484011115612f1b57612f1a61432c565b5b612f268482856140f6565b509392505050565b6000612f41612f3c84613ea0565b613df2565b905082815260208101848484011115612f5d57612f5c61432c565b5b612f688482856140f6565b509392505050565b600081359050612f7f81614960565b92915050565b600082601f830112612f9a57612f99614322565b5b8135612faa848260208601612e0c565b91505092915050565b600082601f830112612fc857612fc7614322565b5b8135612fd8848260208601612e7c565b91505092915050565b600081359050612ff081614977565b92915050565b6000813590506130058161498e565b92915050565b60008151905061301a8161498e565b92915050565b600082601f83011261303557613034614322565b5b8135613045848260208601612eec565b91505092915050565b600082601f83011261306357613062614322565b5b8135613073848260208601612f2e565b91505092915050565b60008135905061308b816149a5565b92915050565b6000602082840312156130a7576130a6614336565b5b60006130b584828501612f70565b91505092915050565b600080604083850312156130d5576130d4614336565b5b60006130e385828601612f70565b92505060206130f485828601612f70565b9150509250929050565b600080600080600060a0868803121561311a57613119614336565b5b600061312888828901612f70565b955050602061313988828901612f70565b945050604086013567ffffffffffffffff81111561315a57613159614331565b5b61316688828901612fb3565b935050606086013567ffffffffffffffff81111561318757613186614331565b5b61319388828901612fb3565b925050608086013567ffffffffffffffff8111156131b4576131b3614331565b5b6131c088828901613020565b9150509295509295909350565b600080600080600060a086880312156131e9576131e8614336565b5b60006131f788828901612f70565b955050602061320888828901612f70565b94505060406132198882890161307c565b935050606061322a8882890161307c565b925050608086013567ffffffffffffffff81111561324b5761324a614331565b5b61325788828901613020565b9150509295509295909350565b6000806040838503121561327b5761327a614336565b5b600061328985828601612f70565b925050602061329a85828601612fe1565b9150509250929050565b600080604083850312156132bb576132ba614336565b5b60006132c985828601612f70565b92505060206132da8582860161307c565b9150509250929050565b600080604083850312156132fb576132fa614336565b5b600083013567ffffffffffffffff81111561331957613318614331565b5b61332585828601612f85565b925050602083013567ffffffffffffffff81111561334657613345614331565b5b61335285828601612fb3565b9150509250929050565b6000806040838503121561337357613372614336565b5b600083013567ffffffffffffffff81111561339157613390614331565b5b61339d85828601612fb3565b925050602083013567ffffffffffffffff8111156133be576133bd614331565b5b6133ca85828601612fb3565b9150509250929050565b6000602082840312156133ea576133e9614336565b5b60006133f884828501612ff6565b91505092915050565b60006020828403121561341757613416614336565b5b60006134258482850161300b565b91505092915050565b60006020828403121561344457613443614336565b5b600082013567ffffffffffffffff81111561346257613461614331565b5b61346e8482850161304e565b91505092915050565b60006020828403121561348d5761348c614336565b5b600061349b8482850161307c565b91505092915050565b600080604083850312156134bb576134ba614336565b5b60006134c98582860161307c565b92505060206134da8582860161307c565b9150509250929050565b60006134f08383613979565b60208301905092915050565b61350581614082565b82525050565b600061351682613ef6565b6135208185613f24565b935061352b83613ed1565b8060005b8381101561355c57815161354388826134e4565b975061354e83613f17565b92505060018101905061352f565b5085935050505092915050565b61357281614094565b82525050565b600061358382613f01565b61358d8185613f35565b935061359d818560208601614105565b6135a68161433b565b840191505092915050565b60006135bc82613f0c565b6135c68185613f51565b93506135d6818560208601614105565b6135df8161433b565b840191505092915050565b60006135f582613f0c565b6135ff8185613f62565b935061360f818560208601614105565b80840191505092915050565b6000815461362881614138565b6136328186613f62565b9450600182166000811461364d576001811461365e57613691565b60ff19831686528186019350613691565b61366785613ee1565b60005b838110156136895781548189015260018201915060208101905061366a565b838801955050505b50505092915050565b60006136a7602883613f51565b91506136b282614359565b604082019050919050565b60006136ca602683613f51565b91506136d5826143a8565b604082019050919050565b60006136ed600f83613f51565b91506136f8826143f7565b602082019050919050565b6000613710602a83613f51565b915061371b82614420565b604082019050919050565b6000613733602e83613f51565b915061373e8261446f565b604082019050919050565b6000613756601483613f51565b9150613761826144be565b602082019050919050565b6000613779602283613f51565b9150613784826144e7565b604082019050919050565b600061379c602583613f51565b91506137a782614536565b604082019050919050565b60006137bf602a83613f51565b91506137ca82614585565b604082019050919050565b60006137e2601d83613f51565b91506137ed826145d4565b602082019050919050565b6000613805602a83613f51565b9150613810826145fd565b604082019050919050565b6000613828600583613f62565b91506138338261464c565b600582019050919050565b600061384b602083613f51565b915061385682614675565b602082019050919050565b600061386e602183613f51565b91506138798261469e565b604082019050919050565b6000613891602583613f51565b915061389c826146ed565b604082019050919050565b60006138b4600083613f46565b91506138bf8261473c565b600082019050919050565b60006138d7602983613f51565b91506138e28261473f565b604082019050919050565b60006138fa602983613f51565b91506139058261478e565b604082019050919050565b600061391d602883613f51565b9150613928826147dd565b604082019050919050565b6000613940602183613f51565b915061394b8261482c565b604082019050919050565b6000613963603483613f51565b915061396e8261487b565b604082019050919050565b613982816140ec565b82525050565b613991816140ec565b82525050565b60006139a3828561361b565b91506139af82846135ea565b91506139ba8261381b565b91508190509392505050565b60006139d1826138a7565b9150819050919050565b60006020820190506139f060008301846134fc565b92915050565b600060a082019050613a0b60008301886134fc565b613a1860208301876134fc565b8181036040830152613a2a818661350b565b90508181036060830152613a3e818561350b565b90508181036080830152613a528184613578565b90509695505050505050565b600060a082019050613a7360008301886134fc565b613a8060208301876134fc565b613a8d6040830186613988565b613a9a6060830185613988565b8181036080830152613aac8184613578565b90509695505050505050565b60006020820190508181036000830152613ad2818461350b565b905092915050565b60006040820190508181036000830152613af4818561350b565b90508181036020830152613b08818461350b565b90509392505050565b6000602082019050613b266000830184613569565b92915050565b60006020820190508181036000830152613b4681846135b1565b905092915050565b60006020820190508181036000830152613b678161369a565b9050919050565b60006020820190508181036000830152613b87816136bd565b9050919050565b60006020820190508181036000830152613ba7816136e0565b9050919050565b60006020820190508181036000830152613bc781613703565b9050919050565b60006020820190508181036000830152613be781613726565b9050919050565b60006020820190508181036000830152613c0781613749565b9050919050565b60006020820190508181036000830152613c278161376c565b9050919050565b60006020820190508181036000830152613c478161378f565b9050919050565b60006020820190508181036000830152613c67816137b2565b9050919050565b60006020820190508181036000830152613c87816137d5565b9050919050565b60006020820190508181036000830152613ca7816137f8565b9050919050565b60006020820190508181036000830152613cc78161383e565b9050919050565b60006020820190508181036000830152613ce781613861565b9050919050565b60006020820190508181036000830152613d0781613884565b9050919050565b60006020820190508181036000830152613d27816138ca565b9050919050565b60006020820190508181036000830152613d47816138ed565b9050919050565b60006020820190508181036000830152613d6781613910565b9050919050565b60006020820190508181036000830152613d8781613933565b9050919050565b60006020820190508181036000830152613da781613956565b9050919050565b6000602082019050613dc36000830184613988565b92915050565b6000604082019050613dde6000830185613988565b613deb6020830184613988565b9392505050565b6000613dfc613e0d565b9050613e08828261416a565b919050565b6000604051905090565b600067ffffffffffffffff821115613e3257613e316142d1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e5e57613e5d6142d1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e8a57613e896142d1565b5b613e938261433b565b9050602081019050919050565b600067ffffffffffffffff821115613ebb57613eba6142d1565b5b613ec48261433b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f78826140ec565b9150613f83836140ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fb857613fb7614215565b5b828201905092915050565b6000613fce826140ec565b9150613fd9836140ec565b925082613fe957613fe8614244565b5b828204905092915050565b6000613fff826140ec565b915061400a836140ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561404357614042614215565b5b828202905092915050565b6000614059826140ec565b9150614064836140ec565b92508282101561407757614076614215565b5b828203905092915050565b600061408d826140cc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614123578082015181840152602081019050614108565b83811115614132576000848401525b50505050565b6000600282049050600182168061415057607f821691505b6020821081141561416457614163614273565b5b50919050565b6141738261433b565b810181811067ffffffffffffffff82111715614192576141916142d1565b5b80604052505050565b60006141a6826140ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141d9576141d8614215565b5b600182019050919050565b60006141ef826140ec565b91506141fa836140ec565b92508261420a57614209614244565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561431f5760046000803e61431c60005161434c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f74696d6520697320657870697265640000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f696e666c75656e6365202d2d2d20616d6f756e74000000000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e746564207468697320746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f796f752063616e206d696e74206c657373207468616e206d617820737570706c60008201527f7920706572207573657200000000000000000000000000000000000000000000602082015250565b7f63616e2774206d696e74207468697320746f6b656e20616e796d6f7265000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e7366657248656c7065723a204d415449435f5452414e534645525f4660008201527f41494c4544000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d10156148da5761495d565b6148e2613e0d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561490a57505061495d565b808201805167ffffffffffffffff811115614928575050505061495d565b80602083010160043d03850181111561494557505050505061495d565b6149548260200185018661416a565b82955050505050505b90565b61496981614082565b811461497457600080fd5b50565b61498081614094565b811461498b57600080fd5b50565b614997816140a0565b81146149a257600080fd5b50565b6149ae816140ec565b81146149b957600080fd5b5056fe576f726c642043757020516174617220323032322050726564696374696f6e204e4654a2646970667358221220eff215a2043ae9773a3bf8b29c4184f8353eda66a062cdda7c60cd0f771f809364736f6c63430008070033
Deployed Bytecode Sourcemap
65335:6651:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49665:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48688:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65627:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66517:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66235:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71439:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66894:1189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51608:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65747:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50061:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71549:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70841:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68091:1842;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71677:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27942:103;;;;;;;;;;;;;:::i;:::-;;65993:67;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70245:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27294:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65701:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70144:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66119:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50658:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65823:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66789:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70348:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65940:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71807:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71329:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71123:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66406:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70451:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50885:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65884:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71221:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51125:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28200:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70562:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49665:230;49751:7;49798:1;49779:21;;:7;:21;;;;49771:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49865:9;:13;49875:2;49865:13;;;;;;;;;;;:22;49879:7;49865:22;;;;;;;;;;;;;;;;49858:29;;49665:230;;;;:::o;48688:310::-;48790:4;48842:26;48827:41;;;:11;:41;;;;:110;;;;48900:37;48885:52;;;:11;:52;;;;48827:110;:163;;;;48954:36;48978:11;48954:23;:36::i;:::-;48827:163;48807:183;;48688:310;;;:::o;65627:67::-;;;;;;;;;;;;;;;;;;;:::o;66517:264::-;66578:13;66667:9;66695:26;66712:8;66695:16;:26::i;:::-;66632:130;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66604:169;;66517:264;;;:::o;66235:74::-;;;;;;;;;;;;;:::o;71439:102::-;27180:13;:11;:13::i;:::-;71525:8:::1;71510:12;:23;;;;71439:102:::0;:::o;66894:1189::-;66994:7;;66976:15;:25;66968:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;67032:16;67051:11;:21;67063:8;67051:21;;;;;;;;;;;;67032:40;;67103:16;;67093:6;:26;;67085:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;67222:16;;67185:12;:24;67198:10;67185:24;;;;;;;;;;;;;;;:34;67210:8;67185:34;;;;;;;;;;;;:53;67177:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;67316:17;;67307:6;67296:8;:17;;;;:::i;:::-;:37;67288:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;67378:14;67446:16;;67430:12;;67420:6;67409:8;:17;;;;:::i;:::-;67408:34;;;;:::i;:::-;67407:55;:82;;;;;67477:12;;67466:8;:23;67407:82;67403:358;;;67657:12;;67647:6;67636:8;:17;;;;:::i;:::-;67635:34;;;;:::i;:::-;67594:37;67624:6;67613:8;:17;;;;:::i;:::-;67594:18;:37::i;:::-;:76;;;;:::i;:::-;67578:12;;67568:6;67557:8;:17;;;;:::i;:::-;67556:34;;;;:::i;:::-;67547:6;:43;;;;:::i;:::-;67515:28;67534:8;67515:18;:28::i;:::-;:76;;;;:::i;:::-;:155;;;;:::i;:::-;67506:164;;67403:358;;;67743:6;67712:28;67731:8;67712:18;:28::i;:::-;:37;;;;:::i;:::-;67703:46;;67403:358;67794:6;67781:9;:19;67773:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;67836:39;67842:10;67854:8;67864:6;67836:39;;;;;;;;;;;;:5;:39::i;:::-;67911:6;67886:11;:21;67898:8;67886:21;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;67966:6;67928:12;:24;67941:10;67928:24;;;;;;;;;;;;;;;:34;67953:8;67928:34;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;67998:6;67983:11;;:21;;;;;;;:::i;:::-;;;;;;;;68028:6;68015:9;;:19;;;;;;;:::i;:::-;;;;;;;;68047:28;68065:9;68047:17;:28::i;:::-;66957:1126;;66894:1189;;:::o;51608:438::-;51849:12;:10;:12::i;:::-;51841:20;;:4;:20;;;:60;;;;51865:36;51882:4;51888:12;:10;:12::i;:::-;51865:16;:36::i;:::-;51841:60;51819:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;51986:52;52009:4;52015:2;52019:3;52024:7;52033:4;51986:22;:52::i;:::-;51608:438;;;;;:::o;65747:35::-;;;;:::o;50061:524::-;50217:16;50278:3;:10;50259:8;:15;:29;50251:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50347:30;50394:8;:15;50380:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50347:63;;50428:9;50423:122;50447:8;:15;50443:1;:19;50423:122;;;50503:30;50513:8;50522:1;50513:11;;;;;;;;:::i;:::-;;;;;;;;50526:3;50530:1;50526:6;;;;;;;;:::i;:::-;;;;;;;;50503:9;:30::i;:::-;50484:13;50498:1;50484:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;50464:3;;;;:::i;:::-;;;50423:122;;;;50564:13;50557:20;;;50061:524;;;;:::o;71549:120::-;27180:13;:11;:13::i;:::-;71648::::1;71629:16;:32;;;;71549:120:::0;:::o;70841:274::-;27180:13;:11;:13::i;:::-;70981:1:::1;70951:32;;:18;:32;;;;70943:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;71049:18;71032:14;;:35;;;;;;;;;;;;;;;;;;71092:15;71078:11;:29;;;;70841:274:::0;;:::o;68091:1842::-;68214:7;;68196:15;:25;68188:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;68252:19;68287:9;68299:1;68287:13;;68282:1165;68306:4;:11;68302:1;:15;68282:1165;;;68339:11;68353:4;68358:1;68353:7;;;;;;;;:::i;:::-;;;;;;;;68339:21;;68375:14;68392:10;68403:1;68392:13;;;;;;;;:::i;:::-;;;;;;;;68375:30;;68422:16;68441:11;:16;68453:3;68441:16;;;;;;;;;;;;68422:35;;68490:16;;68480:6;:26;;68472:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68608:16;;68576:12;:24;68589:10;68576:24;;;;;;;;;;;;;;;:29;68601:3;68576:29;;;;;;;;;;;;:48;68568:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68707:17;;68697:6;68686:8;:17;;;;:::i;:::-;:38;;68678:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;68775:18;68807:12;;68796:8;:23;;;;:::i;:::-;68775:44;;68834:22;68874:10;68859:12;;:25;;;;:::i;:::-;68834:50;;68899:14;68942;68932:6;:24;68928:470;;68977:23;69012:14;69003:6;:23;;;;:::i;:::-;68977:49;;69045:23;69111:15;69071:37;69101:6;69090:8;:17;;;;:::i;:::-;69071:18;:37::i;:::-;:55;;;;:::i;:::-;69045:81;;69145:26;69215:15;69206:6;:24;;;;:::i;:::-;69174:28;69193:8;69174:18;:28::i;:::-;:57;;;;:::i;:::-;69145:86;;69277:18;69259:15;:36;;;;:::i;:::-;69250:45;;68958:353;;;68928:470;;;69376:6;69345:28;69364:8;69345:18;:28::i;:::-;:37;;;;:::i;:::-;69336:46;;68928:470;69429:6;69414:21;;;;;:::i;:::-;;;68324:1123;;;;;;68319:3;;;;;:::i;:::-;;;;68282:1165;;;;69472:11;69459:9;;:24;;;;;;;:::i;:::-;;;;;;;;69515:11;69502:9;:24;69494:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69562:44;69573:10;69585:4;69591:10;69562:44;;;;;;;;;;;;:10;:44::i;:::-;69624:9;69619:266;69643:4;:11;69639:1;:15;69619:266;;;69676:11;69690:4;69695:1;69690:7;;;;;;;;:::i;:::-;;;;;;;;69676:21;;69712:14;69729:10;69740:1;69729:13;;;;;;;;:::i;:::-;;;;;;;;69712:30;;69777:6;69757:11;:16;69769:3;69757:16;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;69831:6;69798:12;:24;69811:10;69798:24;;;;;;;;;;;;;;;:29;69823:3;69798:29;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;69867:6;69852:11;;:21;;;;;;;:::i;:::-;;;;;;;;69661:224;;69656:3;;;;;:::i;:::-;;;;69619:266;;;;69897:28;69915:9;69897:17;:28::i;:::-;68177:1756;68091:1842;;:::o;71677:122::-;27180:13;:11;:13::i;:::-;71778::::1;71758:17;:33;;;;71677:122:::0;:::o;27942:103::-;27180:13;:11;:13::i;:::-;28007:30:::1;28034:1;28007:18;:30::i;:::-;27942:103::o:0;65993:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70245:95::-;70293:7;70320:12;;70313:19;;70245:95;:::o;27294:87::-;27340:7;27367:6;;;;;;;;;;;27360:13;;27294:87;:::o;65701:39::-;;;;;;;;;;;;;;;;;;;:::o;70144:93::-;70191:7;70218:11;;70211:18;;70144:93;:::o;66119:109::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50658:155::-;50753:52;50772:12;:10;:12::i;:::-;50786:8;50796;50753:18;:52::i;:::-;50658:155;;:::o;65823:26::-;;;;:::o;66789:97::-;27180:13;:11;:13::i;:::-;66872:6:::1;66860:9;:18;;;;;;;;;;;;:::i;:::-;;66789:97:::0;:::o;70348:95::-;70396:7;70423:12;;70416:19;;70348:95;:::o;65940:46::-;;;;;;;;;;;;;;;;;:::o;71807:176::-;71869:7;71889:16;71908:11;:21;71920:8;71908:21;;;;;;;;;;;;71889:40;;71947:28;71966:8;71947:18;:28::i;:::-;71940:35;;;71807:176;;;:::o;71329:102::-;27180:13;:11;:13::i;:::-;71415:8:::1;71400:12;:23;;;;71329:102:::0;:::o;71123:90::-;27180:13;:11;:13::i;:::-;71198:7:::1;71188;:17;;;;71123:90:::0;:::o;66406:34::-;;;;:::o;70451:103::-;70503:7;70530:16;;70523:23;;70451:103;:::o;50885:168::-;50984:4;51008:18;:27;51027:7;51008:27;;;;;;;;;;;;;;;:37;51036:8;51008:37;;;;;;;;;;;;;;;;;;;;;;;;;51001:44;;50885:168;;;;:::o;65884:24::-;;;;:::o;71221:100::-;27180:13;:11;:13::i;:::-;71305:8:::1;71291:11;:22;;;;71221:100:::0;:::o;51125:406::-;51341:12;:10;:12::i;:::-;51333:20;;:4;:20;;;:60;;;;51357:36;51374:4;51380:12;:10;:12::i;:::-;51357:16;:36::i;:::-;51333:60;51311:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;51478:45;51496:4;51502:2;51506;51510:6;51518:4;51478:17;:45::i;:::-;51125:406;;;;;:::o;28200:201::-;27180:13;:11;:13::i;:::-;28309:1:::1;28289:22;;:8;:22;;;;28281:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28365:28;28384:8;28365:18;:28::i;:::-;28200:201:::0;:::o;70562:105::-;70615:7;70642:17;;70635:24;;70562:105;:::o;39969:157::-;40054:4;40093:25;40078:40;;;:11;:40;;;;40071:47;;39969:157;;;:::o;13285:716::-;13341:13;13392:14;13429:1;13409:17;13420:5;13409:10;:17::i;:::-;:21;13392:38;;13445:20;13479:6;13468:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13445:41;;13501:11;13630:6;13626:2;13622:15;13614:6;13610:28;13603:35;;13667:288;13674:4;13667:288;;;13699:5;;;;;;;;13841:8;13836:2;13829:5;13825:14;13820:30;13815:3;13807:44;13897:2;13888:11;;;;;;:::i;:::-;;;;;13931:1;13922:5;:10;13918:21;;;13934:5;;13918:21;13667:288;;;13976:6;13969:13;;;;;13285:716;;;:::o;27459:132::-;27534:12;:10;:12::i;:::-;27523:23;;:7;:5;:7::i;:::-;:23;;;27515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27459:132::o;70675:158::-;70744:7;70813:12;;70797;;70786:8;:23;;;;:::i;:::-;70785:40;;;;:::i;:::-;70771:11;;:54;;;;:::i;:::-;70764:61;;70675:158;;;:::o;56306:729::-;56473:1;56459:16;;:2;:16;;;;56451:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56526:16;56545:12;:10;:12::i;:::-;56526:31;;56568:20;56591:21;56609:2;56591:17;:21::i;:::-;56568:44;;56623:24;56650:25;56668:6;56650:17;:25::i;:::-;56623:52;;56688:66;56709:8;56727:1;56731:2;56735:3;56740:7;56749:4;56688:20;:66::i;:::-;56788:6;56767:9;:13;56777:2;56767:13;;;;;;;;;;;:17;56781:2;56767:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;56847:2;56810:52;;56843:1;56810:52;;56825:8;56810:52;;;56851:2;56855:6;56810:52;;;;;;;:::i;:::-;;;;;;;;56875:65;56895:8;56913:1;56917:2;56921:3;56926:7;56935:4;56875:19;:65::i;:::-;56953:74;56984:8;57002:1;57006:2;57010;57014:6;57022:4;56953:30;:74::i;:::-;56440:595;;;56306:729;;;;:::o;69941:195::-;70004:12;70021:14;;;;;;;;;;;:19;;70049:6;70021:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70003:57;;;70079:7;70071:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69992:144;69941:195;:::o;25845:98::-;25898:7;25925:10;25918:17;;25845:98;:::o;53842:1146::-;54069:7;:14;54055:3;:10;:28;54047:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54161:1;54147:16;;:2;:16;;;;54139:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54218:16;54237:12;:10;:12::i;:::-;54218:31;;54262:60;54283:8;54293:4;54299:2;54303:3;54308:7;54317:4;54262:20;:60::i;:::-;54340:9;54335:421;54359:3;:10;54355:1;:14;54335:421;;;54391:10;54404:3;54408:1;54404:6;;;;;;;;:::i;:::-;;;;;;;;54391:19;;54425:14;54442:7;54450:1;54442:10;;;;;;;;:::i;:::-;;;;;;;;54425:27;;54469:19;54491:9;:13;54501:2;54491:13;;;;;;;;;;;:19;54505:4;54491:19;;;;;;;;;;;;;;;;54469:41;;54548:6;54533:11;:21;;54525:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54681:6;54667:11;:20;54645:9;:13;54655:2;54645:13;;;;;;;;;;;:19;54659:4;54645:19;;;;;;;;;;;;;;;:42;;;;54738:6;54717:9;:13;54727:2;54717:13;;;;;;;;;;;:17;54731:2;54717:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;54376:380;;;54371:3;;;;:::i;:::-;;;54335:421;;;;54803:2;54773:47;;54797:4;54773:47;;54787:8;54773:47;;;54807:3;54812:7;54773:47;;;;;;;:::i;:::-;;;;;;;;54833:59;54853:8;54863:4;54869:2;54873:3;54878:7;54887:4;54833:19;:59::i;:::-;54905:75;54941:8;54951:4;54957:2;54961:3;54966:7;54975:4;54905:35;:75::i;:::-;54036:952;53842:1146;;;;;:::o;57438:813::-;57630:1;57616:16;;:2;:16;;;;57608:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57703:7;:14;57689:3;:10;:28;57681:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57775:16;57794:12;:10;:12::i;:::-;57775:31;;57819:66;57840:8;57858:1;57862:2;57866:3;57871:7;57880:4;57819:20;:66::i;:::-;57903:9;57898:103;57922:3;:10;57918:1;:14;57898:103;;;57979:7;57987:1;57979:10;;;;;;;;:::i;:::-;;;;;;;;57954:9;:17;57964:3;57968:1;57964:6;;;;;;;;:::i;:::-;;;;;;;;57954:17;;;;;;;;;;;:21;57972:2;57954:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;57934:3;;;;;:::i;:::-;;;;57898:103;;;;58054:2;58018:53;;58050:1;58018:53;;58032:8;58018:53;;;58058:3;58063:7;58018:53;;;;;;;:::i;:::-;;;;;;;;58084:65;58104:8;58122:1;58126:2;58130:3;58135:7;58144:4;58084:19;:65::i;:::-;58162:81;58198:8;58216:1;58220:2;58224:3;58229:7;58238:4;58162:35;:81::i;:::-;57597:654;57438:813;;;;:::o;28561:191::-;28635:16;28654:6;;;;;;;;;;;28635:25;;28680:8;28671:6;;:17;;;;;;;;;;;;;;;;;;28735:8;28704:40;;28725:8;28704:40;;;;;;;;;;;;28624:128;28561:191;:::o;60719:331::-;60874:8;60865:17;;:5;:17;;;;60857:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60977:8;60939:18;:25;60958:5;60939:25;;;;;;;;;;;;;;;:35;60965:8;60939:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;61023:8;61001:41;;61016:5;61001:41;;;61033:8;61001:41;;;;;;:::i;:::-;;;;;;;;60719:331;;;:::o;52510:974::-;52712:1;52698:16;;:2;:16;;;;52690:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52769:16;52788:12;:10;:12::i;:::-;52769:31;;52811:20;52834:21;52852:2;52834:17;:21::i;:::-;52811:44;;52866:24;52893:25;52911:6;52893:17;:25::i;:::-;52866:52;;52931:60;52952:8;52962:4;52968:2;52972:3;52977:7;52986:4;52931:20;:60::i;:::-;53004:19;53026:9;:13;53036:2;53026:13;;;;;;;;;;;:19;53040:4;53026:19;;;;;;;;;;;;;;;;53004:41;;53079:6;53064:11;:21;;53056:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53204:6;53190:11;:20;53168:9;:13;53178:2;53168:13;;;;;;;;;;;:19;53182:4;53168:19;;;;;;;;;;;;;;;:42;;;;53253:6;53232:9;:13;53242:2;53232:13;;;;;;;;;;;:17;53246:2;53232:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;53308:2;53277:46;;53302:4;53277:46;;53292:8;53277:46;;;53312:2;53316:6;53277:46;;;;;;;:::i;:::-;;;;;;;;53336:59;53356:8;53366:4;53372:2;53376:3;53381:7;53390:4;53336:19;:59::i;:::-;53408:68;53439:8;53449:4;53455:2;53459;53463:6;53471:4;53408:30;:68::i;:::-;52679:805;;;;52510:974;;;;;:::o;10151:922::-;10204:7;10224:14;10241:1;10224:18;;10291:6;10282:5;:15;10278:102;;10327:6;10318:15;;;;;;:::i;:::-;;;;;10362:2;10352:12;;;;10278:102;10407:6;10398:5;:15;10394:102;;10443:6;10434:15;;;;;;:::i;:::-;;;;;10478:2;10468:12;;;;10394:102;10523:6;10514:5;:15;10510:102;;10559:6;10550:15;;;;;;:::i;:::-;;;;;10594:2;10584:12;;;;10510:102;10639:5;10630;:14;10626:99;;10674:5;10665:14;;;;;;:::i;:::-;;;;;10708:1;10698:11;;;;10626:99;10752:5;10743;:14;10739:99;;10787:5;10778:14;;;;;;:::i;:::-;;;;;10821:1;10811:11;;;;10739:99;10865:5;10856;:14;10852:99;;10900:5;10891:14;;;;;;:::i;:::-;;;;;10934:1;10924:11;;;;10852:99;10978:5;10969;:14;10965:66;;11014:1;11004:11;;;;10965:66;11059:6;11052:13;;;10151:922;;;:::o;64985:198::-;65051:16;65080:22;65119:1;65105:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65080:41;;65143:7;65132:5;65138:1;65132:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;65170:5;65163:12;;;64985:198;;;:::o;62008:221::-;;;;;;;:::o;63184:220::-;;;;;;;:::o;63412:744::-;63627:15;:2;:13;;;:15::i;:::-;63623:526;;;63680:2;63663:38;;;63702:8;63712:4;63718:2;63722:6;63730:4;63663:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63659:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;64011:6;64004:14;;;;;;;;;;;:::i;:::-;;;;;;;;63659:479;;;64060:62;;;;;;;;;;:::i;:::-;;;;;;;;63659:479;63797:43;;;63785:55;;;:8;:55;;;;63781:154;;63865:50;;;;;;;;;;:::i;:::-;;;;;;;;63781:154;63736:214;63623:526;63412:744;;;;;;:::o;64164:813::-;64404:15;:2;:13;;;:15::i;:::-;64400:570;;;64457:2;64440:43;;;64484:8;64494:4;64500:3;64505:7;64514:4;64440:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;64436:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;64832:6;64825:14;;;;;;;;;;;:::i;:::-;;;;;;;;64436:523;;;64881:62;;;;;;;;;;:::i;:::-;;;;;;;;64436:523;64613:48;;;64601:60;;;:8;:60;;;;64597:159;;64686:50;;;;;;;;;;:::i;:::-;;;;;;;;64597:159;64520:251;64400:570;64164:813;;;;;;:::o;29992:326::-;30052:4;30309:1;30287:7;:19;;;:23;30280:30;;29992:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:1509::-;5522:6;5530;5538;5546;5554;5603:3;5591:9;5582:7;5578:23;5574:33;5571:120;;;5610:79;;:::i;:::-;5571:120;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;6013:2;6002:9;5998:18;5985:32;6044:18;6036:6;6033:30;6030:117;;;6066:79;;:::i;:::-;6030:117;6171:78;6241:7;6232:6;6221:9;6217:22;6171:78;:::i;:::-;6161:88;;5956:303;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:78;6554:7;6545:6;6534:9;6530:22;6484:78;:::i;:::-;6474:88;;6269:303;6639:3;6628:9;6624:19;6611:33;6671:18;6663:6;6660:30;6657:117;;;6693:79;;:::i;:::-;6657:117;6798:62;6852:7;6843:6;6832:9;6828:22;6798:62;:::i;:::-;6788:72;;6582:288;5368:1509;;;;;;;;:::o;6883:1089::-;6987:6;6995;7003;7011;7019;7068:3;7056:9;7047:7;7043:23;7039:33;7036:120;;;7075:79;;:::i;:::-;7036:120;7195:1;7220:53;7265:7;7256:6;7245:9;7241:22;7220:53;:::i;:::-;7210:63;;7166:117;7322:2;7348:53;7393:7;7384:6;7373:9;7369:22;7348:53;:::i;:::-;7338:63;;7293:118;7450:2;7476:53;7521:7;7512:6;7501:9;7497:22;7476:53;:::i;:::-;7466:63;;7421:118;7578:2;7604:53;7649:7;7640:6;7629:9;7625:22;7604:53;:::i;:::-;7594:63;;7549:118;7734:3;7723:9;7719:19;7706:33;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:62;7947:7;7938:6;7927:9;7923:22;7893:62;:::i;:::-;7883:72;;7677:288;6883:1089;;;;;;;;:::o;7978:468::-;8043:6;8051;8100:2;8088:9;8079:7;8075:23;8071:32;8068:119;;;8106:79;;:::i;:::-;8068:119;8226:1;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8197:117;8353:2;8379:50;8421:7;8412:6;8401:9;8397:22;8379:50;:::i;:::-;8369:60;;8324:115;7978:468;;;;;:::o;8452:474::-;8520:6;8528;8577:2;8565:9;8556:7;8552:23;8548:32;8545:119;;;8583:79;;:::i;:::-;8545:119;8703:1;8728:53;8773:7;8764:6;8753:9;8749:22;8728:53;:::i;:::-;8718:63;;8674:117;8830:2;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8801:118;8452:474;;;;;:::o;8932:894::-;9050:6;9058;9107:2;9095:9;9086:7;9082:23;9078:32;9075:119;;;9113:79;;:::i;:::-;9075:119;9261:1;9250:9;9246:17;9233:31;9291:18;9283:6;9280:30;9277:117;;;9313:79;;:::i;:::-;9277:117;9418:78;9488:7;9479:6;9468:9;9464:22;9418:78;:::i;:::-;9408:88;;9204:302;9573:2;9562:9;9558:18;9545:32;9604:18;9596:6;9593:30;9590:117;;;9626:79;;:::i;:::-;9590:117;9731:78;9801:7;9792:6;9781:9;9777:22;9731:78;:::i;:::-;9721:88;;9516:303;8932:894;;;;;:::o;9832:::-;9950:6;9958;10007:2;9995:9;9986:7;9982:23;9978:32;9975:119;;;10013:79;;:::i;:::-;9975:119;10161:1;10150:9;10146:17;10133:31;10191:18;10183:6;10180:30;10177:117;;;10213:79;;:::i;:::-;10177:117;10318:78;10388:7;10379:6;10368:9;10364:22;10318:78;:::i;:::-;10308:88;;10104:302;10473:2;10462:9;10458:18;10445:32;10504:18;10496:6;10493:30;10490:117;;;10526:79;;:::i;:::-;10490:117;10631:78;10701:7;10692:6;10681:9;10677:22;10631:78;:::i;:::-;10621:88;;10416:303;9832:894;;;;;:::o;10732:327::-;10790:6;10839:2;10827:9;10818:7;10814:23;10810:32;10807:119;;;10845:79;;:::i;:::-;10807:119;10965:1;10990:52;11034:7;11025:6;11014:9;11010:22;10990:52;:::i;:::-;10980:62;;10936:116;10732:327;;;;:::o;11065:349::-;11134:6;11183:2;11171:9;11162:7;11158:23;11154:32;11151:119;;;11189:79;;:::i;:::-;11151:119;11309:1;11334:63;11389:7;11380:6;11369:9;11365:22;11334:63;:::i;:::-;11324:73;;11280:127;11065:349;;;;:::o;11420:509::-;11489:6;11538:2;11526:9;11517:7;11513:23;11509:32;11506:119;;;11544:79;;:::i;:::-;11506:119;11692:1;11681:9;11677:17;11664:31;11722:18;11714:6;11711:30;11708:117;;;11744:79;;:::i;:::-;11708:117;11849:63;11904:7;11895:6;11884:9;11880:22;11849:63;:::i;:::-;11839:73;;11635:287;11420:509;;;;:::o;11935:329::-;11994:6;12043:2;12031:9;12022:7;12018:23;12014:32;12011:119;;;12049:79;;:::i;:::-;12011:119;12169:1;12194:53;12239:7;12230:6;12219:9;12215:22;12194:53;:::i;:::-;12184:63;;12140:117;11935:329;;;;:::o;12270:474::-;12338:6;12346;12395:2;12383:9;12374:7;12370:23;12366:32;12363:119;;;12401:79;;:::i;:::-;12363:119;12521:1;12546:53;12591:7;12582:6;12571:9;12567:22;12546:53;:::i;:::-;12536:63;;12492:117;12648:2;12674:53;12719:7;12710:6;12699:9;12695:22;12674:53;:::i;:::-;12664:63;;12619:118;12270:474;;;;;:::o;12750:179::-;12819:10;12840:46;12882:3;12874:6;12840:46;:::i;:::-;12918:4;12913:3;12909:14;12895:28;;12750:179;;;;:::o;12935:118::-;13022:24;13040:5;13022:24;:::i;:::-;13017:3;13010:37;12935:118;;:::o;13089:732::-;13208:3;13237:54;13285:5;13237:54;:::i;:::-;13307:86;13386:6;13381:3;13307:86;:::i;:::-;13300:93;;13417:56;13467:5;13417:56;:::i;:::-;13496:7;13527:1;13512:284;13537:6;13534:1;13531:13;13512:284;;;13613:6;13607:13;13640:63;13699:3;13684:13;13640:63;:::i;:::-;13633:70;;13726:60;13779:6;13726:60;:::i;:::-;13716:70;;13572:224;13559:1;13556;13552:9;13547:14;;13512:284;;;13516:14;13812:3;13805:10;;13213:608;;;13089:732;;;;:::o;13827:109::-;13908:21;13923:5;13908:21;:::i;:::-;13903:3;13896:34;13827:109;;:::o;13942:360::-;14028:3;14056:38;14088:5;14056:38;:::i;:::-;14110:70;14173:6;14168:3;14110:70;:::i;:::-;14103:77;;14189:52;14234:6;14229:3;14222:4;14215:5;14211:16;14189:52;:::i;:::-;14266:29;14288:6;14266:29;:::i;:::-;14261:3;14257:39;14250:46;;14032:270;13942:360;;;;:::o;14308:364::-;14396:3;14424:39;14457:5;14424:39;:::i;:::-;14479:71;14543:6;14538:3;14479:71;:::i;:::-;14472:78;;14559:52;14604:6;14599:3;14592:4;14585:5;14581:16;14559:52;:::i;:::-;14636:29;14658:6;14636:29;:::i;:::-;14631:3;14627:39;14620:46;;14400:272;14308:364;;;;:::o;14678:377::-;14784:3;14812:39;14845:5;14812:39;:::i;:::-;14867:89;14949:6;14944:3;14867:89;:::i;:::-;14860:96;;14965:52;15010:6;15005:3;14998:4;14991:5;14987:16;14965:52;:::i;:::-;15042:6;15037:3;15033:16;15026:23;;14788:267;14678:377;;;;:::o;15085:845::-;15188:3;15225:5;15219:12;15254:36;15280:9;15254:36;:::i;:::-;15306:89;15388:6;15383:3;15306:89;:::i;:::-;15299:96;;15426:1;15415:9;15411:17;15442:1;15437:137;;;;15588:1;15583:341;;;;15404:520;;15437:137;15521:4;15517:9;15506;15502:25;15497:3;15490:38;15557:6;15552:3;15548:16;15541:23;;15437:137;;15583:341;15650:38;15682:5;15650:38;:::i;:::-;15710:1;15724:154;15738:6;15735:1;15732:13;15724:154;;;15812:7;15806:14;15802:1;15797:3;15793:11;15786:35;15862:1;15853:7;15849:15;15838:26;;15760:4;15757:1;15753:12;15748:17;;15724:154;;;15907:6;15902:3;15898:16;15891:23;;15590:334;;15404:520;;15192:738;;15085:845;;;;:::o;15936:366::-;16078:3;16099:67;16163:2;16158:3;16099:67;:::i;:::-;16092:74;;16175:93;16264:3;16175:93;:::i;:::-;16293:2;16288:3;16284:12;16277:19;;15936:366;;;:::o;16308:::-;16450:3;16471:67;16535:2;16530:3;16471:67;:::i;:::-;16464:74;;16547:93;16636:3;16547:93;:::i;:::-;16665:2;16660:3;16656:12;16649:19;;16308:366;;;:::o;16680:::-;16822:3;16843:67;16907:2;16902:3;16843:67;:::i;:::-;16836:74;;16919:93;17008:3;16919:93;:::i;:::-;17037:2;17032:3;17028:12;17021:19;;16680:366;;;:::o;17052:::-;17194:3;17215:67;17279:2;17274:3;17215:67;:::i;:::-;17208:74;;17291:93;17380:3;17291:93;:::i;:::-;17409:2;17404:3;17400:12;17393:19;;17052:366;;;:::o;17424:::-;17566:3;17587:67;17651:2;17646:3;17587:67;:::i;:::-;17580:74;;17663:93;17752:3;17663:93;:::i;:::-;17781:2;17776:3;17772:12;17765:19;;17424:366;;;:::o;17796:::-;17938:3;17959:67;18023:2;18018:3;17959:67;:::i;:::-;17952:74;;18035:93;18124:3;18035:93;:::i;:::-;18153:2;18148:3;18144:12;18137:19;;17796:366;;;:::o;18168:::-;18310:3;18331:67;18395:2;18390:3;18331:67;:::i;:::-;18324:74;;18407:93;18496:3;18407:93;:::i;:::-;18525:2;18520:3;18516:12;18509:19;;18168:366;;;:::o;18540:::-;18682:3;18703:67;18767:2;18762:3;18703:67;:::i;:::-;18696:74;;18779:93;18868:3;18779:93;:::i;:::-;18897:2;18892:3;18888:12;18881:19;;18540:366;;;:::o;18912:::-;19054:3;19075:67;19139:2;19134:3;19075:67;:::i;:::-;19068:74;;19151:93;19240:3;19151:93;:::i;:::-;19269:2;19264:3;19260:12;19253:19;;18912:366;;;:::o;19284:::-;19426:3;19447:67;19511:2;19506:3;19447:67;:::i;:::-;19440:74;;19523:93;19612:3;19523:93;:::i;:::-;19641:2;19636:3;19632:12;19625:19;;19284:366;;;:::o;19656:::-;19798:3;19819:67;19883:2;19878:3;19819:67;:::i;:::-;19812:74;;19895:93;19984:3;19895:93;:::i;:::-;20013:2;20008:3;20004:12;19997:19;;19656:366;;;:::o;20028:400::-;20188:3;20209:84;20291:1;20286:3;20209:84;:::i;:::-;20202:91;;20302:93;20391:3;20302:93;:::i;:::-;20420:1;20415:3;20411:11;20404:18;;20028:400;;;:::o;20434:366::-;20576:3;20597:67;20661:2;20656:3;20597:67;:::i;:::-;20590:74;;20673:93;20762:3;20673:93;:::i;:::-;20791:2;20786:3;20782:12;20775:19;;20434:366;;;:::o;20806:::-;20948:3;20969:67;21033:2;21028:3;20969:67;:::i;:::-;20962:74;;21045:93;21134:3;21045:93;:::i;:::-;21163:2;21158:3;21154:12;21147:19;;20806:366;;;:::o;21178:::-;21320:3;21341:67;21405:2;21400:3;21341:67;:::i;:::-;21334:74;;21417:93;21506:3;21417:93;:::i;:::-;21535:2;21530:3;21526:12;21519:19;;21178:366;;;:::o;21550:398::-;21709:3;21730:83;21811:1;21806:3;21730:83;:::i;:::-;21723:90;;21822:93;21911:3;21822:93;:::i;:::-;21940:1;21935:3;21931:11;21924:18;;21550:398;;;:::o;21954:366::-;22096:3;22117:67;22181:2;22176:3;22117:67;:::i;:::-;22110:74;;22193:93;22282:3;22193:93;:::i;:::-;22311:2;22306:3;22302:12;22295:19;;21954:366;;;:::o;22326:::-;22468:3;22489:67;22553:2;22548:3;22489:67;:::i;:::-;22482:74;;22565:93;22654:3;22565:93;:::i;:::-;22683:2;22678:3;22674:12;22667:19;;22326:366;;;:::o;22698:::-;22840:3;22861:67;22925:2;22920:3;22861:67;:::i;:::-;22854:74;;22937:93;23026:3;22937:93;:::i;:::-;23055:2;23050:3;23046:12;23039:19;;22698:366;;;:::o;23070:::-;23212:3;23233:67;23297:2;23292:3;23233:67;:::i;:::-;23226:74;;23309:93;23398:3;23309:93;:::i;:::-;23427:2;23422:3;23418:12;23411:19;;23070:366;;;:::o;23442:::-;23584:3;23605:67;23669:2;23664:3;23605:67;:::i;:::-;23598:74;;23681:93;23770:3;23681:93;:::i;:::-;23799:2;23794:3;23790:12;23783:19;;23442:366;;;:::o;23814:108::-;23891:24;23909:5;23891:24;:::i;:::-;23886:3;23879:37;23814:108;;:::o;23928:118::-;24015:24;24033:5;24015:24;:::i;:::-;24010:3;24003:37;23928:118;;:::o;24052:695::-;24330:3;24352:92;24440:3;24431:6;24352:92;:::i;:::-;24345:99;;24461:95;24552:3;24543:6;24461:95;:::i;:::-;24454:102;;24573:148;24717:3;24573:148;:::i;:::-;24566:155;;24738:3;24731:10;;24052:695;;;;;:::o;24753:379::-;24937:3;24959:147;25102:3;24959:147;:::i;:::-;24952:154;;25123:3;25116:10;;24753:379;;;:::o;25138:222::-;25231:4;25269:2;25258:9;25254:18;25246:26;;25282:71;25350:1;25339:9;25335:17;25326:6;25282:71;:::i;:::-;25138:222;;;;:::o;25366:1053::-;25689:4;25727:3;25716:9;25712:19;25704:27;;25741:71;25809:1;25798:9;25794:17;25785:6;25741:71;:::i;:::-;25822:72;25890:2;25879:9;25875:18;25866:6;25822:72;:::i;:::-;25941:9;25935:4;25931:20;25926:2;25915:9;25911:18;25904:48;25969:108;26072:4;26063:6;25969:108;:::i;:::-;25961:116;;26124:9;26118:4;26114:20;26109:2;26098:9;26094:18;26087:48;26152:108;26255:4;26246:6;26152:108;:::i;:::-;26144:116;;26308:9;26302:4;26298:20;26292:3;26281:9;26277:19;26270:49;26336:76;26407:4;26398:6;26336:76;:::i;:::-;26328:84;;25366:1053;;;;;;;;:::o;26425:751::-;26648:4;26686:3;26675:9;26671:19;26663:27;;26700:71;26768:1;26757:9;26753:17;26744:6;26700:71;:::i;:::-;26781:72;26849:2;26838:9;26834:18;26825:6;26781:72;:::i;:::-;26863;26931:2;26920:9;26916:18;26907:6;26863:72;:::i;:::-;26945;27013:2;27002:9;26998:18;26989:6;26945:72;:::i;:::-;27065:9;27059:4;27055:20;27049:3;27038:9;27034:19;27027:49;27093:76;27164:4;27155:6;27093:76;:::i;:::-;27085:84;;26425:751;;;;;;;;:::o;27182:373::-;27325:4;27363:2;27352:9;27348:18;27340:26;;27412:9;27406:4;27402:20;27398:1;27387:9;27383:17;27376:47;27440:108;27543:4;27534:6;27440:108;:::i;:::-;27432:116;;27182:373;;;;:::o;27561:634::-;27782:4;27820:2;27809:9;27805:18;27797:26;;27869:9;27863:4;27859:20;27855:1;27844:9;27840:17;27833:47;27897:108;28000:4;27991:6;27897:108;:::i;:::-;27889:116;;28052:9;28046:4;28042:20;28037:2;28026:9;28022:18;28015:48;28080:108;28183:4;28174:6;28080:108;:::i;:::-;28072:116;;27561:634;;;;;:::o;28201:210::-;28288:4;28326:2;28315:9;28311:18;28303:26;;28339:65;28401:1;28390:9;28386:17;28377:6;28339:65;:::i;:::-;28201:210;;;;:::o;28417:313::-;28530:4;28568:2;28557:9;28553:18;28545:26;;28617:9;28611:4;28607:20;28603:1;28592:9;28588:17;28581:47;28645:78;28718:4;28709:6;28645:78;:::i;:::-;28637:86;;28417:313;;;;:::o;28736:419::-;28902:4;28940:2;28929:9;28925:18;28917:26;;28989:9;28983:4;28979:20;28975:1;28964:9;28960:17;28953:47;29017:131;29143:4;29017:131;:::i;:::-;29009:139;;28736:419;;;:::o;29161:::-;29327:4;29365:2;29354:9;29350:18;29342:26;;29414:9;29408:4;29404:20;29400:1;29389:9;29385:17;29378:47;29442:131;29568:4;29442:131;:::i;:::-;29434:139;;29161:419;;;:::o;29586:::-;29752:4;29790:2;29779:9;29775:18;29767:26;;29839:9;29833:4;29829:20;29825:1;29814:9;29810:17;29803:47;29867:131;29993:4;29867:131;:::i;:::-;29859:139;;29586:419;;;:::o;30011:::-;30177:4;30215:2;30204:9;30200:18;30192:26;;30264:9;30258:4;30254:20;30250:1;30239:9;30235:17;30228:47;30292:131;30418:4;30292:131;:::i;:::-;30284:139;;30011:419;;;:::o;30436:::-;30602:4;30640:2;30629:9;30625:18;30617:26;;30689:9;30683:4;30679:20;30675:1;30664:9;30660:17;30653:47;30717:131;30843:4;30717:131;:::i;:::-;30709:139;;30436:419;;;:::o;30861:::-;31027:4;31065:2;31054:9;31050:18;31042:26;;31114:9;31108:4;31104:20;31100:1;31089:9;31085:17;31078:47;31142:131;31268:4;31142:131;:::i;:::-;31134:139;;30861:419;;;:::o;31286:::-;31452:4;31490:2;31479:9;31475:18;31467:26;;31539:9;31533:4;31529:20;31525:1;31514:9;31510:17;31503:47;31567:131;31693:4;31567:131;:::i;:::-;31559:139;;31286:419;;;:::o;31711:::-;31877:4;31915:2;31904:9;31900:18;31892:26;;31964:9;31958:4;31954:20;31950:1;31939:9;31935:17;31928:47;31992:131;32118:4;31992:131;:::i;:::-;31984:139;;31711:419;;;:::o;32136:::-;32302:4;32340:2;32329:9;32325:18;32317:26;;32389:9;32383:4;32379:20;32375:1;32364:9;32360:17;32353:47;32417:131;32543:4;32417:131;:::i;:::-;32409:139;;32136:419;;;:::o;32561:::-;32727:4;32765:2;32754:9;32750:18;32742:26;;32814:9;32808:4;32804:20;32800:1;32789:9;32785:17;32778:47;32842:131;32968:4;32842:131;:::i;:::-;32834:139;;32561:419;;;:::o;32986:::-;33152:4;33190:2;33179:9;33175:18;33167:26;;33239:9;33233:4;33229:20;33225:1;33214:9;33210:17;33203:47;33267:131;33393:4;33267:131;:::i;:::-;33259:139;;32986:419;;;:::o;33411:::-;33577:4;33615:2;33604:9;33600:18;33592:26;;33664:9;33658:4;33654:20;33650:1;33639:9;33635:17;33628:47;33692:131;33818:4;33692:131;:::i;:::-;33684:139;;33411:419;;;:::o;33836:::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34089:9;34083:4;34079:20;34075:1;34064:9;34060:17;34053:47;34117:131;34243:4;34117:131;:::i;:::-;34109:139;;33836:419;;;:::o;34261:::-;34427:4;34465:2;34454:9;34450:18;34442:26;;34514:9;34508:4;34504:20;34500:1;34489:9;34485:17;34478:47;34542:131;34668:4;34542:131;:::i;:::-;34534:139;;34261:419;;;:::o;34686:::-;34852:4;34890:2;34879:9;34875:18;34867:26;;34939:9;34933:4;34929:20;34925:1;34914:9;34910:17;34903:47;34967:131;35093:4;34967:131;:::i;:::-;34959:139;;34686:419;;;:::o;35111:::-;35277:4;35315:2;35304:9;35300:18;35292:26;;35364:9;35358:4;35354:20;35350:1;35339:9;35335:17;35328:47;35392:131;35518:4;35392:131;:::i;:::-;35384:139;;35111:419;;;:::o;35536:::-;35702:4;35740:2;35729:9;35725:18;35717:26;;35789:9;35783:4;35779:20;35775:1;35764:9;35760:17;35753:47;35817:131;35943:4;35817:131;:::i;:::-;35809:139;;35536:419;;;:::o;35961:::-;36127:4;36165:2;36154:9;36150:18;36142:26;;36214:9;36208:4;36204:20;36200:1;36189:9;36185:17;36178:47;36242:131;36368:4;36242:131;:::i;:::-;36234:139;;35961:419;;;:::o;36386:::-;36552:4;36590:2;36579:9;36575:18;36567:26;;36639:9;36633:4;36629:20;36625:1;36614:9;36610:17;36603:47;36667:131;36793:4;36667:131;:::i;:::-;36659:139;;36386:419;;;:::o;36811:222::-;36904:4;36942:2;36931:9;36927:18;36919:26;;36955:71;37023:1;37012:9;37008:17;36999:6;36955:71;:::i;:::-;36811:222;;;;:::o;37039:332::-;37160:4;37198:2;37187:9;37183:18;37175:26;;37211:71;37279:1;37268:9;37264:17;37255:6;37211:71;:::i;:::-;37292:72;37360:2;37349:9;37345:18;37336:6;37292:72;:::i;:::-;37039:332;;;;;:::o;37377:129::-;37411:6;37438:20;;:::i;:::-;37428:30;;37467:33;37495:4;37487:6;37467:33;:::i;:::-;37377:129;;;:::o;37512:75::-;37545:6;37578:2;37572:9;37562:19;;37512:75;:::o;37593:311::-;37670:4;37760:18;37752:6;37749:30;37746:56;;;37782:18;;:::i;:::-;37746:56;37832:4;37824:6;37820:17;37812:25;;37892:4;37886;37882:15;37874:23;;37593:311;;;:::o;37910:::-;37987:4;38077:18;38069:6;38066:30;38063:56;;;38099:18;;:::i;:::-;38063:56;38149:4;38141:6;38137:17;38129:25;;38209:4;38203;38199:15;38191:23;;37910:311;;;:::o;38227:307::-;38288:4;38378:18;38370:6;38367:30;38364:56;;;38400:18;;:::i;:::-;38364:56;38438:29;38460:6;38438:29;:::i;:::-;38430:37;;38522:4;38516;38512:15;38504:23;;38227:307;;;:::o;38540:308::-;38602:4;38692:18;38684:6;38681:30;38678:56;;;38714:18;;:::i;:::-;38678:56;38752:29;38774:6;38752:29;:::i;:::-;38744:37;;38836:4;38830;38826:15;38818:23;;38540:308;;;:::o;38854:132::-;38921:4;38944:3;38936:11;;38974:4;38969:3;38965:14;38957:22;;38854:132;;;:::o;38992:141::-;39041:4;39064:3;39056:11;;39087:3;39084:1;39077:14;39121:4;39118:1;39108:18;39100:26;;38992:141;;;:::o;39139:114::-;39206:6;39240:5;39234:12;39224:22;;39139:114;;;:::o;39259:98::-;39310:6;39344:5;39338:12;39328:22;;39259:98;;;:::o;39363:99::-;39415:6;39449:5;39443:12;39433:22;;39363:99;;;:::o;39468:113::-;39538:4;39570;39565:3;39561:14;39553:22;;39468:113;;;:::o;39587:184::-;39686:11;39720:6;39715:3;39708:19;39760:4;39755:3;39751:14;39736:29;;39587:184;;;;:::o;39777:168::-;39860:11;39894:6;39889:3;39882:19;39934:4;39929:3;39925:14;39910:29;;39777:168;;;;:::o;39951:147::-;40052:11;40089:3;40074:18;;39951:147;;;;:::o;40104:169::-;40188:11;40222:6;40217:3;40210:19;40262:4;40257:3;40253:14;40238:29;;40104:169;;;;:::o;40279:148::-;40381:11;40418:3;40403:18;;40279:148;;;;:::o;40433:305::-;40473:3;40492:20;40510:1;40492:20;:::i;:::-;40487:25;;40526:20;40544:1;40526:20;:::i;:::-;40521:25;;40680:1;40612:66;40608:74;40605:1;40602:81;40599:107;;;40686:18;;:::i;:::-;40599:107;40730:1;40727;40723:9;40716:16;;40433:305;;;;:::o;40744:185::-;40784:1;40801:20;40819:1;40801:20;:::i;:::-;40796:25;;40835:20;40853:1;40835:20;:::i;:::-;40830:25;;40874:1;40864:35;;40879:18;;:::i;:::-;40864:35;40921:1;40918;40914:9;40909:14;;40744:185;;;;:::o;40935:348::-;40975:7;40998:20;41016:1;40998:20;:::i;:::-;40993:25;;41032:20;41050:1;41032:20;:::i;:::-;41027:25;;41220:1;41152:66;41148:74;41145:1;41142:81;41137:1;41130:9;41123:17;41119:105;41116:131;;;41227:18;;:::i;:::-;41116:131;41275:1;41272;41268:9;41257:20;;40935:348;;;;:::o;41289:191::-;41329:4;41349:20;41367:1;41349:20;:::i;:::-;41344:25;;41383:20;41401:1;41383:20;:::i;:::-;41378:25;;41422:1;41419;41416:8;41413:34;;;41427:18;;:::i;:::-;41413:34;41472:1;41469;41465:9;41457:17;;41289:191;;;;:::o;41486:96::-;41523:7;41552:24;41570:5;41552:24;:::i;:::-;41541:35;;41486:96;;;:::o;41588:90::-;41622:7;41665:5;41658:13;41651:21;41640:32;;41588:90;;;:::o;41684:149::-;41720:7;41760:66;41753:5;41749:78;41738:89;;41684:149;;;:::o;41839:126::-;41876:7;41916:42;41909:5;41905:54;41894:65;;41839:126;;;:::o;41971:77::-;42008:7;42037:5;42026:16;;41971:77;;;:::o;42054:154::-;42138:6;42133:3;42128;42115:30;42200:1;42191:6;42186:3;42182:16;42175:27;42054:154;;;:::o;42214:307::-;42282:1;42292:113;42306:6;42303:1;42300:13;42292:113;;;42391:1;42386:3;42382:11;42376:18;42372:1;42367:3;42363:11;42356:39;42328:2;42325:1;42321:10;42316:15;;42292:113;;;42423:6;42420:1;42417:13;42414:101;;;42503:1;42494:6;42489:3;42485:16;42478:27;42414:101;42263:258;42214:307;;;:::o;42527:320::-;42571:6;42608:1;42602:4;42598:12;42588:22;;42655:1;42649:4;42645:12;42676:18;42666:81;;42732:4;42724:6;42720:17;42710:27;;42666:81;42794:2;42786:6;42783:14;42763:18;42760:38;42757:84;;;42813:18;;:::i;:::-;42757:84;42578:269;42527:320;;;:::o;42853:281::-;42936:27;42958:4;42936:27;:::i;:::-;42928:6;42924:40;43066:6;43054:10;43051:22;43030:18;43018:10;43015:34;43012:62;43009:88;;;43077:18;;:::i;:::-;43009:88;43117:10;43113:2;43106:22;42896:238;42853:281;;:::o;43140:233::-;43179:3;43202:24;43220:5;43202:24;:::i;:::-;43193:33;;43248:66;43241:5;43238:77;43235:103;;;43318:18;;:::i;:::-;43235:103;43365:1;43358:5;43354:13;43347:20;;43140:233;;;:::o;43379:176::-;43411:1;43428:20;43446:1;43428:20;:::i;:::-;43423:25;;43462:20;43480:1;43462:20;:::i;:::-;43457:25;;43501:1;43491:35;;43506:18;;:::i;:::-;43491:35;43547:1;43544;43540:9;43535:14;;43379:176;;;;:::o;43561:180::-;43609:77;43606:1;43599:88;43706:4;43703:1;43696:15;43730:4;43727:1;43720:15;43747:180;43795:77;43792:1;43785:88;43892:4;43889:1;43882:15;43916:4;43913:1;43906:15;43933:180;43981:77;43978:1;43971:88;44078:4;44075:1;44068:15;44102:4;44099:1;44092:15;44119:180;44167:77;44164:1;44157:88;44264:4;44261:1;44254:15;44288:4;44285:1;44278:15;44305:180;44353:77;44350:1;44343:88;44450:4;44447:1;44440:15;44474:4;44471:1;44464:15;44491:183;44526:3;44564:1;44546:16;44543:23;44540:128;;;44602:1;44599;44596;44581:23;44624:34;44655:1;44649:8;44624:34;:::i;:::-;44617:41;;44540:128;44491:183;:::o;44680:117::-;44789:1;44786;44779:12;44803:117;44912:1;44909;44902:12;44926:117;45035:1;45032;45025:12;45049:117;45158:1;45155;45148:12;45172:117;45281:1;45278;45271:12;45295:102;45336:6;45387:2;45383:7;45378:2;45371:5;45367:14;45363:28;45353:38;;45295:102;;;:::o;45403:106::-;45447:8;45496:5;45491:3;45487:15;45466:36;;45403:106;;;:::o;45515:227::-;45655:34;45651:1;45643:6;45639:14;45632:58;45724:10;45719:2;45711:6;45707:15;45700:35;45515:227;:::o;45748:225::-;45888:34;45884:1;45876:6;45872:14;45865:58;45957:8;45952:2;45944:6;45940:15;45933:33;45748:225;:::o;45979:165::-;46119:17;46115:1;46107:6;46103:14;46096:41;45979:165;:::o;46150:229::-;46290:34;46286:1;46278:6;46274:14;46267:58;46359:12;46354:2;46346:6;46342:15;46335:37;46150:229;:::o;46385:233::-;46525:34;46521:1;46513:6;46509:14;46502:58;46594:16;46589:2;46581:6;46577:15;46570:41;46385:233;:::o;46624:170::-;46764:22;46760:1;46752:6;46748:14;46741:46;46624:170;:::o;46800:221::-;46940:34;46936:1;46928:6;46924:14;46917:58;47009:4;47004:2;46996:6;46992:15;46985:29;46800:221;:::o;47027:224::-;47167:34;47163:1;47155:6;47151:14;47144:58;47236:7;47231:2;47223:6;47219:15;47212:32;47027:224;:::o;47257:229::-;47397:34;47393:1;47385:6;47381:14;47374:58;47466:12;47461:2;47453:6;47449:15;47442:37;47257:229;:::o;47492:179::-;47632:31;47628:1;47620:6;47616:14;47609:55;47492:179;:::o;47677:229::-;47817:34;47813:1;47805:6;47801:14;47794:58;47886:12;47881:2;47873:6;47869:15;47862:37;47677:229;:::o;47912:155::-;48052:7;48048:1;48040:6;48036:14;48029:31;47912:155;:::o;48073:182::-;48213:34;48209:1;48201:6;48197:14;48190:58;48073:182;:::o;48261:220::-;48401:34;48397:1;48389:6;48385:14;48378:58;48470:3;48465:2;48457:6;48453:15;48446:28;48261:220;:::o;48487:224::-;48627:34;48623:1;48615:6;48611:14;48604:58;48696:7;48691:2;48683:6;48679:15;48672:32;48487:224;:::o;48717:114::-;;:::o;48837:228::-;48977:34;48973:1;48965:6;48961:14;48954:58;49046:11;49041:2;49033:6;49029:15;49022:36;48837:228;:::o;49071:::-;49211:34;49207:1;49199:6;49195:14;49188:58;49280:11;49275:2;49267:6;49263:15;49256:36;49071:228;:::o;49305:227::-;49445:34;49441:1;49433:6;49429:14;49422:58;49514:10;49509:2;49501:6;49497:15;49490:35;49305:227;:::o;49538:220::-;49678:34;49674:1;49666:6;49662:14;49655:58;49747:3;49742:2;49734:6;49730:15;49723:28;49538:220;:::o;49764:239::-;49904:34;49900:1;49892:6;49888:14;49881:58;49973:22;49968:2;49960:6;49956:15;49949:47;49764:239;:::o;50009:711::-;50048:3;50086:4;50068:16;50065:26;50062:39;;;50094:5;;50062:39;50123:20;;:::i;:::-;50198:1;50180:16;50176:24;50173:1;50167:4;50152:49;50231:4;50225:11;50330:16;50323:4;50315:6;50311:17;50308:39;50275:18;50267:6;50264:30;50248:113;50245:146;;;50376:5;;;;50245:146;50422:6;50416:4;50412:17;50458:3;50452:10;50485:18;50477:6;50474:30;50471:43;;;50507:5;;;;;;50471:43;50555:6;50548:4;50543:3;50539:14;50535:27;50614:1;50596:16;50592:24;50586:4;50582:35;50577:3;50574:44;50571:57;;;50621:5;;;;;;;50571:57;50638;50686:6;50680:4;50676:17;50668:6;50664:30;50658:4;50638:57;:::i;:::-;50711:3;50704:10;;50052:668;;;;;50009:711;;:::o;50726:122::-;50799:24;50817:5;50799:24;:::i;:::-;50792:5;50789:35;50779:63;;50838:1;50835;50828:12;50779:63;50726:122;:::o;50854:116::-;50924:21;50939:5;50924:21;:::i;:::-;50917:5;50914:32;50904:60;;50960:1;50957;50950:12;50904:60;50854:116;:::o;50976:120::-;51048:23;51065:5;51048:23;:::i;:::-;51041:5;51038:34;51028:62;;51086:1;51083;51076:12;51028:62;50976:120;:::o;51102:122::-;51175:24;51193:5;51175:24;:::i;:::-;51168:5;51165:35;51155:63;;51214:1;51211;51204:12;51155:63;51102:122;:::o
Swarm Source
ipfs://eff215a2043ae9773a3bf8b29c4184f8353eda66a062cdda7c60cd0f771f8093
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.