Overview
Max Total Supply
925,104.498623512000031205 DICE
Holders
1,358 (0.00%)
Market
Price
$0.0203 @ 0.000006 ETH
Onchain Market Cap
$18,754.21
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
10 DICEValue
$0.20 ( ~6.07824805000609E-05 ETH) [0.0011%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
DiceV2
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-03-01 */ //██████ ██ ███████ ██ ██ ██ ██ ██ ██████ ██ //██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ //██████ ██ ███████ █████ ████ ██ ██ ██ ██ //██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ //██ ██ ██ ███████ ██ ██ ██ ██ ███████ ██████ ███████ pragma solidity ^0.8.0; library EnumerableSet { struct Set { bytes32[] _values; mapping(bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // 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/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/10_stinkyFlipV2.sol //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.9; interface iPing { function ping(address txOrigin, address msgSender, address tknSender, address tknRecipient, uint256 amount, uint256 netAmount) external; } contract DiceV2 is ERC20, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; bytes32 public constant MINTER = keccak256("MINTER"); EnumerableSet.AddressSet private routerAddresses; EnumerableSet.AddressSet private pingAddresses; EnumerableSet.AddressSet private minterAddresses; EnumerableSet.AddressSet private taxlessAddresses; bool public transfersEnabled = true; address public taxReceiver; uint256 public taxPercent; mapping(address => bool) public taxExclusions; modifier onlyAdmin { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not the owner"); _; } modifier onlyMinter { require(hasRole(MINTER, msg.sender), "Caller is not a minter"); _; } constructor() ERC20("Party Dice", "DICE") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); uint256 totalSupply = 1000000000 * 1e18; _mint(msg.sender, totalSupply); } function setPingAddresses(address[] memory _pingAddresses, bool add) external onlyAdmin { for (uint256 i = 0; i < _pingAddresses.length; i++) { if (add) { pingAddresses.add(_pingAddresses[i]); } else { pingAddresses.remove(_pingAddresses[i]); } } } function setRouterAddresses(address[] memory _routerAddresses, bool add) external onlyAdmin { for (uint256 i = 0; i < _routerAddresses.length; i++) { if (add) { routerAddresses.add(_routerAddresses[i]); } else { routerAddresses.remove(_routerAddresses[i]); } } } function setMinterAddresses(address[] memory _minterAddresses, bool enabled) external onlyAdmin { for (uint256 i = 0; i < _minterAddresses.length; i++) { if (enabled) { grantRole(MINTER, _minterAddresses[i]); minterAddresses.add(_minterAddresses[i]); } else { revokeRole(MINTER, _minterAddresses[i]); minterAddresses.remove(_minterAddresses[i]); } } } function setTaxExclusion(address[] memory _taxlessAddresses, bool excluded) external onlyAdmin { for (uint256 i = 0; i < _taxlessAddresses.length; i++) { if (excluded) { taxlessAddresses.add(_taxlessAddresses[i]); } else { taxlessAddresses.remove(_taxlessAddresses[i]); } } } function getEnumerableSets() public view returns ( address[] memory routerAddressesArr, address[] memory pingAddressesArr, address[] memory minterAddressesArr, address[] memory taxlessAddressesArr) { routerAddressesArr = new address[](routerAddresses.length()); for (uint256 i = 0; i < routerAddressesArr.length; i++) { routerAddressesArr[i] = routerAddresses.at(i); } pingAddressesArr = new address[](pingAddresses.length()); for (uint256 i = 0; i < pingAddressesArr.length; i++) { pingAddressesArr[i] = pingAddresses.at(i); } minterAddressesArr = new address[](minterAddresses.length()); for (uint256 i = 0; i < minterAddressesArr.length; i++) { minterAddressesArr[i] = minterAddresses.at(i); } taxlessAddressesArr = new address[](taxlessAddresses.length()); for (uint256 i = 0; i < taxlessAddressesArr.length; i++) { taxlessAddressesArr[i] = taxlessAddresses.at(i); } } function setTaxParams(address _taxReceiver, uint256 _taxPercent) external onlyAdmin{ require(_taxPercent <= 100, "Tax percent must be <= 100"); taxReceiver = _taxReceiver; taxPercent = _taxPercent; } function transferEnabled(bool enabled) external onlyAdmin { transfersEnabled = enabled; } function _transfer(address from, address to, uint256 amount) internal override { require(transfersEnabled, "Transfers are disabled"); if (amount == 0) { super._transfer(from, to, 0); return; } bool isRouter = routerAddresses.contains(from) || routerAddresses.contains(to); bool isTaxExcluded = taxlessAddresses.contains(from) || taxlessAddresses.contains(to); uint256 fees = isRouter && !isTaxExcluded ? calculateTax(amount) : 0; uint256 netAmount = amount - fees; if (fees > 0) { super._transfer(from, taxReceiver, fees); } super._transfer(from, to, netAmount); if (isRouter) { for (uint256 i = 0; i < pingAddresses.length(); i++) { iPing(pingAddresses.at(i)).ping(tx.origin, msg.sender, from, to, amount, netAmount); } } } function modularmint(address to, uint256 amount) external onlyMinter returns (bool) { _mint(to, amount); return true; } function modularburn(address from, uint256 amount) external onlyMinter returns (bool) { _burn(from, amount); return true; } function calculateTax(uint256 amount) internal view returns (uint256) { return (amount * taxPercent) / 100; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEnumerableSets","outputs":[{"internalType":"address[]","name":"routerAddressesArr","type":"address[]"},{"internalType":"address[]","name":"pingAddressesArr","type":"address[]"},{"internalType":"address[]","name":"minterAddressesArr","type":"address[]"},{"internalType":"address[]","name":"taxlessAddressesArr","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modularburn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modularmint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_minterAddresses","type":"address[]"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMinterAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pingAddresses","type":"address[]"},{"internalType":"bool","name":"add","type":"bool"}],"name":"setPingAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_routerAddresses","type":"address[]"},{"internalType":"bool","name":"add","type":"bool"}],"name":"setRouterAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_taxlessAddresses","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setTaxExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxReceiver","type":"address"},{"internalType":"uint256","name":"_taxPercent","type":"uint256"}],"name":"setTaxParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExclusions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"transferEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001600e60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600a81526020017f50617274792044696365000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f44494345000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620003ff565b508060049080519060200190620000ca929190620003ff565b505050620000e26000801b336200010c60201b60201c565b60006b033b2e3c9fd0803ce800000090506200010533826200012260201b60201c565b506200065b565b6200011e82826200029060201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000510565b60405180910390fd5b620001a9600083836200038260201b60201c565b8060026000828254620001bd91906200056b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002709190620005d9565b60405180910390a36200028c600083836200038760201b60201c565b5050565b620002a282826200038c60201b60201c565b6200037e5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000323620003f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200040d9062000625565b90600052602060002090601f0160209004810192826200043157600085556200047d565b82601f106200044c57805160ff19168380011785556200047d565b828001600101855582156200047d579182015b828111156200047c5782518255916020019190600101906200045f565b5b5090506200048c919062000490565b5090565b5b80821115620004ab57600081600090555060010162000491565b5090565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620004f8601f83620004af565b91506200050582620004c0565b602082019050919050565b600060208201905081810360008301526200052b81620004e9565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620005788262000532565b9150620005858362000532565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620005bd57620005bc6200053c565b5b828201905092915050565b620005d38162000532565b82525050565b6000602082019050620005f06000830184620005c8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063e57607f821691505b60208210811415620006555762000654620005f6565b5b50919050565b613b92806200066b6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063d547741f116100a2578063ed35a8f911610071578063ed35a8f914610605578063f030a76314610635578063f836a69714610656578063fe6d812414610672576101f0565b8063d547741f1461057f578063d85d2e601461059b578063dd62ed3e146105b7578063e6ef73d6146105e7576101f0565b8063a217fddf116100de578063a217fddf146104e3578063a457c2d714610501578063a9059cbb14610531578063bef97c8714610561576101f0565b806370a08231146104475780637541f41c1461047757806391d148541461049557806395d89b41146104c5576101f0565b8063313ce567116101875780635a9d1c31116101565780635a9d1c31146103d75780635e3eb5ef146103f357806369fb78441461040f5780636fb3caee1461042b576101f0565b8063313ce5671461033d57806336568abe1461035b578063395093511461037757806356a3dbc2146103a7576101f0565b806318160ddd116101c357806318160ddd146102a357806323b872dd146102c1578063248a9ca3146102f15780632f2ff15d14610321576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b3146102435780630c1936b914610273575b600080fd5b61020f600480360381019061020a919061280c565b610690565b60405161021c9190612854565b60405180910390f35b61022d61070a565b60405161023a9190612908565b60405180910390f35b61025d600480360381019061025891906129be565b61079c565b60405161026a9190612854565b60405180910390f35b61028d600480360381019061028891906129fe565b6107bf565b60405161029a9190612854565b60405180910390f35b6102ab6107df565b6040516102b89190612a3a565b60405180910390f35b6102db60048036038101906102d69190612a55565b6107e9565b6040516102e89190612854565b60405180910390f35b61030b60048036038101906103069190612ade565b610818565b6040516103189190612b1a565b60405180910390f35b61033b60048036038101906103369190612b35565b610838565b005b610345610859565b6040516103529190612b91565b60405180910390f35b61037560048036038101906103709190612b35565b610862565b005b610391600480360381019061038c91906129be565b6108e5565b60405161039e9190612854565b60405180910390f35b6103c160048036038101906103bc91906129be565b61091c565b6040516103ce9190612854565b60405180910390f35b6103f160048036038101906103ec9190612bd8565b61099b565b005b61040d60048036038101906104089190612d4d565b610a04565b005b61042960048036038101906104249190612d4d565b610ade565b005b61044560048036038101906104409190612d4d565b610c40565b005b610461600480360381019061045c91906129fe565b610d1a565b60405161046e9190612a3a565b60405180910390f35b61047f610d62565b60405161048c9190612a3a565b60405180910390f35b6104af60048036038101906104aa9190612b35565b610d68565b6040516104bc9190612854565b60405180910390f35b6104cd610dd3565b6040516104da9190612908565b60405180910390f35b6104eb610e65565b6040516104f89190612b1a565b60405180910390f35b61051b600480360381019061051691906129be565b610e6c565b6040516105289190612854565b60405180910390f35b61054b600480360381019061054691906129be565b610ee3565b6040516105589190612854565b60405180910390f35b610569610f06565b6040516105769190612854565b60405180910390f35b61059960048036038101906105949190612b35565b610f19565b005b6105b560048036038101906105b091906129be565b610f3a565b005b6105d160048036038101906105cc9190612da9565b611016565b6040516105de9190612a3a565b60405180910390f35b6105ef61109d565b6040516105fc9190612df8565b60405180910390f35b61061f600480360381019061061a91906129be565b6110c3565b60405161062c9190612854565b60405180910390f35b61063d611142565b60405161064d9493929190612ed1565b60405180910390f35b610670600480360381019061066b9190612d4d565b6114a2565b005b61067a61157c565b6040516106879190612b1a565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107035750610702826115a0565b5b9050919050565b60606003805461071990612f61565b80601f016020809104026020016040519081016040528092919081815260200182805461074590612f61565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b6000806107a761160a565b90506107b4818585611612565b600191505092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6000806107f461160a565b90506108018582856117dd565b61080c858585611869565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b61084182610818565b61084a81611a6f565b6108548383611a83565b505050565b60006012905090565b61086a61160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90613005565b60405180910390fd5b6108e18282611b64565b5050565b6000806108f061160a565b90506109118185856109028589611016565b61090c9190613054565b611612565b600191505092915050565b60006109487ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906130f6565b60405180910390fd5b6109918383611c46565b6001905092915050565b6109a86000801b33610d68565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613162565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610a116000801b33610d68565b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613162565b60405180910390fd5b60005b8251811015610ad9578115610a9657610a90838281518110610a7857610a77613182565b5b6020026020010151600c611e1490919063ffffffff16565b50610ac6565b610ac4838281518110610aac57610aab613182565b5b6020026020010151600c611e4490919063ffffffff16565b505b8080610ad1906131b1565b915050610a53565b505050565b610aeb6000801b33610d68565b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613162565b60405180910390fd5b60005b8251811015610c3b578115610bb457610b807ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610b7357610b72613182565b5b6020026020010151610838565b610bae838281518110610b9657610b95613182565b5b6020026020010151600a611e1490919063ffffffff16565b50610c28565b610bf87ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610beb57610bea613182565b5b6020026020010151610f19565b610c26838281518110610c0e57610c0d613182565b5b6020026020010151600a611e4490919063ffffffff16565b505b8080610c33906131b1565b915050610b2d565b505050565b610c4d6000801b33610d68565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613162565b60405180910390fd5b60005b8251811015610d15578115610cd257610ccc838281518110610cb457610cb3613182565b5b60200260200101516008611e1490919063ffffffff16565b50610d02565b610d00838281518110610ce857610ce7613182565b5b60200260200101516008611e4490919063ffffffff16565b505b8080610d0d906131b1565b915050610c8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610de290612f61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90612f61565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000801b81565b600080610e7761160a565b90506000610e858286611016565b905083811015610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061326c565b60405180910390fd5b610ed78286868403611612565b60019250505092915050565b600080610eee61160a565b9050610efb818585611869565b600191505092915050565b600e60009054906101000a900460ff1681565b610f2282610818565b610f2b81611a6f565b610f358383611b64565b505050565b610f476000801b33610d68565b610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613162565b60405180910390fd5b6064811115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906132d8565b60405180910390fd5b81600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b61112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906130f6565b60405180910390fd5b6111388383611e74565b6001905092915050565b6060806060806111526006611fcb565b67ffffffffffffffff81111561116b5761116a612c0a565b5b6040519080825280602002602001820160405280156111995781602001602082028036833780820191505090505b50935060005b845181101561121c576111bc816006611fe090919063ffffffff16565b8582815181106111cf576111ce613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611214906131b1565b91505061119f565b506112276008611fcb565b67ffffffffffffffff8111156112405761123f612c0a565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50925060005b83518110156112f157611291816008611fe090919063ffffffff16565b8482815181106112a4576112a3613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806112e9906131b1565b915050611274565b506112fc600a611fcb565b67ffffffffffffffff81111561131557611314612c0a565b5b6040519080825280602002602001820160405280156113435781602001602082028036833780820191505090505b50915060005b82518110156113c65761136681600a611fe090919063ffffffff16565b83828151811061137957611378613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806113be906131b1565b915050611349565b506113d1600c611fcb565b67ffffffffffffffff8111156113ea576113e9612c0a565b5b6040519080825280602002602001820160405280156114185781602001602082028036833780820191505090505b50905060005b815181101561149b5761143b81600c611fe090919063ffffffff16565b82828151811061144e5761144d613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611493906131b1565b91505061141e565b5090919293565b6114af6000801b33610d68565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590613162565b60405180910390fd5b60005b82518110156115775781156115345761152e83828151811061151657611515613182565b5b60200260200101516006611e1490919063ffffffff16565b50611564565b61156283828151811061154a57611549613182565b5b60200260200101516006611e4490919063ffffffff16565b505b808061156f906131b1565b9150506114f1565b505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116799061336a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906133fc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117d09190612a3a565b60405180910390a3505050565b60006117e98484611016565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118635781811015611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613468565b60405180910390fd5b6118628484848403611612565b5b50505050565b600e60009054906101000a900460ff166118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af906134d4565b60405180910390fd5b60008114156118d2576118cd83836000611ffa565b611a6a565b60006118e884600661227290919063ffffffff16565b80611903575061190283600661227290919063ffffffff16565b5b9050600061191b85600c61227290919063ffffffff16565b80611936575061193584600c61227290919063ffffffff16565b5b90506000828015611945575081155b61195057600061195a565b611959846122a2565b5b90506000818561196a91906134f4565b905060008211156119a3576119a287600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ffa565b5b6119ae878783611ffa565b8315611a655760005b6119c16008611fcb565b811015611a63576119dc816008611fe090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1663fa57892f32338b8b8b886040518763ffffffff1660e01b8152600401611a1e96959493929190613528565b600060405180830381600087803b158015611a3857600080fd5b505af1158015611a4c573d6000803e3d6000fd5b505050508080611a5b906131b1565b9150506119b7565b505b505050505b505050565b611a8081611a7b61160a565b6122c5565b50565b611a8d8282610d68565b611b605760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b0561160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b6e8282610d68565b15611c425760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611be761160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906135fb565b60405180910390fd5b611cc28260008361234a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061368d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dfb9190612a3a565b60405180910390a3611e0f8360008461234f565b505050565b6000611e3c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612354565b905092915050565b6000611e6c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6123c4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb906136f9565b60405180910390fd5b611ef06000838361234a565b8060026000828254611f029190613054565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb39190612a3a565b60405180910390a3611fc76000838361234f565b5050565b6000611fd9826000016124d8565b9050919050565b6000611fef83600001836124e9565b60001c905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561206a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120619061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061381d565b60405180910390fd5b6120e583838361234a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906138af565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122599190612a3a565b60405180910390a361226c84848461234f565b50505050565b600061229a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612514565b905092915050565b60006064600f54836122b491906138cf565b6122be9190613958565b9050919050565b6122cf8282610d68565b612346576122dc81612537565b6122ea8360001c6020612564565b6040516020016122fb929190613a5d565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d9190612908565b60405180910390fd5b5050565b505050565b505050565b60006123608383612514565b6123b95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123be565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146124cc5760006001826123f691906134f4565b905060006001866000018054905061240e91906134f4565b905081811461247d57600086600001828154811061242f5761242e613182565b5b906000526020600020015490508087600001848154811061245357612452613182565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061249157612490613a97565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124d2565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061250157612500613182565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b606061255d8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612564565b9050919050565b60606000600283600261257791906138cf565b6125819190613054565b67ffffffffffffffff81111561259a57612599612c0a565b5b6040519080825280601f01601f1916602001820160405280156125cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260457612603613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266857612667613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a891906138cf565b6126b29190613054565b90505b6001811115612752577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f4576126f3613182565b5b1a60f81b82828151811061270b5761270a613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274b90613ac6565b90506126b5565b5060008414612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90613b3c565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127e9816127b4565b81146127f457600080fd5b50565b600081359050612806816127e0565b92915050565b600060208284031215612822576128216127aa565b5b6000612830848285016127f7565b91505092915050565b60008115159050919050565b61284e81612839565b82525050565b60006020820190506128696000830184612845565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128a957808201518184015260208101905061288e565b838111156128b8576000848401525b50505050565b6000601f19601f8301169050919050565b60006128da8261286f565b6128e4818561287a565b93506128f481856020860161288b565b6128fd816128be565b840191505092915050565b6000602082019050818103600083015261292281846128cf565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129558261292a565b9050919050565b6129658161294a565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b600080604083850312156129d5576129d46127aa565b5b60006129e385828601612973565b92505060206129f4858286016129a9565b9150509250929050565b600060208284031215612a1457612a136127aa565b5b6000612a2284828501612973565b91505092915050565b612a3481612988565b82525050565b6000602082019050612a4f6000830184612a2b565b92915050565b600080600060608486031215612a6e57612a6d6127aa565b5b6000612a7c86828701612973565b9350506020612a8d86828701612973565b9250506040612a9e868287016129a9565b9150509250925092565b6000819050919050565b612abb81612aa8565b8114612ac657600080fd5b50565b600081359050612ad881612ab2565b92915050565b600060208284031215612af457612af36127aa565b5b6000612b0284828501612ac9565b91505092915050565b612b1481612aa8565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b60008060408385031215612b4c57612b4b6127aa565b5b6000612b5a85828601612ac9565b9250506020612b6b85828601612973565b9150509250929050565b600060ff82169050919050565b612b8b81612b75565b82525050565b6000602082019050612ba66000830184612b82565b92915050565b612bb581612839565b8114612bc057600080fd5b50565b600081359050612bd281612bac565b92915050565b600060208284031215612bee57612bed6127aa565b5b6000612bfc84828501612bc3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c42826128be565b810181811067ffffffffffffffff82111715612c6157612c60612c0a565b5b80604052505050565b6000612c746127a0565b9050612c808282612c39565b919050565b600067ffffffffffffffff821115612ca057612c9f612c0a565b5b602082029050602081019050919050565b600080fd5b6000612cc9612cc484612c85565b612c6a565b90508083825260208201905060208402830185811115612cec57612ceb612cb1565b5b835b81811015612d155780612d018882612973565b845260208401935050602081019050612cee565b5050509392505050565b600082601f830112612d3457612d33612c05565b5b8135612d44848260208601612cb6565b91505092915050565b60008060408385031215612d6457612d636127aa565b5b600083013567ffffffffffffffff811115612d8257612d816127af565b5b612d8e85828601612d1f565b9250506020612d9f85828601612bc3565b9150509250929050565b60008060408385031215612dc057612dbf6127aa565b5b6000612dce85828601612973565b9250506020612ddf85828601612973565b9150509250929050565b612df28161294a565b82525050565b6000602082019050612e0d6000830184612de9565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e488161294a565b82525050565b6000612e5a8383612e3f565b60208301905092915050565b6000602082019050919050565b6000612e7e82612e13565b612e888185612e1e565b9350612e9383612e2f565b8060005b83811015612ec4578151612eab8882612e4e565b9750612eb683612e66565b925050600181019050612e97565b5085935050505092915050565b60006080820190508181036000830152612eeb8187612e73565b90508181036020830152612eff8186612e73565b90508181036040830152612f138185612e73565b90508181036060830152612f278184612e73565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7957607f821691505b60208210811415612f8d57612f8c612f32565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fef602f8361287a565b9150612ffa82612f93565b604082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061305f82612988565b915061306a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561309f5761309e613025565b5b828201905092915050565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b60006130e060168361287a565b91506130eb826130aa565b602082019050919050565b6000602082019050818103600083015261310f816130d3565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b600061314c60178361287a565b915061315782613116565b602082019050919050565b6000602082019050818103600083015261317b8161313f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131bc82612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ef576131ee613025565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325660258361287a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f5461782070657263656e74206d757374206265203c3d20313030000000000000600082015250565b60006132c2601a8361287a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061335460248361287a565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133e660228361287a565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613452601d8361287a565b915061345d8261341c565b602082019050919050565b6000602082019050818103600083015261348181613445565b9050919050565b7f5472616e7366657273206172652064697361626c656400000000000000000000600082015250565b60006134be60168361287a565b91506134c982613488565b602082019050919050565b600060208201905081810360008301526134ed816134b1565b9050919050565b60006134ff82612988565b915061350a83612988565b92508282101561351d5761351c613025565b5b828203905092915050565b600060c08201905061353d6000830189612de9565b61354a6020830188612de9565b6135576040830187612de9565b6135646060830186612de9565b6135716080830185612a2b565b61357e60a0830184612a2b565b979650505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e560218361287a565b91506135f082613589565b604082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061367760228361287a565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006136e3601f8361287a565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061377560258361287a565b915061378082613719565b604082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061380760238361287a565b9150613812826137ab565b604082019050919050565b60006020820190508181036000830152613836816137fa565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061389960268361287a565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b60006138da82612988565b91506138e583612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391e5761391d613025565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061396382612988565b915061396e83612988565b92508261397e5761397d613929565b5b828204905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006139ca601783613989565b91506139d582613994565b601782019050919050565b60006139eb8261286f565b6139f58185613989565b9350613a0581856020860161288b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613a47601183613989565b9150613a5282613a11565b601182019050919050565b6000613a68826139bd565b9150613a7482856139e0565b9150613a7f82613a3a565b9150613a8b82846139e0565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613ad182612988565b91506000821415613ae557613ae4613025565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613b2660208361287a565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b905091905056fea26469706673582212203372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a5864736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063d547741f116100a2578063ed35a8f911610071578063ed35a8f914610605578063f030a76314610635578063f836a69714610656578063fe6d812414610672576101f0565b8063d547741f1461057f578063d85d2e601461059b578063dd62ed3e146105b7578063e6ef73d6146105e7576101f0565b8063a217fddf116100de578063a217fddf146104e3578063a457c2d714610501578063a9059cbb14610531578063bef97c8714610561576101f0565b806370a08231146104475780637541f41c1461047757806391d148541461049557806395d89b41146104c5576101f0565b8063313ce567116101875780635a9d1c31116101565780635a9d1c31146103d75780635e3eb5ef146103f357806369fb78441461040f5780636fb3caee1461042b576101f0565b8063313ce5671461033d57806336568abe1461035b578063395093511461037757806356a3dbc2146103a7576101f0565b806318160ddd116101c357806318160ddd146102a357806323b872dd146102c1578063248a9ca3146102f15780632f2ff15d14610321576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b3146102435780630c1936b914610273575b600080fd5b61020f600480360381019061020a919061280c565b610690565b60405161021c9190612854565b60405180910390f35b61022d61070a565b60405161023a9190612908565b60405180910390f35b61025d600480360381019061025891906129be565b61079c565b60405161026a9190612854565b60405180910390f35b61028d600480360381019061028891906129fe565b6107bf565b60405161029a9190612854565b60405180910390f35b6102ab6107df565b6040516102b89190612a3a565b60405180910390f35b6102db60048036038101906102d69190612a55565b6107e9565b6040516102e89190612854565b60405180910390f35b61030b60048036038101906103069190612ade565b610818565b6040516103189190612b1a565b60405180910390f35b61033b60048036038101906103369190612b35565b610838565b005b610345610859565b6040516103529190612b91565b60405180910390f35b61037560048036038101906103709190612b35565b610862565b005b610391600480360381019061038c91906129be565b6108e5565b60405161039e9190612854565b60405180910390f35b6103c160048036038101906103bc91906129be565b61091c565b6040516103ce9190612854565b60405180910390f35b6103f160048036038101906103ec9190612bd8565b61099b565b005b61040d60048036038101906104089190612d4d565b610a04565b005b61042960048036038101906104249190612d4d565b610ade565b005b61044560048036038101906104409190612d4d565b610c40565b005b610461600480360381019061045c91906129fe565b610d1a565b60405161046e9190612a3a565b60405180910390f35b61047f610d62565b60405161048c9190612a3a565b60405180910390f35b6104af60048036038101906104aa9190612b35565b610d68565b6040516104bc9190612854565b60405180910390f35b6104cd610dd3565b6040516104da9190612908565b60405180910390f35b6104eb610e65565b6040516104f89190612b1a565b60405180910390f35b61051b600480360381019061051691906129be565b610e6c565b6040516105289190612854565b60405180910390f35b61054b600480360381019061054691906129be565b610ee3565b6040516105589190612854565b60405180910390f35b610569610f06565b6040516105769190612854565b60405180910390f35b61059960048036038101906105949190612b35565b610f19565b005b6105b560048036038101906105b091906129be565b610f3a565b005b6105d160048036038101906105cc9190612da9565b611016565b6040516105de9190612a3a565b60405180910390f35b6105ef61109d565b6040516105fc9190612df8565b60405180910390f35b61061f600480360381019061061a91906129be565b6110c3565b60405161062c9190612854565b60405180910390f35b61063d611142565b60405161064d9493929190612ed1565b60405180910390f35b610670600480360381019061066b9190612d4d565b6114a2565b005b61067a61157c565b6040516106879190612b1a565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107035750610702826115a0565b5b9050919050565b60606003805461071990612f61565b80601f016020809104026020016040519081016040528092919081815260200182805461074590612f61565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b6000806107a761160a565b90506107b4818585611612565b600191505092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6000806107f461160a565b90506108018582856117dd565b61080c858585611869565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b61084182610818565b61084a81611a6f565b6108548383611a83565b505050565b60006012905090565b61086a61160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90613005565b60405180910390fd5b6108e18282611b64565b5050565b6000806108f061160a565b90506109118185856109028589611016565b61090c9190613054565b611612565b600191505092915050565b60006109487ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906130f6565b60405180910390fd5b6109918383611c46565b6001905092915050565b6109a86000801b33610d68565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613162565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610a116000801b33610d68565b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613162565b60405180910390fd5b60005b8251811015610ad9578115610a9657610a90838281518110610a7857610a77613182565b5b6020026020010151600c611e1490919063ffffffff16565b50610ac6565b610ac4838281518110610aac57610aab613182565b5b6020026020010151600c611e4490919063ffffffff16565b505b8080610ad1906131b1565b915050610a53565b505050565b610aeb6000801b33610d68565b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613162565b60405180910390fd5b60005b8251811015610c3b578115610bb457610b807ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610b7357610b72613182565b5b6020026020010151610838565b610bae838281518110610b9657610b95613182565b5b6020026020010151600a611e1490919063ffffffff16565b50610c28565b610bf87ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610beb57610bea613182565b5b6020026020010151610f19565b610c26838281518110610c0e57610c0d613182565b5b6020026020010151600a611e4490919063ffffffff16565b505b8080610c33906131b1565b915050610b2d565b505050565b610c4d6000801b33610d68565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613162565b60405180910390fd5b60005b8251811015610d15578115610cd257610ccc838281518110610cb457610cb3613182565b5b60200260200101516008611e1490919063ffffffff16565b50610d02565b610d00838281518110610ce857610ce7613182565b5b60200260200101516008611e4490919063ffffffff16565b505b8080610d0d906131b1565b915050610c8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610de290612f61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90612f61565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000801b81565b600080610e7761160a565b90506000610e858286611016565b905083811015610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061326c565b60405180910390fd5b610ed78286868403611612565b60019250505092915050565b600080610eee61160a565b9050610efb818585611869565b600191505092915050565b600e60009054906101000a900460ff1681565b610f2282610818565b610f2b81611a6f565b610f358383611b64565b505050565b610f476000801b33610d68565b610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613162565b60405180910390fd5b6064811115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906132d8565b60405180910390fd5b81600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b61112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906130f6565b60405180910390fd5b6111388383611e74565b6001905092915050565b6060806060806111526006611fcb565b67ffffffffffffffff81111561116b5761116a612c0a565b5b6040519080825280602002602001820160405280156111995781602001602082028036833780820191505090505b50935060005b845181101561121c576111bc816006611fe090919063ffffffff16565b8582815181106111cf576111ce613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611214906131b1565b91505061119f565b506112276008611fcb565b67ffffffffffffffff8111156112405761123f612c0a565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50925060005b83518110156112f157611291816008611fe090919063ffffffff16565b8482815181106112a4576112a3613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806112e9906131b1565b915050611274565b506112fc600a611fcb565b67ffffffffffffffff81111561131557611314612c0a565b5b6040519080825280602002602001820160405280156113435781602001602082028036833780820191505090505b50915060005b82518110156113c65761136681600a611fe090919063ffffffff16565b83828151811061137957611378613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806113be906131b1565b915050611349565b506113d1600c611fcb565b67ffffffffffffffff8111156113ea576113e9612c0a565b5b6040519080825280602002602001820160405280156114185781602001602082028036833780820191505090505b50905060005b815181101561149b5761143b81600c611fe090919063ffffffff16565b82828151811061144e5761144d613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611493906131b1565b91505061141e565b5090919293565b6114af6000801b33610d68565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590613162565b60405180910390fd5b60005b82518110156115775781156115345761152e83828151811061151657611515613182565b5b60200260200101516006611e1490919063ffffffff16565b50611564565b61156283828151811061154a57611549613182565b5b60200260200101516006611e4490919063ffffffff16565b505b808061156f906131b1565b9150506114f1565b505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116799061336a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906133fc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117d09190612a3a565b60405180910390a3505050565b60006117e98484611016565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118635781811015611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613468565b60405180910390fd5b6118628484848403611612565b5b50505050565b600e60009054906101000a900460ff166118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af906134d4565b60405180910390fd5b60008114156118d2576118cd83836000611ffa565b611a6a565b60006118e884600661227290919063ffffffff16565b80611903575061190283600661227290919063ffffffff16565b5b9050600061191b85600c61227290919063ffffffff16565b80611936575061193584600c61227290919063ffffffff16565b5b90506000828015611945575081155b61195057600061195a565b611959846122a2565b5b90506000818561196a91906134f4565b905060008211156119a3576119a287600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ffa565b5b6119ae878783611ffa565b8315611a655760005b6119c16008611fcb565b811015611a63576119dc816008611fe090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1663fa57892f32338b8b8b886040518763ffffffff1660e01b8152600401611a1e96959493929190613528565b600060405180830381600087803b158015611a3857600080fd5b505af1158015611a4c573d6000803e3d6000fd5b505050508080611a5b906131b1565b9150506119b7565b505b505050505b505050565b611a8081611a7b61160a565b6122c5565b50565b611a8d8282610d68565b611b605760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b0561160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b6e8282610d68565b15611c425760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611be761160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906135fb565b60405180910390fd5b611cc28260008361234a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061368d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dfb9190612a3a565b60405180910390a3611e0f8360008461234f565b505050565b6000611e3c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612354565b905092915050565b6000611e6c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6123c4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb906136f9565b60405180910390fd5b611ef06000838361234a565b8060026000828254611f029190613054565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb39190612a3a565b60405180910390a3611fc76000838361234f565b5050565b6000611fd9826000016124d8565b9050919050565b6000611fef83600001836124e9565b60001c905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561206a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120619061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061381d565b60405180910390fd5b6120e583838361234a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906138af565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122599190612a3a565b60405180910390a361226c84848461234f565b50505050565b600061229a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612514565b905092915050565b60006064600f54836122b491906138cf565b6122be9190613958565b9050919050565b6122cf8282610d68565b612346576122dc81612537565b6122ea8360001c6020612564565b6040516020016122fb929190613a5d565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d9190612908565b60405180910390fd5b5050565b505050565b505050565b60006123608383612514565b6123b95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123be565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146124cc5760006001826123f691906134f4565b905060006001866000018054905061240e91906134f4565b905081811461247d57600086600001828154811061242f5761242e613182565b5b906000526020600020015490508087600001848154811061245357612452613182565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061249157612490613a97565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124d2565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061250157612500613182565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b606061255d8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612564565b9050919050565b60606000600283600261257791906138cf565b6125819190613054565b67ffffffffffffffff81111561259a57612599612c0a565b5b6040519080825280601f01601f1916602001820160405280156125cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260457612603613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266857612667613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a891906138cf565b6126b29190613054565b90505b6001811115612752577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f4576126f3613182565b5b1a60f81b82828151811061270b5761270a613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274b90613ac6565b90506126b5565b5060008414612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90613b3c565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127e9816127b4565b81146127f457600080fd5b50565b600081359050612806816127e0565b92915050565b600060208284031215612822576128216127aa565b5b6000612830848285016127f7565b91505092915050565b60008115159050919050565b61284e81612839565b82525050565b60006020820190506128696000830184612845565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128a957808201518184015260208101905061288e565b838111156128b8576000848401525b50505050565b6000601f19601f8301169050919050565b60006128da8261286f565b6128e4818561287a565b93506128f481856020860161288b565b6128fd816128be565b840191505092915050565b6000602082019050818103600083015261292281846128cf565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129558261292a565b9050919050565b6129658161294a565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b600080604083850312156129d5576129d46127aa565b5b60006129e385828601612973565b92505060206129f4858286016129a9565b9150509250929050565b600060208284031215612a1457612a136127aa565b5b6000612a2284828501612973565b91505092915050565b612a3481612988565b82525050565b6000602082019050612a4f6000830184612a2b565b92915050565b600080600060608486031215612a6e57612a6d6127aa565b5b6000612a7c86828701612973565b9350506020612a8d86828701612973565b9250506040612a9e868287016129a9565b9150509250925092565b6000819050919050565b612abb81612aa8565b8114612ac657600080fd5b50565b600081359050612ad881612ab2565b92915050565b600060208284031215612af457612af36127aa565b5b6000612b0284828501612ac9565b91505092915050565b612b1481612aa8565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b60008060408385031215612b4c57612b4b6127aa565b5b6000612b5a85828601612ac9565b9250506020612b6b85828601612973565b9150509250929050565b600060ff82169050919050565b612b8b81612b75565b82525050565b6000602082019050612ba66000830184612b82565b92915050565b612bb581612839565b8114612bc057600080fd5b50565b600081359050612bd281612bac565b92915050565b600060208284031215612bee57612bed6127aa565b5b6000612bfc84828501612bc3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c42826128be565b810181811067ffffffffffffffff82111715612c6157612c60612c0a565b5b80604052505050565b6000612c746127a0565b9050612c808282612c39565b919050565b600067ffffffffffffffff821115612ca057612c9f612c0a565b5b602082029050602081019050919050565b600080fd5b6000612cc9612cc484612c85565b612c6a565b90508083825260208201905060208402830185811115612cec57612ceb612cb1565b5b835b81811015612d155780612d018882612973565b845260208401935050602081019050612cee565b5050509392505050565b600082601f830112612d3457612d33612c05565b5b8135612d44848260208601612cb6565b91505092915050565b60008060408385031215612d6457612d636127aa565b5b600083013567ffffffffffffffff811115612d8257612d816127af565b5b612d8e85828601612d1f565b9250506020612d9f85828601612bc3565b9150509250929050565b60008060408385031215612dc057612dbf6127aa565b5b6000612dce85828601612973565b9250506020612ddf85828601612973565b9150509250929050565b612df28161294a565b82525050565b6000602082019050612e0d6000830184612de9565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e488161294a565b82525050565b6000612e5a8383612e3f565b60208301905092915050565b6000602082019050919050565b6000612e7e82612e13565b612e888185612e1e565b9350612e9383612e2f565b8060005b83811015612ec4578151612eab8882612e4e565b9750612eb683612e66565b925050600181019050612e97565b5085935050505092915050565b60006080820190508181036000830152612eeb8187612e73565b90508181036020830152612eff8186612e73565b90508181036040830152612f138185612e73565b90508181036060830152612f278184612e73565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7957607f821691505b60208210811415612f8d57612f8c612f32565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fef602f8361287a565b9150612ffa82612f93565b604082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061305f82612988565b915061306a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561309f5761309e613025565b5b828201905092915050565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b60006130e060168361287a565b91506130eb826130aa565b602082019050919050565b6000602082019050818103600083015261310f816130d3565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b600061314c60178361287a565b915061315782613116565b602082019050919050565b6000602082019050818103600083015261317b8161313f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131bc82612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ef576131ee613025565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325660258361287a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f5461782070657263656e74206d757374206265203c3d20313030000000000000600082015250565b60006132c2601a8361287a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061335460248361287a565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133e660228361287a565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613452601d8361287a565b915061345d8261341c565b602082019050919050565b6000602082019050818103600083015261348181613445565b9050919050565b7f5472616e7366657273206172652064697361626c656400000000000000000000600082015250565b60006134be60168361287a565b91506134c982613488565b602082019050919050565b600060208201905081810360008301526134ed816134b1565b9050919050565b60006134ff82612988565b915061350a83612988565b92508282101561351d5761351c613025565b5b828203905092915050565b600060c08201905061353d6000830189612de9565b61354a6020830188612de9565b6135576040830187612de9565b6135646060830186612de9565b6135716080830185612a2b565b61357e60a0830184612a2b565b979650505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e560218361287a565b91506135f082613589565b604082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061367760228361287a565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006136e3601f8361287a565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061377560258361287a565b915061378082613719565b604082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061380760238361287a565b9150613812826137ab565b604082019050919050565b60006020820190508181036000830152613836816137fa565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061389960268361287a565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b60006138da82612988565b91506138e583612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391e5761391d613025565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061396382612988565b915061396e83612988565b92508261397e5761397d613929565b5b828204905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006139ca601783613989565b91506139d582613994565b601782019050919050565b60006139eb8261286f565b6139f58185613989565b9350613a0581856020860161288b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613a47601183613989565b9150613a5282613a11565b601182019050919050565b6000613a68826139bd565b9150613a7482856139e0565b9150613a7f82613a3a565b9150613a8b82846139e0565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613ad182612988565b91506000821415613ae557613ae4613025565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613b2660208361287a565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b905091905056fea26469706673582212203372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a5864736f6c63430008090033
Deployed Bytecode Sourcemap
58412:5082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52464:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35658:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38009:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58897:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36778:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38790:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54287:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54728:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36620:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55872:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39494:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63214:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62083:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60491:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60045:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59374:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36949:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58865:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52760:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35877:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51865:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40235:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37282:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58790:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55168:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61844:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37538:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58832:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63064:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60839:997;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;59704:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58518:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52464:204;52549:4;52588:32;52573:47;;;:11;:47;;;;:87;;;;52624:36;52648:11;52624:23;:36::i;:::-;52573:87;52566:94;;52464:204;;;:::o;35658:100::-;35712:13;35745:5;35738:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35658:100;:::o;38009:201::-;38092:4;38109:13;38125:12;:10;:12::i;:::-;38109:28;;38148:32;38157:5;38164:7;38173:6;38148:8;:32::i;:::-;38198:4;38191:11;;;38009:201;;;;:::o;58897:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;36778:108::-;36839:7;36866:12;;36859:19;;36778:108;:::o;38790:295::-;38921:4;38938:15;38956:12;:10;:12::i;:::-;38938:30;;38979:38;38995:4;39001:7;39010:6;38979:15;:38::i;:::-;39028:27;39038:4;39044:2;39048:6;39028:9;:27::i;:::-;39073:4;39066:11;;;38790:295;;;;;:::o;54287:131::-;54361:7;54388:6;:12;54395:4;54388:12;;;;;;;;;;;:22;;;54381:29;;54287:131;;;:::o;54728:147::-;54811:18;54824:4;54811:12;:18::i;:::-;52356:16;52367:4;52356:10;:16::i;:::-;54842:25:::1;54853:4;54859:7;54842:10;:25::i;:::-;54728:147:::0;;;:::o;36620:93::-;36678:5;36703:2;36696:9;;36620:93;:::o;55872:218::-;55979:12;:10;:12::i;:::-;55968:23;;:7;:23;;;55960:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56056:26;56068:4;56074:7;56056:11;:26::i;:::-;55872:218;;:::o;39494:238::-;39582:4;39599:13;39615:12;:10;:12::i;:::-;39599:28;;39638:64;39647:5;39654:7;39691:10;39663:25;39673:5;39680:7;39663:9;:25::i;:::-;:38;;;;:::i;:::-;39638:8;:64::i;:::-;39720:4;39713:11;;;39494:238;;;;:::o;63214:146::-;63294:4;59099:27;58551:19;59115:10;59099:7;:27::i;:::-;59091:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63311:19:::1;63317:4;63323:6;63311:5;:19::i;:::-;63348:4;63341:11;;63214:146:::0;;;;:::o;62083:103::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;62171:7:::1;62152:16;;:26;;;;;;;;;;;;;;;;;;62083:103:::0;:::o;60491:343::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60596:9:::1;60591:239;60615:17;:24;60611:1;:28;60591:239;;;60659:8;60655:170;;;60685:42;60706:17;60724:1;60706:20;;;;;;;;:::i;:::-;;;;;;;;60685:16;:20;;:42;;;;:::i;:::-;;60655:170;;;60767:45;60791:17;60809:1;60791:20;;;;;;;;:::i;:::-;;;;;;;;60767:16;:23;;:45;;;;:::i;:::-;;60655:170;60641:3;;;;;:::i;:::-;;;;60591:239;;;;60491:343:::0;;:::o;60045:441::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60151:9:::1;60146:333;60170:16;:23;60166:1;:27;60146:333;;;60216:7;60212:262;;;60241:38;58551:19;60259:16;60276:1;60259:19;;;;;;;;:::i;:::-;;;;;;;;60241:9;:38::i;:::-;60286:40;60306:16;60323:1;60306:19;;;;;;;;:::i;:::-;;;;;;;;60286:15;:19;;:40;;;;:::i;:::-;;60212:262;;;60372:39;58551:19;60391:16;60408:1;60391:19;;;;;;;;:::i;:::-;;;;;;;;60372:10;:39::i;:::-;60418:43;60441:16;60458:1;60441:19;;;;;;;;:::i;:::-;;;;;;;;60418:15;:22;;:43;;;;:::i;:::-;;60212:262;60195:3;;;;;:::i;:::-;;;;60146:333;;;;60045:441:::0;;:::o;59374:322::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59475:9:::1;59470:222;59494:14;:21;59490:1;:25;59470:222;;;59538:3;59534:153;;;59559:36;59577:14;59592:1;59577:17;;;;;;;;:::i;:::-;;;;;;;;59559:13;:17;;:36;;;;:::i;:::-;;59534:153;;;59635:39;59656:14;59671:1;59656:17;;;;;;;;:::i;:::-;;;;;;;;59635:13;:20;;:39;;;;:::i;:::-;;59534:153;59517:3;;;;;:::i;:::-;;;;59470:222;;;;59374:322:::0;;:::o;36949:127::-;37023:7;37050:9;:18;37060:7;37050:18;;;;;;;;;;;;;;;;37043:25;;36949:127;;;:::o;58865:25::-;;;;:::o;52760:147::-;52846:4;52870:6;:12;52877:4;52870:12;;;;;;;;;;;:20;;:29;52891:7;52870:29;;;;;;;;;;;;;;;;;;;;;;;;;52863:36;;52760:147;;;;:::o;35877:104::-;35933:13;35966:7;35959:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35877:104;:::o;51865:49::-;51910:4;51865:49;;;:::o;40235:436::-;40328:4;40345:13;40361:12;:10;:12::i;:::-;40345:28;;40384:24;40411:25;40421:5;40428:7;40411:9;:25::i;:::-;40384:52;;40475:15;40455:16;:35;;40447:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40568:60;40577:5;40584:7;40612:15;40593:16;:34;40568:8;:60::i;:::-;40659:4;40652:11;;;;40235:436;;;;:::o;37282:193::-;37361:4;37378:13;37394:12;:10;:12::i;:::-;37378:28;;37417;37427:5;37434:2;37438:6;37417:9;:28::i;:::-;37463:4;37456:11;;;37282:193;;;;:::o;58790:35::-;;;;;;;;;;;;;:::o;55168:149::-;55252:18;55265:4;55252:12;:18::i;:::-;52356:16;52367:4;52356:10;:16::i;:::-;55283:26:::1;55295:4;55301:7;55283:11;:26::i;:::-;55168:149:::0;;;:::o;61844:231::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61961:3:::1;61946:11;:18;;61938:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62020:12;62006:11;;:26;;;;;;;;;;;;;;;;;;62056:11;62043:10;:24;;;;61844:231:::0;;:::o;37538:151::-;37627:7;37654:11;:18;37666:5;37654:18;;;;;;;;;;;;;;;:27;37673:7;37654:27;;;;;;;;;;;;;;;;37647:34;;37538:151;;;;:::o;58832:26::-;;;;;;;;;;;;;:::o;63064:142::-;63142:4;59099:27;58551:19;59115:10;59099:7;:27::i;:::-;59091:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63159:17:::1;63165:2;63169:6;63159:5;:17::i;:::-;63194:4;63187:11;;63064:142:::0;;;;:::o;60839:997::-;60892:35;60932:33;60970:35;61010:36;61091:24;:15;:22;:24::i;:::-;61077:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61056:60;;61129:9;61124:122;61148:18;:25;61144:1;:29;61124:122;;;61216:21;61235:1;61216:15;:18;;:21;;;;:::i;:::-;61192:18;61211:1;61192:21;;;;;;;;:::i;:::-;;;;;;;:45;;;;;;;;;;;61175:3;;;;;:::i;:::-;;;;61124:122;;;;61286:22;:13;:20;:22::i;:::-;61272:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61253:56;;61322:9;61317:116;61341:16;:23;61337:1;:27;61317:116;;;61405:19;61422:1;61405:13;:16;;:19;;;;:::i;:::-;61383:16;61400:1;61383:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;61366:3;;;;;:::i;:::-;;;;61317:116;;;;61475:24;:15;:22;:24::i;:::-;61461:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61440:60;;61513:9;61508:122;61532:18;:25;61528:1;:29;61508:122;;;61600:21;61619:1;61600:15;:18;;:21;;;;:::i;:::-;61576:18;61595:1;61576:21;;;;;;;;:::i;:::-;;;;;;;:45;;;;;;;;;;;61559:3;;;;;:::i;:::-;;;;61508:122;;;;61673:25;:16;:23;:25::i;:::-;61659:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61637:62;;61712:9;61707:125;61731:19;:26;61727:1;:30;61707:125;;;61801:22;61821:1;61801:16;:19;;:22;;;;:::i;:::-;61776:19;61796:1;61776:22;;;;;;;;:::i;:::-;;;;;;;:47;;;;;;;;;;;61759:3;;;;;:::i;:::-;;;;61707:125;;;;60839:997;;;;:::o;59704:336::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59809:9:::1;59804:232;59828:16;:23;59824:1;:27;59804:232;;;59874:3;59870:161;;;59895:40;59915:16;59932:1;59915:19;;;;;;;;:::i;:::-;;;;;;;;59895:15;:19;;:40;;;;:::i;:::-;;59870:161;;;59975:43;59998:16;60015:1;59998:19;;;;;;;;:::i;:::-;;;;;;;;59975:15;:22;;:43;;;;:::i;:::-;;59870:161;59853:3;;;;;:::i;:::-;;;;59804:232;;;;59704:336:::0;;:::o;58518:52::-;58551:19;58518:52;:::o;17258:157::-;17343:4;17382:25;17367:40;;;:11;:40;;;;17360:47;;17258:157;;;:::o;33300:98::-;33353:7;33380:10;33373:17;;33300:98;:::o;44262:380::-;44415:1;44398:19;;:5;:19;;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44496:1;44477:21;;:7;:21;;;;44469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44580:6;44550:11;:18;44562:5;44550:18;;;;;;;;;;;;;;;:27;44569:7;44550:27;;;;;;;;;;;;;;;:36;;;;44618:7;44602:32;;44611:5;44602:32;;;44627:6;44602:32;;;;;;:::i;:::-;;;;;;;;44262:380;;;:::o;44933:453::-;45068:24;45095:25;45105:5;45112:7;45095:9;:25::i;:::-;45068:52;;45155:17;45135:16;:37;45131:248;;45217:6;45197:16;:26;;45189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45301:51;45310:5;45317:7;45345:6;45326:16;:25;45301:8;:51::i;:::-;45131:248;45057:329;44933:453;;;:::o;62194:862::-;62292:16;;;;;;;;;;;62284:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62357:1;62347:6;:11;62343:84;;;62372:28;62388:4;62394:2;62398:1;62372:15;:28::i;:::-;62412:7;;62343:84;62434:13;62450:30;62475:4;62450:15;:24;;:30;;;;:::i;:::-;:62;;;;62484:28;62509:2;62484:15;:24;;:28;;;;:::i;:::-;62450:62;62434:78;;62520:18;62541:31;62567:4;62541:16;:25;;:31;;;;:::i;:::-;:64;;;;62576:29;62602:2;62576:16;:25;;:29;;;;:::i;:::-;62541:64;62520:85;;62613:12;62628:8;:26;;;;;62641:13;62640:14;62628:26;:53;;62680:1;62628:53;;;62657:20;62670:6;62657:12;:20::i;:::-;62628:53;62613:68;;62689:17;62718:4;62709:6;:13;;;;:::i;:::-;62689:33;;62741:1;62734:4;:8;62730:75;;;62756:40;62772:4;62778:11;;;;;;;;;;;62791:4;62756:15;:40::i;:::-;62730:75;62812:36;62828:4;62834:2;62838:9;62812:15;:36::i;:::-;62860:8;62856:196;;;62887:9;62882:162;62906:22;:13;:20;:22::i;:::-;62902:1;:26;62882:162;;;62954:19;62971:1;62954:13;:16;;:19;;;;:::i;:::-;62948:31;;;62980:9;62991:10;63003:4;63009:2;63013:6;63021:9;62948:83;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62930:3;;;;;:::i;:::-;;;;62882:162;;;;62856:196;62273:783;;;;62194:862;;;;:::o;53211:105::-;53278:30;53289:4;53295:12;:10;:12::i;:::-;53278:10;:30::i;:::-;53211:105;:::o;57469:238::-;57553:22;57561:4;57567:7;57553;:22::i;:::-;57548:152;;57624:4;57592:6;:12;57599:4;57592:12;;;;;;;;;;;:20;;:29;57613:7;57592:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57675:12;:10;:12::i;:::-;57648:40;;57666:7;57648:40;;57660:4;57648:40;;;;;;;;;;57548:152;57469:238;;:::o;57887:239::-;57971:22;57979:4;57985:7;57971;:22::i;:::-;57967:152;;;58042:5;58010:6;:12;58017:4;58010:12;;;;;;;;;;;:20;;:29;58031:7;58010:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58094:12;:10;:12::i;:::-;58067:40;;58085:7;58067:40;;58079:4;58067:40;;;;;;;;;;57967:152;57887:239;;:::o;43149:675::-;43252:1;43233:21;;:7;:21;;;;43225:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43305:49;43326:7;43343:1;43347:6;43305:20;:49::i;:::-;43367:22;43392:9;:18;43402:7;43392:18;;;;;;;;;;;;;;;;43367:43;;43447:6;43429:14;:24;;43421:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43566:6;43549:14;:23;43528:9;:18;43538:7;43528:18;;;;;;;;;;;;;;;:44;;;;43683:6;43667:12;;:22;;;;;;;;;;;43744:1;43718:37;;43727:7;43718:37;;;43748:6;43718:37;;;;;;:::i;:::-;;;;;;;;43768:48;43788:7;43805:1;43809:6;43768:19;:48::i;:::-;43214:610;43149:675;;:::o;7069:152::-;7139:4;7163:50;7168:3;:10;;7204:5;7188:23;;7180:32;;7163:4;:50::i;:::-;7156:57;;7069:152;;;;:::o;7397:158::-;7470:4;7494:53;7502:3;:10;;7538:5;7522:23;;7514:32;;7494:7;:53::i;:::-;7487:60;;7397:158;;;;:::o;42268:548::-;42371:1;42352:21;;:7;:21;;;;42344:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42422:49;42451:1;42455:7;42464:6;42422:20;:49::i;:::-;42500:6;42484:12;;:22;;;;;;;:::i;:::-;;;;;;;;42677:6;42655:9;:18;42665:7;42655:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;42731:7;42710:37;;42727:1;42710:37;;;42740:6;42710:37;;;;;;:::i;:::-;;;;;;;;42760:48;42788:1;42792:7;42801:6;42760:19;:48::i;:::-;42268:548;;:::o;7894:117::-;7957:7;7984:19;7992:3;:10;;7984:7;:19::i;:::-;7977:26;;7894:117;;;:::o;8365:158::-;8439:7;8490:22;8494:3;:10;;8506:5;8490:3;:22::i;:::-;8482:31;;8459:56;;8365:158;;;;:::o;41141:840::-;41288:1;41272:18;;:4;:18;;;;41264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41365:1;41351:16;;:2;:16;;;;41343:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41420:38;41441:4;41447:2;41451:6;41420:20;:38::i;:::-;41471:19;41493:9;:15;41503:4;41493:15;;;;;;;;;;;;;;;;41471:37;;41542:6;41527:11;:21;;41519:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;41659:6;41645:11;:20;41627:9;:15;41637:4;41627:15;;;;;;;;;;;;;;;:38;;;;41862:6;41845:9;:13;41855:2;41845:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;41912:2;41897:26;;41906:4;41897:26;;;41916:6;41897:26;;;;;;:::i;:::-;;;;;;;;41936:37;41956:4;41962:2;41966:6;41936:19;:37::i;:::-;41253:728;41141:840;;;:::o;7641:167::-;7721:4;7745:55;7755:3;:10;;7791:5;7775:23;;7767:32;;7745:9;:55::i;:::-;7738:62;;7641:167;;;;:::o;63368:123::-;63429:7;63480:3;63466:10;;63457:6;:19;;;;:::i;:::-;63456:27;;;;:::i;:::-;63449:34;;63368:123;;;:::o;53606:492::-;53695:22;53703:4;53709:7;53695;:22::i;:::-;53690:401;;53883:28;53903:7;53883:19;:28::i;:::-;53984:38;54012:4;54004:13;;54019:2;53984:19;:38::i;:::-;53788:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53734:345;;;;;;;;;;;:::i;:::-;;;;;;;;53690:401;53606:492;;:::o;45986:125::-;;;;:::o;46715:124::-;;;;:::o;800:414::-;863:4;885:21;895:3;900:5;885:9;:21::i;:::-;880:327;;923:3;:11;;940:5;923:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1106:3;:11;;:18;;;;1084:3;:12;;:19;1097:5;1084:19;;;;;;;;;;;:40;;;;1146:4;1139:11;;;;880:327;1190:5;1183:12;;800:414;;;;;:::o;1390:1420::-;1456:4;1574:18;1595:3;:12;;:19;1608:5;1595:19;;;;;;;;;;;;1574:40;;1645:1;1631:10;:15;1627:1176;;2006:21;2043:1;2030:10;:14;;;;:::i;:::-;2006:38;;2059:17;2100:1;2079:3;:11;;:18;;;;:22;;;;:::i;:::-;2059:42;;2135:13;2122:9;:26;2118:405;;2169:17;2189:3;:11;;2201:9;2189:22;;;;;;;;:::i;:::-;;;;;;;;;;2169:42;;2343:9;2314:3;:11;;2326:13;2314:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;2454:10;2428:3;:12;;:23;2441:9;2428:23;;;;;;;;;;;:36;;;;2150:373;2118:405;2604:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2699:3;:12;;:19;2712:5;2699:19;;;;;;;;;;;2692:26;;;2742:4;2735:11;;;;;;;1627:1176;2786:5;2779:12;;;1390:1420;;;;;:::o;3111:109::-;3167:7;3194:3;:11;;:18;;;;3187:25;;3111:109;;;:::o;3574:120::-;3641:7;3668:3;:11;;3680:5;3668:18;;;;;;;;:::i;:::-;;;;;;;;;;3661:25;;3574:120;;;;:::o;2896:129::-;2969:4;3016:1;2993:3;:12;;:19;3006:5;2993:19;;;;;;;;;;;;:24;;2986:31;;2896:129;;;;:::o;32463:151::-;32521:13;32554:52;32582:4;32566:22;;30618:2;32554:52;;:11;:52::i;:::-;32547:59;;32463:151;;;:::o;31859:447::-;31934:13;31960:19;32005:1;31996:6;31992:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31982:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31960:47;;32018:15;:6;32025:1;32018:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32044;:6;32051:1;32044:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32075:9;32100:1;32091:6;32087:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32075:26;;32070:131;32107:1;32103;:5;32070:131;;;32142:8;32159:3;32151:5;:11;32142:21;;;;;;;:::i;:::-;;;;;32130:6;32137:1;32130:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;32188:1;32178:11;;;;;32110:3;;;;:::i;:::-;;;32070:131;;;;32228:1;32219:5;:10;32211:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32291:6;32277:21;;;31859:447;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:329::-;4310:6;4359:2;4347:9;4338:7;4334:23;4330:32;4327:119;;;4365:79;;:::i;:::-;4327:119;4485:1;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4456:117;4251:329;;;;:::o;4586:118::-;4673:24;4691:5;4673:24;:::i;:::-;4668:3;4661:37;4586:118;;:::o;4710:222::-;4803:4;4841:2;4830:9;4826:18;4818:26;;4854:71;4922:1;4911:9;4907:17;4898:6;4854:71;:::i;:::-;4710:222;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:77::-;5600:7;5629:5;5618:16;;5563:77;;;:::o;5646:122::-;5719:24;5737:5;5719:24;:::i;:::-;5712:5;5709:35;5699:63;;5758:1;5755;5748:12;5699:63;5646:122;:::o;5774:139::-;5820:5;5858:6;5845:20;5836:29;;5874:33;5901:5;5874:33;:::i;:::-;5774:139;;;;:::o;5919:329::-;5978:6;6027:2;6015:9;6006:7;6002:23;5998:32;5995:119;;;6033:79;;:::i;:::-;5995:119;6153:1;6178:53;6223:7;6214:6;6203:9;6199:22;6178:53;:::i;:::-;6168:63;;6124:117;5919:329;;;;:::o;6254:118::-;6341:24;6359:5;6341:24;:::i;:::-;6336:3;6329:37;6254:118;;:::o;6378:222::-;6471:4;6509:2;6498:9;6494:18;6486:26;;6522:71;6590:1;6579:9;6575:17;6566:6;6522:71;:::i;:::-;6378:222;;;;:::o;6606:474::-;6674:6;6682;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6984:2;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6955:118;6606:474;;;;;:::o;7086:86::-;7121:7;7161:4;7154:5;7150:16;7139:27;;7086:86;;;:::o;7178:112::-;7261:22;7277:5;7261:22;:::i;:::-;7256:3;7249:35;7178:112;;:::o;7296:214::-;7385:4;7423:2;7412:9;7408:18;7400:26;;7436:67;7500:1;7489:9;7485:17;7476:6;7436:67;:::i;:::-;7296:214;;;;:::o;7516:116::-;7586:21;7601:5;7586:21;:::i;:::-;7579:5;7576:32;7566:60;;7622:1;7619;7612:12;7566:60;7516:116;:::o;7638:133::-;7681:5;7719:6;7706:20;7697:29;;7735:30;7759:5;7735:30;:::i;:::-;7638:133;;;;:::o;7777:323::-;7833:6;7882:2;7870:9;7861:7;7857:23;7853:32;7850:119;;;7888:79;;:::i;:::-;7850:119;8008:1;8033:50;8075:7;8066:6;8055:9;8051:22;8033:50;:::i;:::-;8023:60;;7979:114;7777:323;;;;:::o;8106:117::-;8215:1;8212;8205:12;8229:180;8277:77;8274:1;8267:88;8374:4;8371:1;8364:15;8398:4;8395:1;8388:15;8415:281;8498:27;8520:4;8498:27;:::i;:::-;8490:6;8486:40;8628:6;8616:10;8613:22;8592:18;8580:10;8577:34;8574:62;8571:88;;;8639:18;;:::i;:::-;8571:88;8679:10;8675:2;8668:22;8458:238;8415:281;;:::o;8702:129::-;8736:6;8763:20;;:::i;:::-;8753:30;;8792:33;8820:4;8812:6;8792:33;:::i;:::-;8702:129;;;:::o;8837:311::-;8914:4;9004:18;8996:6;8993:30;8990:56;;;9026:18;;:::i;:::-;8990:56;9076:4;9068:6;9064:17;9056:25;;9136:4;9130;9126:15;9118:23;;8837:311;;;:::o;9154:117::-;9263:1;9260;9253:12;9294:710;9390:5;9415:81;9431:64;9488:6;9431:64;:::i;:::-;9415:81;:::i;:::-;9406:90;;9516:5;9545:6;9538:5;9531:21;9579:4;9572:5;9568:16;9561:23;;9632:4;9624:6;9620:17;9612:6;9608:30;9661:3;9653:6;9650:15;9647:122;;;9680:79;;:::i;:::-;9647:122;9795:6;9778:220;9812:6;9807:3;9804:15;9778:220;;;9887:3;9916:37;9949:3;9937:10;9916:37;:::i;:::-;9911:3;9904:50;9983:4;9978:3;9974:14;9967:21;;9854:144;9838:4;9833:3;9829:14;9822:21;;9778:220;;;9782:21;9396:608;;9294:710;;;;;:::o;10027:370::-;10098:5;10147:3;10140:4;10132:6;10128:17;10124:27;10114:122;;10155:79;;:::i;:::-;10114:122;10272:6;10259:20;10297:94;10387:3;10379:6;10372:4;10364:6;10360:17;10297:94;:::i;:::-;10288:103;;10104:293;10027:370;;;;:::o;10403:678::-;10493:6;10501;10550:2;10538:9;10529:7;10525:23;10521:32;10518:119;;;10556:79;;:::i;:::-;10518:119;10704:1;10693:9;10689:17;10676:31;10734:18;10726:6;10723:30;10720:117;;;10756:79;;:::i;:::-;10720:117;10861:78;10931:7;10922:6;10911:9;10907:22;10861:78;:::i;:::-;10851:88;;10647:302;10988:2;11014:50;11056:7;11047:6;11036:9;11032:22;11014:50;:::i;:::-;11004:60;;10959:115;10403:678;;;;;:::o;11087:474::-;11155:6;11163;11212:2;11200:9;11191:7;11187:23;11183:32;11180:119;;;11218:79;;:::i;:::-;11180:119;11338:1;11363:53;11408:7;11399:6;11388:9;11384:22;11363:53;:::i;:::-;11353:63;;11309:117;11465:2;11491:53;11536:7;11527:6;11516:9;11512:22;11491:53;:::i;:::-;11481:63;;11436:118;11087:474;;;;;:::o;11567:118::-;11654:24;11672:5;11654:24;:::i;:::-;11649:3;11642:37;11567:118;;:::o;11691:222::-;11784:4;11822:2;11811:9;11807:18;11799:26;;11835:71;11903:1;11892:9;11888:17;11879:6;11835:71;:::i;:::-;11691:222;;;;:::o;11919:114::-;11986:6;12020:5;12014:12;12004:22;;11919:114;;;:::o;12039:184::-;12138:11;12172:6;12167:3;12160:19;12212:4;12207:3;12203:14;12188:29;;12039:184;;;;:::o;12229:132::-;12296:4;12319:3;12311:11;;12349:4;12344:3;12340:14;12332:22;;12229:132;;;:::o;12367:108::-;12444:24;12462:5;12444:24;:::i;:::-;12439:3;12432:37;12367:108;;:::o;12481:179::-;12550:10;12571:46;12613:3;12605:6;12571:46;:::i;:::-;12649:4;12644:3;12640:14;12626:28;;12481:179;;;;:::o;12666:113::-;12736:4;12768;12763:3;12759:14;12751:22;;12666:113;;;:::o;12815:732::-;12934:3;12963:54;13011:5;12963:54;:::i;:::-;13033:86;13112:6;13107:3;13033:86;:::i;:::-;13026:93;;13143:56;13193:5;13143:56;:::i;:::-;13222:7;13253:1;13238:284;13263:6;13260:1;13257:13;13238:284;;;13339:6;13333:13;13366:63;13425:3;13410:13;13366:63;:::i;:::-;13359:70;;13452:60;13505:6;13452:60;:::i;:::-;13442:70;;13298:224;13285:1;13282;13278:9;13273:14;;13238:284;;;13242:14;13538:3;13531:10;;12939:608;;;12815:732;;;;:::o;13553:1157::-;13930:4;13968:3;13957:9;13953:19;13945:27;;14018:9;14012:4;14008:20;14004:1;13993:9;13989:17;13982:47;14046:108;14149:4;14140:6;14046:108;:::i;:::-;14038:116;;14201:9;14195:4;14191:20;14186:2;14175:9;14171:18;14164:48;14229:108;14332:4;14323:6;14229:108;:::i;:::-;14221:116;;14384:9;14378:4;14374:20;14369:2;14358:9;14354:18;14347:48;14412:108;14515:4;14506:6;14412:108;:::i;:::-;14404:116;;14567:9;14561:4;14557:20;14552:2;14541:9;14537:18;14530:48;14595:108;14698:4;14689:6;14595:108;:::i;:::-;14587:116;;13553:1157;;;;;;;:::o;14716:180::-;14764:77;14761:1;14754:88;14861:4;14858:1;14851:15;14885:4;14882:1;14875:15;14902:320;14946:6;14983:1;14977:4;14973:12;14963:22;;15030:1;15024:4;15020:12;15051:18;15041:81;;15107:4;15099:6;15095:17;15085:27;;15041:81;15169:2;15161:6;15158:14;15138:18;15135:38;15132:84;;;15188:18;;:::i;:::-;15132:84;14953:269;14902:320;;;:::o;15228:234::-;15368:34;15364:1;15356:6;15352:14;15345:58;15437:17;15432:2;15424:6;15420:15;15413:42;15228:234;:::o;15468:366::-;15610:3;15631:67;15695:2;15690:3;15631:67;:::i;:::-;15624:74;;15707:93;15796:3;15707:93;:::i;:::-;15825:2;15820:3;15816:12;15809:19;;15468:366;;;:::o;15840:419::-;16006:4;16044:2;16033:9;16029:18;16021:26;;16093:9;16087:4;16083:20;16079:1;16068:9;16064:17;16057:47;16121:131;16247:4;16121:131;:::i;:::-;16113:139;;15840:419;;;:::o;16265:180::-;16313:77;16310:1;16303:88;16410:4;16407:1;16400:15;16434:4;16431:1;16424:15;16451:305;16491:3;16510:20;16528:1;16510:20;:::i;:::-;16505:25;;16544:20;16562:1;16544:20;:::i;:::-;16539:25;;16698:1;16630:66;16626:74;16623:1;16620:81;16617:107;;;16704:18;;:::i;:::-;16617:107;16748:1;16745;16741:9;16734:16;;16451:305;;;;:::o;16762:172::-;16902:24;16898:1;16890:6;16886:14;16879:48;16762:172;:::o;16940:366::-;17082:3;17103:67;17167:2;17162:3;17103:67;:::i;:::-;17096:74;;17179:93;17268:3;17179:93;:::i;:::-;17297:2;17292:3;17288:12;17281:19;;16940:366;;;:::o;17312:419::-;17478:4;17516:2;17505:9;17501:18;17493:26;;17565:9;17559:4;17555:20;17551:1;17540:9;17536:17;17529:47;17593:131;17719:4;17593:131;:::i;:::-;17585:139;;17312:419;;;:::o;17737:173::-;17877:25;17873:1;17865:6;17861:14;17854:49;17737:173;:::o;17916:366::-;18058:3;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18155:93;18244:3;18155:93;:::i;:::-;18273:2;18268:3;18264:12;18257:19;;17916:366;;;:::o;18288:419::-;18454:4;18492:2;18481:9;18477:18;18469:26;;18541:9;18535:4;18531:20;18527:1;18516:9;18512:17;18505:47;18569:131;18695:4;18569:131;:::i;:::-;18561:139;;18288:419;;;:::o;18713:180::-;18761:77;18758:1;18751:88;18858:4;18855:1;18848:15;18882:4;18879:1;18872:15;18899:233;18938:3;18961:24;18979:5;18961:24;:::i;:::-;18952:33;;19007:66;19000:5;18997:77;18994:103;;;19077:18;;:::i;:::-;18994:103;19124:1;19117:5;19113:13;19106:20;;18899:233;;;:::o;19138:224::-;19278:34;19274:1;19266:6;19262:14;19255:58;19347:7;19342:2;19334:6;19330:15;19323:32;19138:224;:::o;19368:366::-;19510:3;19531:67;19595:2;19590:3;19531:67;:::i;:::-;19524:74;;19607:93;19696:3;19607:93;:::i;:::-;19725:2;19720:3;19716:12;19709:19;;19368:366;;;:::o;19740:419::-;19906:4;19944:2;19933:9;19929:18;19921:26;;19993:9;19987:4;19983:20;19979:1;19968:9;19964:17;19957:47;20021:131;20147:4;20021:131;:::i;:::-;20013:139;;19740:419;;;:::o;20165:176::-;20305:28;20301:1;20293:6;20289:14;20282:52;20165:176;:::o;20347:366::-;20489:3;20510:67;20574:2;20569:3;20510:67;:::i;:::-;20503:74;;20586:93;20675:3;20586:93;:::i;:::-;20704:2;20699:3;20695:12;20688:19;;20347:366;;;:::o;20719:419::-;20885:4;20923:2;20912:9;20908:18;20900:26;;20972:9;20966:4;20962:20;20958:1;20947:9;20943:17;20936:47;21000:131;21126:4;21000:131;:::i;:::-;20992:139;;20719:419;;;:::o;21144:223::-;21284:34;21280:1;21272:6;21268:14;21261:58;21353:6;21348:2;21340:6;21336:15;21329:31;21144:223;:::o;21373:366::-;21515:3;21536:67;21600:2;21595:3;21536:67;:::i;:::-;21529:74;;21612:93;21701:3;21612:93;:::i;:::-;21730:2;21725:3;21721:12;21714:19;;21373:366;;;:::o;21745:419::-;21911:4;21949:2;21938:9;21934:18;21926:26;;21998:9;21992:4;21988:20;21984:1;21973:9;21969:17;21962:47;22026:131;22152:4;22026:131;:::i;:::-;22018:139;;21745:419;;;:::o;22170:221::-;22310:34;22306:1;22298:6;22294:14;22287:58;22379:4;22374:2;22366:6;22362:15;22355:29;22170:221;:::o;22397:366::-;22539:3;22560:67;22624:2;22619:3;22560:67;:::i;:::-;22553:74;;22636:93;22725:3;22636:93;:::i;:::-;22754:2;22749:3;22745:12;22738:19;;22397:366;;;:::o;22769:419::-;22935:4;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22769:419;;;:::o;23194:179::-;23334:31;23330:1;23322:6;23318:14;23311:55;23194:179;:::o;23379:366::-;23521:3;23542:67;23606:2;23601:3;23542:67;:::i;:::-;23535:74;;23618:93;23707:3;23618:93;:::i;:::-;23736:2;23731:3;23727:12;23720:19;;23379:366;;;:::o;23751:419::-;23917:4;23955:2;23944:9;23940:18;23932:26;;24004:9;23998:4;23994:20;23990:1;23979:9;23975:17;23968:47;24032:131;24158:4;24032:131;:::i;:::-;24024:139;;23751:419;;;:::o;24176:172::-;24316:24;24312:1;24304:6;24300:14;24293:48;24176:172;:::o;24354:366::-;24496:3;24517:67;24581:2;24576:3;24517:67;:::i;:::-;24510:74;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24354:366;;;:::o;24726:419::-;24892:4;24930:2;24919:9;24915:18;24907:26;;24979:9;24973:4;24969:20;24965:1;24954:9;24950:17;24943:47;25007:131;25133:4;25007:131;:::i;:::-;24999:139;;24726:419;;;:::o;25151:191::-;25191:4;25211:20;25229:1;25211:20;:::i;:::-;25206:25;;25245:20;25263:1;25245:20;:::i;:::-;25240:25;;25284:1;25281;25278:8;25275:34;;;25289:18;;:::i;:::-;25275:34;25334:1;25331;25327:9;25319:17;;25151:191;;;;:::o;25348:775::-;25581:4;25619:3;25608:9;25604:19;25596:27;;25633:71;25701:1;25690:9;25686:17;25677:6;25633:71;:::i;:::-;25714:72;25782:2;25771:9;25767:18;25758:6;25714:72;:::i;:::-;25796;25864:2;25853:9;25849:18;25840:6;25796:72;:::i;:::-;25878;25946:2;25935:9;25931:18;25922:6;25878:72;:::i;:::-;25960:73;26028:3;26017:9;26013:19;26004:6;25960:73;:::i;:::-;26043;26111:3;26100:9;26096:19;26087:6;26043:73;:::i;:::-;25348:775;;;;;;;;;:::o;26129:220::-;26269:34;26265:1;26257:6;26253:14;26246:58;26338:3;26333:2;26325:6;26321:15;26314:28;26129:220;:::o;26355:366::-;26497:3;26518:67;26582:2;26577:3;26518:67;:::i;:::-;26511:74;;26594:93;26683:3;26594:93;:::i;:::-;26712:2;26707:3;26703:12;26696:19;;26355:366;;;:::o;26727:419::-;26893:4;26931:2;26920:9;26916:18;26908:26;;26980:9;26974:4;26970:20;26966:1;26955:9;26951:17;26944:47;27008:131;27134:4;27008:131;:::i;:::-;27000:139;;26727:419;;;:::o;27152:221::-;27292:34;27288:1;27280:6;27276:14;27269:58;27361:4;27356:2;27348:6;27344:15;27337:29;27152:221;:::o;27379:366::-;27521:3;27542:67;27606:2;27601:3;27542:67;:::i;:::-;27535:74;;27618:93;27707:3;27618:93;:::i;:::-;27736:2;27731:3;27727:12;27720:19;;27379:366;;;:::o;27751:419::-;27917:4;27955:2;27944:9;27940:18;27932:26;;28004:9;27998:4;27994:20;27990:1;27979:9;27975:17;27968:47;28032:131;28158:4;28032:131;:::i;:::-;28024:139;;27751:419;;;:::o;28176:181::-;28316:33;28312:1;28304:6;28300:14;28293:57;28176:181;:::o;28363:366::-;28505:3;28526:67;28590:2;28585:3;28526:67;:::i;:::-;28519:74;;28602:93;28691:3;28602:93;:::i;:::-;28720:2;28715:3;28711:12;28704:19;;28363:366;;;:::o;28735:419::-;28901:4;28939:2;28928:9;28924:18;28916:26;;28988:9;28982:4;28978:20;28974:1;28963:9;28959:17;28952:47;29016:131;29142:4;29016:131;:::i;:::-;29008:139;;28735:419;;;:::o;29160:224::-;29300:34;29296:1;29288:6;29284:14;29277:58;29369:7;29364:2;29356:6;29352:15;29345:32;29160:224;:::o;29390:366::-;29532:3;29553:67;29617:2;29612:3;29553:67;:::i;:::-;29546:74;;29629:93;29718:3;29629:93;:::i;:::-;29747:2;29742:3;29738:12;29731:19;;29390:366;;;:::o;29762:419::-;29928:4;29966:2;29955:9;29951:18;29943:26;;30015:9;30009:4;30005:20;30001:1;29990:9;29986:17;29979:47;30043:131;30169:4;30043:131;:::i;:::-;30035:139;;29762:419;;;:::o;30187:222::-;30327:34;30323:1;30315:6;30311:14;30304:58;30396:5;30391:2;30383:6;30379:15;30372:30;30187:222;:::o;30415:366::-;30557:3;30578:67;30642:2;30637:3;30578:67;:::i;:::-;30571:74;;30654:93;30743:3;30654:93;:::i;:::-;30772:2;30767:3;30763:12;30756:19;;30415:366;;;:::o;30787:419::-;30953:4;30991:2;30980:9;30976:18;30968:26;;31040:9;31034:4;31030:20;31026:1;31015:9;31011:17;31004:47;31068:131;31194:4;31068:131;:::i;:::-;31060:139;;30787:419;;;:::o;31212:225::-;31352:34;31348:1;31340:6;31336:14;31329:58;31421:8;31416:2;31408:6;31404:15;31397:33;31212:225;:::o;31443:366::-;31585:3;31606:67;31670:2;31665:3;31606:67;:::i;:::-;31599:74;;31682:93;31771:3;31682:93;:::i;:::-;31800:2;31795:3;31791:12;31784:19;;31443:366;;;:::o;31815:419::-;31981:4;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31815:419;;;:::o;32240:348::-;32280:7;32303:20;32321:1;32303:20;:::i;:::-;32298:25;;32337:20;32355:1;32337:20;:::i;:::-;32332:25;;32525:1;32457:66;32453:74;32450:1;32447:81;32442:1;32435:9;32428:17;32424:105;32421:131;;;32532:18;;:::i;:::-;32421:131;32580:1;32577;32573:9;32562:20;;32240:348;;;;:::o;32594:180::-;32642:77;32639:1;32632:88;32739:4;32736:1;32729:15;32763:4;32760:1;32753:15;32780:185;32820:1;32837:20;32855:1;32837:20;:::i;:::-;32832:25;;32871:20;32889:1;32871:20;:::i;:::-;32866:25;;32910:1;32900:35;;32915:18;;:::i;:::-;32900:35;32957:1;32954;32950:9;32945:14;;32780:185;;;;:::o;32971:148::-;33073:11;33110:3;33095:18;;32971:148;;;;:::o;33125:173::-;33265:25;33261:1;33253:6;33249:14;33242:49;33125:173;:::o;33304:402::-;33464:3;33485:85;33567:2;33562:3;33485:85;:::i;:::-;33478:92;;33579:93;33668:3;33579:93;:::i;:::-;33697:2;33692:3;33688:12;33681:19;;33304:402;;;:::o;33712:377::-;33818:3;33846:39;33879:5;33846:39;:::i;:::-;33901:89;33983:6;33978:3;33901:89;:::i;:::-;33894:96;;33999:52;34044:6;34039:3;34032:4;34025:5;34021:16;33999:52;:::i;:::-;34076:6;34071:3;34067:16;34060:23;;33822:267;33712:377;;;;:::o;34095:167::-;34235:19;34231:1;34223:6;34219:14;34212:43;34095:167;:::o;34268:402::-;34428:3;34449:85;34531:2;34526:3;34449:85;:::i;:::-;34442:92;;34543:93;34632:3;34543:93;:::i;:::-;34661:2;34656:3;34652:12;34645:19;;34268:402;;;:::o;34676:967::-;35058:3;35080:148;35224:3;35080:148;:::i;:::-;35073:155;;35245:95;35336:3;35327:6;35245:95;:::i;:::-;35238:102;;35357:148;35501:3;35357:148;:::i;:::-;35350:155;;35522:95;35613:3;35604:6;35522:95;:::i;:::-;35515:102;;35634:3;35627:10;;34676:967;;;;;:::o;35649:180::-;35697:77;35694:1;35687:88;35794:4;35791:1;35784:15;35818:4;35815:1;35808:15;35835:171;35874:3;35897:24;35915:5;35897:24;:::i;:::-;35888:33;;35943:4;35936:5;35933:15;35930:41;;;35951:18;;:::i;:::-;35930:41;35998:1;35991:5;35987:13;35980:20;;35835:171;;;:::o;36012:182::-;36152:34;36148:1;36140:6;36136:14;36129:58;36012:182;:::o;36200:366::-;36342:3;36363:67;36427:2;36422:3;36363:67;:::i;:::-;36356:74;;36439:93;36528:3;36439:93;:::i;:::-;36557:2;36552:3;36548:12;36541:19;;36200:366;;;:::o;36572:419::-;36738:4;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36572:419;;;:::o
Swarm Source
ipfs://3372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a58
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.