Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
TokenTracker
Multichain Info
N/A
Latest 25 from a total of 16,398 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Whitelist | 7674401 | 9 hrs ago | IN | 0 ETH | 0.00007348 | ||||
Set Whitelist | 7674383 | 9 hrs ago | IN | 0 ETH | 0.00009141 | ||||
Set Whitelist | 7674381 | 9 hrs ago | IN | 0 ETH | 0.00009765 | ||||
Set Whitelist | 7674380 | 9 hrs ago | IN | 0 ETH | 0.00008764 | ||||
Set Whitelist | 7674378 | 9 hrs ago | IN | 0 ETH | 0.00009756 | ||||
Set Whitelist | 7674299 | 9 hrs ago | IN | 0 ETH | 0.00012788 | ||||
Set Whitelist | 7674295 | 9 hrs ago | IN | 0 ETH | 0.00014308 | ||||
Set Whitelist | 7674292 | 9 hrs ago | IN | 0 ETH | 0.00015369 | ||||
Set Whitelist | 7674289 | 9 hrs ago | IN | 0 ETH | 0.00014989 | ||||
Set Whitelist | 7674286 | 9 hrs ago | IN | 0 ETH | 0.00014505 | ||||
Set Whitelist | 7674110 | 10 hrs ago | IN | 0 ETH | 0.00013913 | ||||
Set Whitelist | 7673794 | 11 hrs ago | IN | 0 ETH | 0.00052569 | ||||
Set Whitelist | 7673776 | 11 hrs ago | IN | 0 ETH | 0.00062793 | ||||
Set Whitelist | 7673774 | 11 hrs ago | IN | 0 ETH | 0.00063786 | ||||
Set Whitelist | 7673773 | 11 hrs ago | IN | 0 ETH | 0.0006388 | ||||
Set Whitelist | 7673772 | 11 hrs ago | IN | 0 ETH | 0.00061137 | ||||
Set Whitelist | 7673693 | 11 hrs ago | IN | 0 ETH | 0.00063335 | ||||
Set Whitelist | 7673689 | 11 hrs ago | IN | 0 ETH | 0.00066343 | ||||
Set Whitelist | 7673686 | 11 hrs ago | IN | 0 ETH | 0.00065182 | ||||
Set Whitelist | 7673683 | 11 hrs ago | IN | 0 ETH | 0.00069917 | ||||
Set Whitelist | 7673679 | 11 hrs ago | IN | 0 ETH | 0.00069959 | ||||
Set Whitelist | 7673501 | 12 hrs ago | IN | 0 ETH | 0.0004544 | ||||
Set Whitelist | 7673040 | 13 hrs ago | IN | 0 ETH | 0.00087687 | ||||
Set Whitelist | 7673022 | 13 hrs ago | IN | 0 ETH | 0.00093036 | ||||
Set Whitelist | 7673021 | 13 hrs ago | IN | 0 ETH | 0.00085433 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
InxToken
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-13 */ // 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/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/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/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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.9.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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ 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: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/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/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.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]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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}. * * 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 default value returned by this function, unless * it's 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: contracts/ERC1404/IERC1404Validators.sol pragma solidity 0.8.20; /** * @title IERC1404Validators * @dev Interfaces implemented by the token contract to be called by the TransferRestrictions contract */ interface IERC1404Validators { /// @notice Returns a boolean indicating the paused state of the contract /// @return true if contract is paused, false if unpaused function paused() external view returns (bool); /// @notice Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted /// @param from The address sending tokens /// @param to The address receiving tokens /// @return true if both accounts are whitelisted, false if not function checkWhitelists(address from, address to) external view returns (bool); /// @notice Determine if spender, sender and receiver are whitelisted, return true if all accounts are whitelisted /// @param spender The address performing the transfer /// @param from The address sending tokens /// @param to The address receiving tokens /// @return true if both accounts are whitelisted, false if not function checkWhitelists(address spender, address from, address to) external view returns (bool); /// @notice Determine if a users tokens are locked preventing a transfer /// @param _address the address to retrieve the data from /// @param amount the amount to send /// @return true if user has sufficient unlocked token to transfer the requested amount, false if not function checkTimelock(address _address, uint256 amount) external view returns (bool); } // File: contracts/ERC1404/IERC1404.sol pragma solidity 0.8.20; interface IERC1404 { /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code /// @param from Sending address /// @param to Receiving address /// @param value Amount of tokens being transferred /// @return Code by which to reference message for rejection reasoning /// @dev Overwrite with your custom transfer restriction logic function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8); /// @notice Detects if a transferFrom will be reverted and if so returns an appropriate reference code /// @param spender Transaction sending address /// @param from Source of funds address /// @param to Receiving address /// @param value Amount of tokens being transferred /// @return Code by which to reference message for rejection reasoning /// @dev Overwrite with your custom transfer restriction logic function detectTransferFromRestriction (address spender, address from, address to, uint256 value) external view returns (uint8); /// @notice Returns a human-readable message for a given restriction code /// @param restrictionCode Identifier for looking up a message /// @return Text showing the restriction's reasoning /// @dev Overwrite with your custom message and restrictionCode handling function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory); } interface IERC1404getSuccessCode { /// @notice Return the uint256 that represents the SUCCESS_CODE /// @return uint8 SUCCESS_CODE function getSuccessCode () external view returns (uint8); } /** * @title IERC1404Success * @dev Combines IERC1404 and IERC1404getSuccessCode interfaces, to be implemented by the TransferRestrictions contract */ interface IERC1404Success is IERC1404getSuccessCode, IERC1404 { } // File: contracts/InxToken.sol pragma solidity 0.8.20; /** * @title InxToken * @notice Extended ERC20 contract with additional functionality: * 1. Access Control * 2. Contract pausability * 3. Whitelisting * 4. Token timelocking * 5. Token minting * 6. Token burning * 7. Token revoking * 8. Transfer restrictions * @dev Inherits from OpenZeppelin contracts: ERC20, AccessControl, Pausable. * @dev Implements ERC1404 for transfer restrictions */ contract InxToken is ERC20, AccessControl, Pausable, IERC1404, IERC1404Validators { // Tracks whether an address is whitelisted // data field can track any external field (like a hash of personal details) struct WhiteListItem { bool status; string data; } // Tracks the amount and release time of locked tokens for an address struct LockupItem { uint256 amount; uint256 releaseTime; } // Token Details string constant TOKEN_NAME = "INX Token"; string constant TOKEN_SYMBOL = "INX"; /// @dev Determines whether minting was allowed at construction bool public immutable MINT_ALLOWED; /// @dev Determines whether burning was allowed at construction bool public immutable BURN_ALLOWED; /// @dev The only address where tokens can be burned from address public burnAddress; // Role identifiers for AccessControl // bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; // inherited from AccessControl bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); bytes32 public constant REVOKER_ROLE = keccak256("REVOKER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant WHITELISTER_ROLE = keccak256("WHITELISTER_ROLE"); bytes32 public constant TIMELOCKER_ROLE = keccak256("TIMELOCKER_ROLE"); /// @dev Whitelisting info per address mapping (address => WhiteListItem) public whitelists; /// @dev Timelocking info per address mapping (address => LockupItem) public lockups; // tracks the external contract where restriction logic is defined IERC1404Success private _transferRestrictions; /// Minting was not allowed at construction error MintingNotAllowed(); /// Burning was not allowed at construction error BurningNotAllowed(); /// Burn address is not set error BurnAddressNotSet(); /// Address zero is not allowed for this operation error AddressZeroNotAllowed(); /// Release time must be in the future error ReleaseTimeMustBeInFuture(); /// Amount must be greater than zero error AmountMustBeGreaterThanZero(); /// Transfer restrictions contract must be set error TransferRestrictionsContractMustBeSet(); /// Not enough unlocked tokens to revoke error InsufficientUnlockedBalance(); /// @dev Modifier to make a function callable only when a transfer is not restricted modifier notRestricted(address from, address to, uint256 value) { IERC1404Success _transferRestrictions_ = _transferRestrictions; if (address(_transferRestrictions_) == address(0)) revert TransferRestrictionsContractMustBeSet(); uint8 restrictionCode = _transferRestrictions_.detectTransferRestriction(from, to, value); require(restrictionCode == _transferRestrictions_.getSuccessCode(), _transferRestrictions_.messageForTransferRestriction(restrictionCode)); _; } /// @dev Modifier to make a function callable only when a transferFrom is not restricted modifier notRestrictedTransferFrom(address spender, address from, address to, uint256 value) { IERC1404Success _transferRestrictions_ = _transferRestrictions; if (address(_transferRestrictions_) == address(0)) revert TransferRestrictionsContractMustBeSet(); uint8 restrictionCode = _transferRestrictions_.detectTransferFromRestriction(spender, from, to, value); require(restrictionCode == _transferRestrictions_.getSuccessCode(), _transferRestrictions_.messageForTransferRestriction(restrictionCode)); _; } /// @dev Event for logging timelocking of tokens for an address event AccountLock(address address_, uint256 amount, uint256 releaseTime); /// @dev Event for logging the release of locked tokens for an address event AccountRelease(address address_, uint256 amountReleased); /// @dev Event for logging the updating of the transfer restrictions contract event RestrictionsUpdated(address newRestrictionsAddress, address updatedBy); /// @dev Event for logging the revoking of tokens from an address event Revoke(address indexed revoker, address indexed from, uint256 amount); /// @dev Event for logging the updating of a whitelist entry event WhitelistUpdate(address address_, bool status, string data); /// @dev Event for logging the updating of the burn address event burnAddressUpdated(address newBurnAddress, address updatedBy); /** * @dev The constructor sets up the basic properties of the token such as its name and symbol. It also assigns the * entire initial supply to the owner specified in the parameters. The owner is also set as the administrator with * all roles. The mint and burn allowance are set as per the parameters. * @param owner The address that will receive the initial supply of tokens, and be granted the default admin role * @param isMintAllowed Permission flag for token minting * @param isBurnAllowed Permission flag for token burning * @param initialSupply The amount of tokens to mint */ constructor(address owner, bool isMintAllowed, bool isBurnAllowed, uint256 initialSupply) ERC20(TOKEN_NAME, TOKEN_SYMBOL) { MINT_ALLOWED = isMintAllowed; BURN_ALLOWED = isBurnAllowed; _mint(owner, initialSupply); _grantRole(DEFAULT_ADMIN_ROLE, owner); // set up the owner as the default admin of all roles grantRole(DEFAULT_ADMIN_ROLE, owner); // grant the owner all roles } /** * @dev Overrides the default AccessControl implementation to add whitelisting and granting of all roles to owners * of DEFAULT_ADMIN_ROLE */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { if (role == DEFAULT_ADMIN_ROLE) { _grantRole(MINTER_ROLE, account); _grantRole(BURNER_ROLE, account); _grantRole(REVOKER_ROLE, account); _grantRole(PAUSER_ROLE, account); _grantRole(WHITELISTER_ROLE, account); _grantRole(TIMELOCKER_ROLE, account); setWhitelist(account, true, "default admin"); } _grantRole(role, account); } /** * @dev Overrides the default AccessControl implementation to add unwhitelisting and revoking of all roles to * owners of DEFAULT_ADMIN_ROLE */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { if (role == DEFAULT_ADMIN_ROLE) { _revokeRole(MINTER_ROLE, account); _revokeRole(BURNER_ROLE, account); _revokeRole(REVOKER_ROLE, account); _revokeRole(PAUSER_ROLE, account); _revokeRole(WHITELISTER_ROLE, account); _revokeRole(TIMELOCKER_ROLE, account); setWhitelist(account, false, "default admin revoked"); } _revokeRole(role, account); } /** * @notice Mints tokens to a specified address, only callable by a minter * @param to The address to mint tokens to * @param amount The amount of tokens to mint */ function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { if(!MINT_ALLOWED) revert MintingNotAllowed(); _mint(to, amount); } /** * @notice Sets the burn address, which is the only address that tokens can be burnt from. Only callable by an admin * @param newBurnAddress The new burn address */ function setBurnAddress(address newBurnAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { burnAddress = newBurnAddress; emit burnAddressUpdated(newBurnAddress, msg.sender); } /** * @notice Burns tokens from the burn address. Only callable by a burner * @param amount The amount of tokens to burn */ function burn(uint256 amount) external onlyRole(BURNER_ROLE) { if (!BURN_ALLOWED) revert BurningNotAllowed(); _burn(burnAddress, amount); } /** * @notice Revokes tokens from an address and transfers them to the burn address. Only callable by a revoker * @param from The address to revoke tokens from * @param amount The amount of tokens to revoke */ function revoke(address from, uint256 amount) external onlyRole(REVOKER_ROLE) { if (!checkTimelock(from, amount)) revert InsufficientUnlockedBalance(); ERC20._transfer(from, burnAddress, amount); emit Revoke(msg.sender, from, amount); } /** * @notice Pauses all token transfers. Only callable by a pauser */ function pause() external onlyRole(PAUSER_ROLE) { _pause(); } /** * @notice Unpauses all token transfers. Only callable by a pauser */ function unpause() external onlyRole(PAUSER_ROLE) { _unpause(); } /** * @notice Set the whitelist status of an address. Only callable by a whitelister * @param address_ The address to set the whitelist status for * @param status The status to set the whitelist to * @param data A string with data about the whitelisted address */ function setWhitelist(address address_, bool status, string memory data) public onlyRole(WHITELISTER_ROLE) { if (address_ == address(0)) revert AddressZeroNotAllowed(); whitelists[address_] = WhiteListItem(status, data); emit WhitelistUpdate(address_, status, data); } /** * @notice Get the whitelist status of an address * @param address_ The address to check the whitelist status for * @return True if the address is whitelisted, false if not */ function getWhitelistStatus(address address_) external view returns(bool){ return whitelists[address_].status; } /** * @notice Get the whitelist data of an address * @param address_ The address to check the whitelist data for * @return The whitelist data string for the address */ function getWhitelistData(address address_) external view returns(string memory){ return whitelists[address_].data; } /** * @notice Determine if sender and receiver are both whitelisted * @param from The address sending tokens * @param to The address receiving tokens * @return True if both addresses are whitelisted, false if not */ function checkWhitelists(address from, address to) external view returns (bool) { return whitelists[from].status && whitelists[to].status; } /** * @notice Determine if spender, sender and receiver are all whitelisted * @param spender The address performing the transfer * @param from The address sending tokens * @param to The address receiving tokens * @return True if all addresses are whitelisted, false if not */ function checkWhitelists(address spender, address from, address to) external view returns (bool) { return whitelists[from].status && whitelists[to].status && whitelists[spender].status; } /** * @notice Lock tokens for a given address until a given time in the future. Only callable by a timelocker * @param address_ The address to lock tokens for * @param amount The amount of tokens to lock. If this is greater than the balance, the entire balance will be * locked * @param releaseTime The time in the future when the tokens will be released, in seconds since the epoch */ function lock(address address_, uint256 amount, uint256 releaseTime) public onlyRole(TIMELOCKER_ROLE) { if (releaseTime <= block.timestamp) revert ReleaseTimeMustBeInFuture(); if (address_ == address(0)) revert AddressZeroNotAllowed(); if (amount == 0) revert AmountMustBeGreaterThanZero(); // if the amount is greater than the balance, lock the entire balance uint256 balance = ERC20.balanceOf(address_); amount = amount <= balance ? amount : balance; lockups[address_] = LockupItem(amount, releaseTime); emit AccountLock(address_, amount, releaseTime); } /** * @notice Release tokens for a given address. Only callable by a timelocker * @param address_ The address to release tokens for * @param amountToRelease The amount of tokens to release. If this is greater than the locked amount, the entire * locked amount will be released */ function release(address address_, uint256 amountToRelease) external onlyRole(TIMELOCKER_ROLE) { if (address_ == address(0)) revert AddressZeroNotAllowed(); uint256 lockedAmount = lockups[address_].amount; // nothing to release if(lockedAmount == 0 || amountToRelease == 0) { emit AccountRelease(address_, 0); return; } uint256 newLockedAmount; // if the amount to release is greater than the locked amount, release the entire locked amount unchecked { // lockedAmount - amountToRelease only in case lockedAmount > amountToRelease newLockedAmount = lockedAmount <= amountToRelease ? 0 : lockedAmount - amountToRelease; } // Update the lockup details (in case all was released, amount will be 0 and hence no lockup) lockups[address_].amount = newLockedAmount; unchecked { // newLockedAmount is either 0 or less than lockedAmount emit AccountRelease(address_, lockedAmount - newLockedAmount); } } /** * @notice Determine if a user has sufficient unlocked tokens to transfer the requested amount * @dev This function is used by the transfer and transferFrom functions to determine if the transfer should be * allowed. It does not check if the user has sufficient tokens to transfer, only if they have sufficient unlocked * tokens. If the user does not have sufficient unlocked tokens, this function will return true but the transfer * will fail due to low balance. * @param address_ The address to check the timelock for * @param amount The amount to check if can be transferred * @return True if the user has sufficient unlocked tokens to transfer the requested amount, false if not */ function checkTimelock(address address_, uint256 amount) public view returns (bool) { // get the address' token balance uint256 balance = balanceOf(address_); // if the user does not have enough tokens to send regardless of lock return true here // the failure will still fail but this should make it explicit that the transfer failure is not // due to locked tokens but because of too low token balance if (balance < amount) return true; // copy lockup data into memory LockupItem memory lockupItem = lockups[address_]; // return true if the lock is expired if (block.timestamp > lockupItem.releaseTime) return true; // get the user's token balance that is not locked uint256 nonLockedAmount = balance - lockupItem.amount; // return true if the user has enough unlocked tokens to send the requested amount, false if not return amount <= nonLockedAmount; } /** * @notice Retrieve the timelock info for a given address * @param address_ The address to retrieve the lockup info for * @return The release time and amount of tokens locked */ function getLockUpInfo(address address_) external view returns(uint256, uint256) { // copy lockup data into memory LockupItem memory lockupItem = lockups[address_]; return (lockupItem.releaseTime, lockupItem.amount); } /** * @notice Update the transfer restriction contract. Only callable by an admin * @param newRestrictionsAddress The new transfer restriction contract address */ function updateTransferRestrictions(address newRestrictionsAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { _transferRestrictions = IERC1404Success(newRestrictionsAddress); emit RestrictionsUpdated(newRestrictionsAddress, msg.sender); } /** * @notice Return the address of the transfer restrictions contract * @return The address of the transfer restrictions contract */ function getRestrictionsAddress() external view returns (address) { return address(_transferRestrictions); } /** * @notice Returns the transfer restriction code for a transfer with the given parameters. * If the function returns SUCCESS_CODE (0) then it should be allowed, otherwise it should be blocked. * @param from The address sending tokens * @param to The address receiving tokens * @param amount The amount of tokens to transfer * @return The restriction code, where 0 means success */ function detectTransferRestriction(address from, address to, uint256 amount) external view returns (uint8) { // call detectTransferRestriction on the current transferRestrictions contract return _transferRestrictions.detectTransferRestriction(from, to, amount); } /** * @notice Returns the transfer restriction code for a transferFrom with the given parameters. * If the function returns SUCCESS_CODE (0) then it should be allowed. * @param spender The address initiating the transfer * @param from The address sending tokens * @param to The address receiving tokens * @param amount The amount of tokens to transfer * @return The restriction code, where 0 means success */ function detectTransferFromRestriction(address spender, address from, address to, uint256 amount) external view returns (uint8) { // call detectTransferFromRestriction on the current transferRestrictions contract return _transferRestrictions.detectTransferFromRestriction(spender, from, to, amount); } /** * @notice Provides a human readable string for a transfer restriction code * @param restrictionCode The restriction code * @return The corresponding human readable string */ function messageForTransferRestriction(uint8 restrictionCode) external view returns (string memory) { // call messageForTransferRestriction on the current transferRestrictions contract return _transferRestrictions.messageForTransferRestriction(restrictionCode); } /** * @notice Overrides the parent class token transfer function to enforce transfer restrictions. See {ERC20-transfer} * @param to The address to transfer tokens to * @param value The amount of tokens to transfer * @return success A boolean indicating whether the operation was successful */ function transfer(address to, uint256 value) override public notRestricted(msg.sender, to, value) returns (bool success) { success = ERC20.transfer(to, value); } /** * @notice Overrides the parent class token transferFrom function to enforce transfer restrictions. * See {ERC20-transferFrom} * @param from The address to transfer tokens from * @param to The address to transfer tokens to * @param value The amount of tokens to transfer * @return success A boolean indicating whether the operation was successful */ function transferFrom(address from, address to, uint256 value) override public notRestrictedTransferFrom(msg.sender, from, to, value) returns (bool success) { success = ERC20.transferFrom(from, to, value); } /** * @notice Indicates whether all transfers are paused. See {Pausable-paused} * @return True if transfers are paused, false otherwise */ function paused() public view override(Pausable, IERC1404Validators) returns (bool) { return Pausable.paused(); } /** * @notice Returns the number of decimals used for the token. See {ERC20-decimals} * @return The number of decimals used for the token */ function decimals() public view override(ERC20) returns (uint8) { return ERC20.decimals(); } }
[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isMintAllowed","type":"bool"},{"internalType":"bool","name":"isBurnAllowed","type":"bool"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressZeroNotAllowed","type":"error"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"BurnAddressNotSet","type":"error"},{"inputs":[],"name":"BurningNotAllowed","type":"error"},{"inputs":[],"name":"InsufficientUnlockedBalance","type":"error"},{"inputs":[],"name":"MintingNotAllowed","type":"error"},{"inputs":[],"name":"ReleaseTimeMustBeInFuture","type":"error"},{"inputs":[],"name":"TransferRestrictionsContractMustBeSet","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"address_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"AccountLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"address_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountReleased","type":"uint256"}],"name":"AccountRelease","type":"event"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRestrictionsAddress","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"RestrictionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"revoker","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Revoke","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"address_","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"WhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBurnAddress","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"burnAddressUpdated","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ALLOWED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_ALLOWED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVOKER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCKER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELISTER_ROLE","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"checkTimelock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"detectTransferFromRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getLockUpInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRestrictionsAddress","outputs":[{"internalType":"address","name":"","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":"address","name":"address_","type":"address"}],"name":"getWhitelistData","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address_","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockups","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"amountToRelease","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"revoke","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":"newBurnAddress","type":"address"}],"name":"setBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bool","name":"status","type":"bool"},{"internalType":"string","name":"data","type":"string"}],"name":"setWhitelist","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRestrictionsAddress","type":"address"}],"name":"updateTransferRestrictions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"string","name":"data","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801562000010575f80fd5b5060405162005f6838038062005f68833981810160405281019062000036919062000b65565b6040518060400160405280600981526020017f494e5820546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f494e5800000000000000000000000000000000000000000000000000000000008152508160039081620000b3919062000e2f565b508060049081620000c5919062000e2f565b5050505f60065f6101000a81548160ff02191690831515021790555082151560808115158152505081151560a0811515815250506200010b84826200013d60201b60201c565b6200011f5f801b85620002a260201b60201c565b620001335f801b856200038e60201b60201c565b5050505062001352565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a59062000f71565b60405180910390fd5b620001c15f83836200054760201b60201c565b8060025f828254620001d4919062000fbe565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000283919062001009565b60405180910390a36200029e5f83836200054c60201b60201c565b5050565b620002b482826200055160201b60201c565b6200038a57600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200032f620005b560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6200039f82620005bc60201b60201c565b620003b081620005d960201b60201c565b5f801b83036200053057620003ec7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a683620002a260201b60201c565b6200041e7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84883620002a260201b60201c565b620004507fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3083620002a260201b60201c565b620004827f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83620002a260201b60201c565b620004b47f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a83620002a260201b60201c565b620004e67f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2083620002a260201b60201c565b6200052f8260016040518060400160405280600d81526020017f64656661756c742061646d696e00000000000000000000000000000000000000815250620005fd60201b60201c565b5b620005428383620002a260201b60201c565b505050565b505050565b505050565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f60055f8381526020019081526020015f20600101549050919050565b620005fa81620005ee620005b560201b60201c565b6200076460201b60201c565b50565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a6200062f81620005d960201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000695576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528084151581526020018381525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010190816200071d919062000e2f565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd58484846040516200075693929190620010c0565b60405180910390a150505050565b6200077682826200055160201b60201c565b62000801576200078c816200080560201b60201c565b620007a1835f1c60206200083a60201b60201c565b604051602001620007b4929190620011de565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f891906200121f565b60405180910390fd5b5050565b6060620008338273ffffffffffffffffffffffffffffffffffffffff16601460ff166200083a60201b60201c565b9050919050565b60605f60028360026200084e919062001241565b6200085a919062000fbe565b67ffffffffffffffff81111562000876576200087562000bde565b5b6040519080825280601f01601f191660200182016040528015620008a95781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110620008e357620008e26200128b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106200094957620009486200128b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600184600262000989919062001241565b62000995919062000fbe565b90505b600181111562000a3e577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110620009db57620009da6200128b565b5b1a60f81b828281518110620009f557620009f46200128b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c94508062000a3690620012b8565b905062000998565b505f841462000a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a7b9062001332565b60405180910390fd5b8091505092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000abd8262000a92565b9050919050565b62000acf8162000ab1565b811462000ada575f80fd5b50565b5f8151905062000aed8162000ac4565b92915050565b5f8115159050919050565b62000b098162000af3565b811462000b14575f80fd5b50565b5f8151905062000b278162000afe565b92915050565b5f819050919050565b62000b418162000b2d565b811462000b4c575f80fd5b50565b5f8151905062000b5f8162000b36565b92915050565b5f805f806080858703121562000b805762000b7f62000a8e565b5b5f62000b8f8782880162000add565b945050602062000ba28782880162000b17565b935050604062000bb58782880162000b17565b925050606062000bc88782880162000b4f565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000c5057607f821691505b60208210810362000c665762000c6562000c0b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000cca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c8d565b62000cd6868362000c8d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000d1762000d1162000d0b8462000b2d565b62000cee565b62000b2d565b9050919050565b5f819050919050565b62000d328362000cf7565b62000d4a62000d418262000d1e565b84845462000c99565b825550505050565b5f90565b62000d6062000d52565b62000d6d81848462000d27565b505050565b5b8181101562000d945762000d885f8262000d56565b60018101905062000d73565b5050565b601f82111562000de35762000dad8162000c6c565b62000db88462000c7e565b8101602085101562000dc8578190505b62000de062000dd78562000c7e565b83018262000d72565b50505b505050565b5f82821c905092915050565b5f62000e055f198460080262000de8565b1980831691505092915050565b5f62000e1f838362000df4565b9150826002028217905092915050565b62000e3a8262000bd4565b67ffffffffffffffff81111562000e565762000e5562000bde565b5b62000e62825462000c38565b62000e6f82828562000d98565b5f60209050601f83116001811462000ea5575f841562000e90578287015190505b62000e9c858262000e12565b86555062000f0b565b601f19841662000eb58662000c6c565b5f5b8281101562000ede5784890151825560018201915060208501945060208101905062000eb7565b8683101562000efe578489015162000efa601f89168262000df4565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000f59601f8362000f13565b915062000f668262000f23565b602082019050919050565b5f6020820190508181035f83015262000f8a8162000f4b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000fca8262000b2d565b915062000fd78362000b2d565b925082820190508082111562000ff25762000ff162000f91565b5b92915050565b620010038162000b2d565b82525050565b5f6020820190506200101e5f83018462000ff8565b92915050565b6200102f8162000ab1565b82525050565b620010408162000af3565b82525050565b5f5b838110156200106557808201518184015260208101905062001048565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6200108c8262000bd4565b62001098818562000f13565b9350620010aa81856020860162001046565b620010b58162001070565b840191505092915050565b5f606082019050620010d55f83018662001024565b620010e4602083018562001035565b8181036040830152620010f8818462001080565b9050949350505050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f6200114260178362001102565b91506200114f826200110c565b601782019050919050565b5f620011668262000bd4565b62001172818562001102565b93506200118481856020860162001046565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f620011c660118362001102565b9150620011d38262001190565b601182019050919050565b5f620011ea8262001134565b9150620011f882856200115a565b91506200120582620011b8565b91506200121382846200115a565b91508190509392505050565b5f6020820190508181035f83015262001239818462001080565b905092915050565b5f6200124d8262000b2d565b91506200125a8362000b2d565b92508282026200126a8162000b2d565b9150828204841483151762001284576200128362000f91565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f620012c48262000b2d565b91505f8203620012d957620012d862000f91565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f6200131a60208362000f13565b91506200132782620012e4565b602082019050919050565b5f6020820190508181035f8301526200134b816200130c565b9050919050565b60805160a051614be6620013825f395f8181610e67015261165b01525f81816115cb015261186a0152614be65ff3fe608060405234801561000f575f80fd5b50600436106102d4575f3560e01c80635c975abb11610180578063a457c2d7116100e7578063d9ba32fc116100a0578063e2ab691d1161007a578063e2ab691d1461096c578063e3066cf814610988578063e63ab1e9146109b9578063eac449d9146109d7576102d4565b8063d9ba32fc146108f0578063db0cc92a14610920578063dd62ed3e1461093c576102d4565b8063a457c2d7146107f5578063a9059cbb14610825578063c7b6d43214610855578063d4ce141514610886578063d5391393146108b6578063d547741f146108d4576102d4565b80637f4ab1dd116101395780637f4ab1dd1461071f5780638456cb591461074f57806391d148541461075957806395d89b411461078957806399da091d146107a7578063a217fddf146107d7576102d4565b80635c975abb1461064757806368aa9813146106655780636dc5d2481461069557806370a08231146106b357806370d5ae05146106e35780637c4acabf14610701576102d4565b806327ac19751161023f5780633f4ba83a116101f857806343f028d2116101d257806343f028d2146105bf5780634b0e7216146105ef5780635346508a1461060b578063570618e114610629576102d4565b80633f4ba83a1461057d57806340c10f191461058757806342966c68146105a3576102d4565b806327ac1975146104bd578063282c51f3146104d95780632f2ff15d146104f7578063313ce5671461051357806336568abe14610531578063395093511461054d576102d4565b8063098bed3111610291578063098bed31146103c05780630d8fbffe146103f057806318160ddd1461040e5780631e7be2101461042c57806323b872dd1461045d578063248a9ca31461048d576102d4565b806301ffc9a7146102d85780630357371d1461030857806305557bd41461032457806306fdde03146103425780630754cede14610360578063095ea7b314610390575b5f80fd5b6102f260048036038101906102ed91906135b8565b6109f3565b6040516102ff91906135fd565b60405180910390f35b610322600480360381019061031d91906136a3565b610a6c565b005b61032c610c2b565b60405161033991906136f0565b60405180910390f35b61034a610c53565b6040516103579190613793565b60405180910390f35b61037a600480360381019061037591906137b3565b610ce3565b6040516103879190613832565b60405180910390f35b6103aa60048036038101906103a591906136a3565b610d8d565b6040516103b791906135fd565b60405180910390f35b6103da60048036038101906103d591906136a3565b610daf565b6040516103e791906135fd565b60405180910390f35b6103f8610e65565b60405161040591906135fd565b60405180910390f35b610416610e89565b604051610423919061385a565b60405180910390f35b61044660048036038101906104419190613873565b610e92565b60405161045492919061389e565b60405180910390f35b610477600480360381019061047291906138cc565b610f44565b60405161048491906135fd565b60405180910390f35b6104a760048036038101906104a2919061394f565b6111a0565b6040516104b49190613989565b60405180910390f35b6104d760048036038101906104d29190613af8565b6111bd565b005b6104e1611317565b6040516104ee9190613989565b60405180910390f35b610511600480360381019061050c9190613b64565b61133b565b005b61051b6114a3565b6040516105289190613832565b60405180910390f35b61054b60048036038101906105469190613b64565b6114b1565b005b610567600480360381019061056291906136a3565b611534565b60405161057491906135fd565b60405180910390f35b61058561156a565b005b6105a1600480360381019061059c91906136a3565b61159f565b005b6105bd60048036038101906105b89190613ba2565b61162f565b005b6105d960048036038101906105d49190613bcd565b6116e0565b6040516105e691906135fd565b60405180910390f35b61060960048036038101906106049190613873565b6117de565b005b610613611868565b60405161062091906135fd565b60405180910390f35b61063161188c565b60405161063e9190613989565b60405180910390f35b61064f6118b0565b60405161065c91906135fd565b60405180910390f35b61067f600480360381019061067a9190613873565b6118be565b60405161068c9190613793565b60405180910390f35b61069d61198e565b6040516106aa9190613989565b60405180910390f35b6106cd60048036038101906106c89190613873565b6119b2565b6040516106da919061385a565b60405180910390f35b6106eb6119f7565b6040516106f891906136f0565b60405180910390f35b610709611a1d565b6040516107169190613989565b60405180910390f35b61073960048036038101906107349190613c47565b611a41565b6040516107469190613793565b60405180910390f35b610757611ae6565b005b610773600480360381019061076e9190613b64565b611b1b565b60405161078091906135fd565b60405180910390f35b610791611b7f565b60405161079e9190613793565b60405180910390f35b6107c160048036038101906107bc9190613c72565b611c0f565b6040516107ce91906135fd565b60405180910390f35b6107df611cb8565b6040516107ec9190613989565b60405180910390f35b61080f600480360381019061080a91906136a3565b611cbe565b60405161081c91906135fd565b60405180910390f35b61083f600480360381019061083a91906136a3565b611d33565b60405161084c91906135fd565b60405180910390f35b61086f600480360381019061086a9190613873565b611f89565b60405161087d929190613cb0565b60405180910390f35b6108a0600480360381019061089b91906138cc565b611fa9565b6040516108ad9190613832565b60405180910390f35b6108be612050565b6040516108cb9190613989565b60405180910390f35b6108ee60048036038101906108e99190613b64565b612074565b005b61090a60048036038101906109059190613873565b6121db565b60405161091791906135fd565b60405180910390f35b61093a60048036038101906109359190613873565b61222f565b005b61095660048036038101906109519190613c72565b6122b8565b604051610963919061385a565b60405180910390f35b61098660048036038101906109819190613cd7565b61233a565b005b6109a2600480360381019061099d9190613873565b612502565b6040516109b0929190613cb0565b60405180910390f35b6109c1612575565b6040516109ce9190613989565b60405180910390f35b6109f160048036038101906109ec91906136a3565b612599565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a655750610a648261269a565b5b9050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b20610a9681612703565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610afb576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f811480610b4b57505f83145b15610b8f577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1845f604051610b81929190613d69565b60405180910390a150610c26565b5f83821115610ba057838203610ba2565b5f5b90508060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e185828403604051610c1b929190613d90565b60405180910390a150505b505050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c6290613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8e90613de4565b8015610cd95780601f10610cb057610100808354040283529160200191610cd9565b820191905f5260205f20905b815481529060010190602001808311610cbc57829003601f168201915b5050505050905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401610d449493929190613e14565b602060405180830381865afa158015610d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d839190613e6b565b9050949350505050565b5f80610d97612717565b9050610da481858561271e565b600191505092915050565b5f80610dba846119b2565b905082811015610dce576001915050610e5f565b5f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090508060200151421115610e4357600192505050610e5f565b5f815f015183610e539190613ec3565b90508085111593505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b6007602052805f5260405f205f91509050805f015f9054906101000a900460ff1690806001018054610ec390613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054610eef90613de4565b8015610f3a5780601f10610f1157610100808354040283529160200191610f3a565b820191905f5260205f20905b815481529060010190602001808311610f1d57829003601f168201915b5050505050905082565b5f338484845f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fd3576040517fee26599b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16630754cede878787876040518563ffffffff1660e01b81526004016110139493929190613e14565b602060405180830381865afa15801561102e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110529190613e6b565b90508173ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c19190613e6b565b60ff168160ff16148273ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b81526004016111029190613832565b5f60405180830381865afa15801561111c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906111449190613f64565b90611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c9190613793565b60405180910390fd5b506111918a8a8a6128e1565b96505050505050509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a6111e781612703565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361124c576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528084151581526020018381525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010190816112d2919061413f565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd58484846040516113099392919061420e565b60405180910390a150505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b611344826111a0565b61134d81612703565b5f801b8303611494576113807f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68361290f565b6113aa7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488361290f565b6113d47fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee308361290f565b6113fe7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8361290f565b6114287f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a8361290f565b6114527f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b208361290f565b6114938260016040518060400160405280600d81526020017f64656661756c742061646d696e000000000000000000000000000000000000008152506111bd565b5b61149e838361290f565b505050565b5f6114ac6129ea565b905090565b6114b9612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d906142ba565b60405180910390fd5b61153082826129f2565b5050565b5f8061153e612717565b905061155f81858561155085896122b8565b61155a91906142d8565b61271e565b600191505092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61159481612703565b61159c612acd565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66115c981612703565b7f0000000000000000000000000000000000000000000000000000000000000000611620576040517fab24652c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162a8383612b2e565b505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861165981612703565b7f00000000000000000000000000000000000000000000000000000000000000006116b0576040517ffa32799b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116dc600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612c7c565b5050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff168015611781575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b80156117d5575060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b90509392505050565b5f801b6117ea81612703565b81600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f78c7c060c9bc33c6b42b3e972a9f710e466fa2c77b4f7083869b041492f00f40823360405161185c92919061430b565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b5f6118b9612e3f565b905090565b606060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101805461190b90613de4565b80601f016020809104026020016040519081016040528092919081815260200182805461193790613de4565b80156119825780601f1061195957610100808354040283529160200191611982565b820191905f5260205f20905b81548152906001019060200180831161196557829003601f168201915b50505050509050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2081565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3081565b606060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401611a9d9190613832565b5f60405180830381865afa158015611ab7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611adf9190613f64565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611b1081612703565b611b18612e54565b50565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054611b8e90613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bba90613de4565b8015611c055780601f10611bdc57610100808354040283529160200191611c05565b820191905f5260205f20905b815481529060010190602001808311611be857829003601f168201915b5050505050905090565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff168015611cb0575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b905092915050565b5f801b81565b5f80611cc8612717565b90505f611cd582866122b8565b905083811015611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906143a2565b60405180910390fd5b611d27828686840361271e565b60019250505092915050565b5f3383835f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517fee26599b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff1663d4ce14158686866040518463ffffffff1660e01b8152600401611dff939291906143c0565b602060405180830381865afa158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e9190613e6b565b90508173ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ead9190613e6b565b60ff168160ff16148273ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401611eee9190613832565b5f60405180830381865afa158015611f08573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f309190613f64565b90611f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f689190613793565b60405180910390fd5b50611f7c8888612eb6565b9550505050505092915050565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401612008939291906143c0565b602060405180830381865afa158015612023573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120479190613e6b565b90509392505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61207d826111a0565b61208681612703565b5f801b83036121cc576120b97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6836129f2565b6120e37f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848836129f2565b61210d7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30836129f2565b6121377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a836129f2565b6121617f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a836129f2565b61218b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b20836129f2565b6121cb825f6040518060400160405280601581526020017f64656661756c742061646d696e207265766f6b656400000000000000000000008152506111bd565b5b6121d683836129f2565b505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff169050919050565b5f801b61223b81612703565b8160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe82336040516122ac92919061430b565b60405180910390a15050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2061236481612703565b42821161239d576040517f0605be2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612402576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f830361243b576040517f5e85ae7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612445856119b2565b9050808411156124555780612457565b835b935060405180604001604052808581526020018481525060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae8585856040516124f3939291906143f5565b60405180910390a15050505050565b5f805f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090508060200151815f01519250925050915091565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee306125c381612703565b6125cd8383610daf565b612603576040517fe201ec7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61263083600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ed8565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b8460405161268d919061385a565b60405180910390a3505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127148161270f612717565b613144565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361278c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127839061449a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614528565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516128d4919061385a565b60405180910390a3505050565b5f806128eb612717565b90506128f88582856131c8565b612903858585612ed8565b60019150509392505050565b6129198282611b1b565b6129e657600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061298b612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6012905090565b6129fc8282611b1b565b15612ac9575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612a6e612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612ad5613253565b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b17612717565b604051612b2491906136f0565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390614590565b60405180910390fd5b612ba75f838361329c565b8060025f828254612bb891906142d8565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c65919061385a565b60405180910390a3612c785f83836132a1565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce19061461e565b60405180910390fd5b612cf5825f8361329c565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f906146ac565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e27919061385a565b60405180910390a3612e3a835f846132a1565b505050565b5f60065f9054906101000a900460ff16905090565b612e5c6132a6565b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e9f612717565b604051612eac91906136f0565b60405180910390a1565b5f80612ec0612717565b9050612ecd818585612ed8565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d9061473a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fab906147c8565b60405180910390fd5b612fbf83838361329c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303990614856565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161312b919061385a565b60405180910390a361313e8484846132a1565b50505050565b61314e8282611b1b565b6131c45761315b816132f0565b613168835f1c602061331d565b604051602001613179929190614942565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bb9190613793565b60405180910390fd5b5050565b5f6131d384846122b8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461324d578181101561323f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613236906149c5565b60405180910390fd5b61324c848484840361271e565b5b50505050565b61325b6118b0565b61329a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329190614a2d565b60405180910390fd5b565b505050565b505050565b6132ae6118b0565b156132ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e590614a95565b60405180910390fd5b565b60606133168273ffffffffffffffffffffffffffffffffffffffff16601460ff1661331d565b9050919050565b60605f600283600261332f9190614ab3565b61333991906142d8565b67ffffffffffffffff811115613352576133516139d4565b5b6040519080825280601f01601f1916602001820160405280156133845781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106133bb576133ba614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061341e5761341d614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600184600261345c9190614ab3565b61346691906142d8565b90505b6001811115613505577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106134a8576134a7614af4565b5b1a60f81b8282815181106134bf576134be614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c9450806134fe90614b21565b9050613469565b505f8414613548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353f90614b92565b60405180910390fd5b8091505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61359781613563565b81146135a1575f80fd5b50565b5f813590506135b28161358e565b92915050565b5f602082840312156135cd576135cc61355b565b5b5f6135da848285016135a4565b91505092915050565b5f8115159050919050565b6135f7816135e3565b82525050565b5f6020820190506136105f8301846135ee565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61363f82613616565b9050919050565b61364f81613635565b8114613659575f80fd5b50565b5f8135905061366a81613646565b92915050565b5f819050919050565b61368281613670565b811461368c575f80fd5b50565b5f8135905061369d81613679565b92915050565b5f80604083850312156136b9576136b861355b565b5b5f6136c68582860161365c565b92505060206136d78582860161368f565b9150509250929050565b6136ea81613635565b82525050565b5f6020820190506137035f8301846136e1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613740578082015181840152602081019050613725565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61376582613709565b61376f8185613713565b935061377f818560208601613723565b6137888161374b565b840191505092915050565b5f6020820190508181035f8301526137ab818461375b565b905092915050565b5f805f80608085870312156137cb576137ca61355b565b5b5f6137d88782880161365c565b94505060206137e98782880161365c565b93505060406137fa8782880161365c565b925050606061380b8782880161368f565b91505092959194509250565b5f60ff82169050919050565b61382c81613817565b82525050565b5f6020820190506138455f830184613823565b92915050565b61385481613670565b82525050565b5f60208201905061386d5f83018461384b565b92915050565b5f602082840312156138885761388761355b565b5b5f6138958482850161365c565b91505092915050565b5f6040820190506138b15f8301856135ee565b81810360208301526138c3818461375b565b90509392505050565b5f805f606084860312156138e3576138e261355b565b5b5f6138f08682870161365c565b93505060206139018682870161365c565b92505060406139128682870161368f565b9150509250925092565b5f819050919050565b61392e8161391c565b8114613938575f80fd5b50565b5f8135905061394981613925565b92915050565b5f602082840312156139645761396361355b565b5b5f6139718482850161393b565b91505092915050565b6139838161391c565b82525050565b5f60208201905061399c5f83018461397a565b92915050565b6139ab816135e3565b81146139b5575f80fd5b50565b5f813590506139c6816139a2565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613a0a8261374b565b810181811067ffffffffffffffff82111715613a2957613a286139d4565b5b80604052505050565b5f613a3b613552565b9050613a478282613a01565b919050565b5f67ffffffffffffffff821115613a6657613a656139d4565b5b613a6f8261374b565b9050602081019050919050565b828183375f83830152505050565b5f613a9c613a9784613a4c565b613a32565b905082815260208101848484011115613ab857613ab76139d0565b5b613ac3848285613a7c565b509392505050565b5f82601f830112613adf57613ade6139cc565b5b8135613aef848260208601613a8a565b91505092915050565b5f805f60608486031215613b0f57613b0e61355b565b5b5f613b1c8682870161365c565b9350506020613b2d868287016139b8565b925050604084013567ffffffffffffffff811115613b4e57613b4d61355f565b5b613b5a86828701613acb565b9150509250925092565b5f8060408385031215613b7a57613b7961355b565b5b5f613b878582860161393b565b9250506020613b988582860161365c565b9150509250929050565b5f60208284031215613bb757613bb661355b565b5b5f613bc48482850161368f565b91505092915050565b5f805f60608486031215613be457613be361355b565b5b5f613bf18682870161365c565b9350506020613c028682870161365c565b9250506040613c138682870161365c565b9150509250925092565b613c2681613817565b8114613c30575f80fd5b50565b5f81359050613c4181613c1d565b92915050565b5f60208284031215613c5c57613c5b61355b565b5b5f613c6984828501613c33565b91505092915050565b5f8060408385031215613c8857613c8761355b565b5b5f613c958582860161365c565b9250506020613ca68582860161365c565b9150509250929050565b5f604082019050613cc35f83018561384b565b613cd0602083018461384b565b9392505050565b5f805f60608486031215613cee57613ced61355b565b5b5f613cfb8682870161365c565b9350506020613d0c8682870161368f565b9250506040613d1d8682870161368f565b9150509250925092565b5f819050919050565b5f819050919050565b5f613d53613d4e613d4984613d27565b613d30565b613670565b9050919050565b613d6381613d39565b82525050565b5f604082019050613d7c5f8301856136e1565b613d896020830184613d5a565b9392505050565b5f604082019050613da35f8301856136e1565b613db0602083018461384b565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613dfb57607f821691505b602082108103613e0e57613e0d613db7565b5b50919050565b5f608082019050613e275f8301876136e1565b613e3460208301866136e1565b613e4160408301856136e1565b613e4e606083018461384b565b95945050505050565b5f81519050613e6581613c1d565b92915050565b5f60208284031215613e8057613e7f61355b565b5b5f613e8d84828501613e57565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ecd82613670565b9150613ed883613670565b9250828203905081811115613ef057613eef613e96565b5b92915050565b5f613f08613f0384613a4c565b613a32565b905082815260208101848484011115613f2457613f236139d0565b5b613f2f848285613723565b509392505050565b5f82601f830112613f4b57613f4a6139cc565b5b8151613f5b848260208601613ef6565b91505092915050565b5f60208284031215613f7957613f7861355b565b5b5f82015167ffffffffffffffff811115613f9657613f9561355f565b5b613fa284828501613f37565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026140077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fcc565b6140118683613fcc565b95508019841693508086168417925050509392505050565b5f61404361403e61403984613670565b613d30565b613670565b9050919050565b5f819050919050565b61405c83614029565b6140706140688261404a565b848454613fd8565b825550505050565b5f90565b614084614078565b61408f818484614053565b505050565b5b818110156140b2576140a75f8261407c565b600181019050614095565b5050565b601f8211156140f7576140c881613fab565b6140d184613fbd565b810160208510156140e0578190505b6140f46140ec85613fbd565b830182614094565b50505b505050565b5f82821c905092915050565b5f6141175f19846008026140fc565b1980831691505092915050565b5f61412f8383614108565b9150826002028217905092915050565b61414882613709565b67ffffffffffffffff811115614161576141606139d4565b5b61416b8254613de4565b6141768282856140b6565b5f60209050601f8311600181146141a7575f8415614195578287015190505b61419f8582614124565b865550614206565b601f1984166141b586613fab565b5f5b828110156141dc578489015182556001820191506020850194506020810190506141b7565b868310156141f957848901516141f5601f891682614108565b8355505b6001600288020188555050505b505050505050565b5f6060820190506142215f8301866136e1565b61422e60208301856135ee565b8181036040830152614240818461375b565b9050949350505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f6142a4602f83613713565b91506142af8261424a565b604082019050919050565b5f6020820190508181035f8301526142d181614298565b9050919050565b5f6142e282613670565b91506142ed83613670565b925082820190508082111561430557614304613e96565b5b92915050565b5f60408201905061431e5f8301856136e1565b61432b60208301846136e1565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61438c602583613713565b915061439782614332565b604082019050919050565b5f6020820190508181035f8301526143b981614380565b9050919050565b5f6060820190506143d35f8301866136e1565b6143e060208301856136e1565b6143ed604083018461384b565b949350505050565b5f6060820190506144085f8301866136e1565b614415602083018561384b565b614422604083018461384b565b949350505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614484602483613713565b915061448f8261442a565b604082019050919050565b5f6020820190508181035f8301526144b181614478565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614512602283613713565b915061451d826144b8565b604082019050919050565b5f6020820190508181035f83015261453f81614506565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f61457a601f83613713565b915061458582614546565b602082019050919050565b5f6020820190508181035f8301526145a78161456e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f614608602183613713565b9150614613826145ae565b604082019050919050565b5f6020820190508181035f830152614635816145fc565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f614696602283613713565b91506146a18261463c565b604082019050919050565b5f6020820190508181035f8301526146c38161468a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614724602583613713565b915061472f826146ca565b604082019050919050565b5f6020820190508181035f83015261475181614718565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6147b2602383613713565b91506147bd82614758565b604082019050919050565b5f6020820190508181035f8301526147df816147a6565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614840602683613713565b915061484b826147e6565b604082019050919050565b5f6020820190508181035f83015261486d81614834565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f6148b2601783614874565b91506148bd8261487e565b601782019050919050565b5f6148d282613709565b6148dc8185614874565b93506148ec818560208601613723565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61492c601183614874565b9150614937826148f8565b601182019050919050565b5f61494c826148a6565b915061495882856148c8565b915061496382614920565b915061496f82846148c8565b91508190509392505050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6149af601d83613713565b91506149ba8261497b565b602082019050919050565b5f6020820190508181035f8301526149dc816149a3565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614a17601483613713565b9150614a22826149e3565b602082019050919050565b5f6020820190508181035f830152614a4481614a0b565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f614a7f601083613713565b9150614a8a82614a4b565b602082019050919050565b5f6020820190508181035f830152614aac81614a73565b9050919050565b5f614abd82613670565b9150614ac883613670565b9250828202614ad681613670565b91508282048414831517614aed57614aec613e96565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614b2b82613670565b91505f8203614b3d57614b3c613e96565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f614b7c602083613713565b9150614b8782614b48565b602082019050919050565b5f6020820190508181035f830152614ba981614b70565b905091905056fea2646970667358221220948ff0f599f9b35609867f9adf3d9785c1cf3847beea36e28cac405da60b48ef64736f6c63430008140033000000000000000000000000b8c5ac6f6945d905bac2649b7369fba36a69d41f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000a56fa5b99019a5c8000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106102d4575f3560e01c80635c975abb11610180578063a457c2d7116100e7578063d9ba32fc116100a0578063e2ab691d1161007a578063e2ab691d1461096c578063e3066cf814610988578063e63ab1e9146109b9578063eac449d9146109d7576102d4565b8063d9ba32fc146108f0578063db0cc92a14610920578063dd62ed3e1461093c576102d4565b8063a457c2d7146107f5578063a9059cbb14610825578063c7b6d43214610855578063d4ce141514610886578063d5391393146108b6578063d547741f146108d4576102d4565b80637f4ab1dd116101395780637f4ab1dd1461071f5780638456cb591461074f57806391d148541461075957806395d89b411461078957806399da091d146107a7578063a217fddf146107d7576102d4565b80635c975abb1461064757806368aa9813146106655780636dc5d2481461069557806370a08231146106b357806370d5ae05146106e35780637c4acabf14610701576102d4565b806327ac19751161023f5780633f4ba83a116101f857806343f028d2116101d257806343f028d2146105bf5780634b0e7216146105ef5780635346508a1461060b578063570618e114610629576102d4565b80633f4ba83a1461057d57806340c10f191461058757806342966c68146105a3576102d4565b806327ac1975146104bd578063282c51f3146104d95780632f2ff15d146104f7578063313ce5671461051357806336568abe14610531578063395093511461054d576102d4565b8063098bed3111610291578063098bed31146103c05780630d8fbffe146103f057806318160ddd1461040e5780631e7be2101461042c57806323b872dd1461045d578063248a9ca31461048d576102d4565b806301ffc9a7146102d85780630357371d1461030857806305557bd41461032457806306fdde03146103425780630754cede14610360578063095ea7b314610390575b5f80fd5b6102f260048036038101906102ed91906135b8565b6109f3565b6040516102ff91906135fd565b60405180910390f35b610322600480360381019061031d91906136a3565b610a6c565b005b61032c610c2b565b60405161033991906136f0565b60405180910390f35b61034a610c53565b6040516103579190613793565b60405180910390f35b61037a600480360381019061037591906137b3565b610ce3565b6040516103879190613832565b60405180910390f35b6103aa60048036038101906103a591906136a3565b610d8d565b6040516103b791906135fd565b60405180910390f35b6103da60048036038101906103d591906136a3565b610daf565b6040516103e791906135fd565b60405180910390f35b6103f8610e65565b60405161040591906135fd565b60405180910390f35b610416610e89565b604051610423919061385a565b60405180910390f35b61044660048036038101906104419190613873565b610e92565b60405161045492919061389e565b60405180910390f35b610477600480360381019061047291906138cc565b610f44565b60405161048491906135fd565b60405180910390f35b6104a760048036038101906104a2919061394f565b6111a0565b6040516104b49190613989565b60405180910390f35b6104d760048036038101906104d29190613af8565b6111bd565b005b6104e1611317565b6040516104ee9190613989565b60405180910390f35b610511600480360381019061050c9190613b64565b61133b565b005b61051b6114a3565b6040516105289190613832565b60405180910390f35b61054b60048036038101906105469190613b64565b6114b1565b005b610567600480360381019061056291906136a3565b611534565b60405161057491906135fd565b60405180910390f35b61058561156a565b005b6105a1600480360381019061059c91906136a3565b61159f565b005b6105bd60048036038101906105b89190613ba2565b61162f565b005b6105d960048036038101906105d49190613bcd565b6116e0565b6040516105e691906135fd565b60405180910390f35b61060960048036038101906106049190613873565b6117de565b005b610613611868565b60405161062091906135fd565b60405180910390f35b61063161188c565b60405161063e9190613989565b60405180910390f35b61064f6118b0565b60405161065c91906135fd565b60405180910390f35b61067f600480360381019061067a9190613873565b6118be565b60405161068c9190613793565b60405180910390f35b61069d61198e565b6040516106aa9190613989565b60405180910390f35b6106cd60048036038101906106c89190613873565b6119b2565b6040516106da919061385a565b60405180910390f35b6106eb6119f7565b6040516106f891906136f0565b60405180910390f35b610709611a1d565b6040516107169190613989565b60405180910390f35b61073960048036038101906107349190613c47565b611a41565b6040516107469190613793565b60405180910390f35b610757611ae6565b005b610773600480360381019061076e9190613b64565b611b1b565b60405161078091906135fd565b60405180910390f35b610791611b7f565b60405161079e9190613793565b60405180910390f35b6107c160048036038101906107bc9190613c72565b611c0f565b6040516107ce91906135fd565b60405180910390f35b6107df611cb8565b6040516107ec9190613989565b60405180910390f35b61080f600480360381019061080a91906136a3565b611cbe565b60405161081c91906135fd565b60405180910390f35b61083f600480360381019061083a91906136a3565b611d33565b60405161084c91906135fd565b60405180910390f35b61086f600480360381019061086a9190613873565b611f89565b60405161087d929190613cb0565b60405180910390f35b6108a0600480360381019061089b91906138cc565b611fa9565b6040516108ad9190613832565b60405180910390f35b6108be612050565b6040516108cb9190613989565b60405180910390f35b6108ee60048036038101906108e99190613b64565b612074565b005b61090a60048036038101906109059190613873565b6121db565b60405161091791906135fd565b60405180910390f35b61093a60048036038101906109359190613873565b61222f565b005b61095660048036038101906109519190613c72565b6122b8565b604051610963919061385a565b60405180910390f35b61098660048036038101906109819190613cd7565b61233a565b005b6109a2600480360381019061099d9190613873565b612502565b6040516109b0929190613cb0565b60405180910390f35b6109c1612575565b6040516109ce9190613989565b60405180910390f35b6109f160048036038101906109ec91906136a3565b612599565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a655750610a648261269a565b5b9050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b20610a9681612703565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610afb576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f811480610b4b57505f83145b15610b8f577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1845f604051610b81929190613d69565b60405180910390a150610c26565b5f83821115610ba057838203610ba2565b5f5b90508060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e185828403604051610c1b929190613d90565b60405180910390a150505b505050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c6290613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8e90613de4565b8015610cd95780601f10610cb057610100808354040283529160200191610cd9565b820191905f5260205f20905b815481529060010190602001808311610cbc57829003601f168201915b5050505050905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401610d449493929190613e14565b602060405180830381865afa158015610d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d839190613e6b565b9050949350505050565b5f80610d97612717565b9050610da481858561271e565b600191505092915050565b5f80610dba846119b2565b905082811015610dce576001915050610e5f565b5f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090508060200151421115610e4357600192505050610e5f565b5f815f015183610e539190613ec3565b90508085111593505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000181565b5f600254905090565b6007602052805f5260405f205f91509050805f015f9054906101000a900460ff1690806001018054610ec390613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054610eef90613de4565b8015610f3a5780601f10610f1157610100808354040283529160200191610f3a565b820191905f5260205f20905b815481529060010190602001808311610f1d57829003601f168201915b5050505050905082565b5f338484845f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fd3576040517fee26599b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16630754cede878787876040518563ffffffff1660e01b81526004016110139493929190613e14565b602060405180830381865afa15801561102e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110529190613e6b565b90508173ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c19190613e6b565b60ff168160ff16148273ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b81526004016111029190613832565b5f60405180830381865afa15801561111c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906111449190613f64565b90611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c9190613793565b60405180910390fd5b506111918a8a8a6128e1565b96505050505050509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a6111e781612703565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361124c576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528084151581526020018381525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010190816112d2919061413f565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd58484846040516113099392919061420e565b60405180910390a150505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b611344826111a0565b61134d81612703565b5f801b8303611494576113807f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68361290f565b6113aa7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488361290f565b6113d47fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee308361290f565b6113fe7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8361290f565b6114287f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a8361290f565b6114527f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b208361290f565b6114938260016040518060400160405280600d81526020017f64656661756c742061646d696e000000000000000000000000000000000000008152506111bd565b5b61149e838361290f565b505050565b5f6114ac6129ea565b905090565b6114b9612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d906142ba565b60405180910390fd5b61153082826129f2565b5050565b5f8061153e612717565b905061155f81858561155085896122b8565b61155a91906142d8565b61271e565b600191505092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61159481612703565b61159c612acd565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66115c981612703565b7f0000000000000000000000000000000000000000000000000000000000000001611620576040517fab24652c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162a8383612b2e565b505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861165981612703565b7f00000000000000000000000000000000000000000000000000000000000000016116b0576040517ffa32799b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116dc600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612c7c565b5050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff168015611781575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b80156117d5575060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b90509392505050565b5f801b6117ea81612703565b81600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f78c7c060c9bc33c6b42b3e972a9f710e466fa2c77b4f7083869b041492f00f40823360405161185c92919061430b565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b5f6118b9612e3f565b905090565b606060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101805461190b90613de4565b80601f016020809104026020016040519081016040528092919081815260200182805461193790613de4565b80156119825780601f1061195957610100808354040283529160200191611982565b820191905f5260205f20905b81548152906001019060200180831161196557829003601f168201915b50505050509050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2081565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3081565b606060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401611a9d9190613832565b5f60405180830381865afa158015611ab7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611adf9190613f64565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611b1081612703565b611b18612e54565b50565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054611b8e90613de4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bba90613de4565b8015611c055780601f10611bdc57610100808354040283529160200191611c05565b820191905f5260205f20905b815481529060010190602001808311611be857829003601f168201915b5050505050905090565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff168015611cb0575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff165b905092915050565b5f801b81565b5f80611cc8612717565b90505f611cd582866122b8565b905083811015611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906143a2565b60405180910390fd5b611d27828686840361271e565b60019250505092915050565b5f3383835f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517fee26599b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff1663d4ce14158686866040518463ffffffff1660e01b8152600401611dff939291906143c0565b602060405180830381865afa158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e9190613e6b565b90508173ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ead9190613e6b565b60ff168160ff16148273ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401611eee9190613832565b5f60405180830381865afa158015611f08573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f309190613f64565b90611f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f689190613793565b60405180910390fd5b50611f7c8888612eb6565b9550505050505092915050565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401612008939291906143c0565b602060405180830381865afa158015612023573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120479190613e6b565b90509392505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61207d826111a0565b61208681612703565b5f801b83036121cc576120b97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6836129f2565b6120e37f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848836129f2565b61210d7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30836129f2565b6121377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a836129f2565b6121617f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a836129f2565b61218b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b20836129f2565b6121cb825f6040518060400160405280601581526020017f64656661756c742061646d696e207265766f6b656400000000000000000000008152506111bd565b5b6121d683836129f2565b505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff169050919050565b5f801b61223b81612703565b8160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe82336040516122ac92919061430b565b60405180910390a15050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2061236481612703565b42821161239d576040517f0605be2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612402576040517f0855380c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f830361243b576040517f5e85ae7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612445856119b2565b9050808411156124555780612457565b835b935060405180604001604052808581526020018481525060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae8585856040516124f3939291906143f5565b60405180910390a15050505050565b5f805f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090508060200151815f01519250925050915091565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee306125c381612703565b6125cd8383610daf565b612603576040517fe201ec7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61263083600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ed8565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b8460405161268d919061385a565b60405180910390a3505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127148161270f612717565b613144565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361278c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127839061449a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614528565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516128d4919061385a565b60405180910390a3505050565b5f806128eb612717565b90506128f88582856131c8565b612903858585612ed8565b60019150509392505050565b6129198282611b1b565b6129e657600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061298b612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6012905090565b6129fc8282611b1b565b15612ac9575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612a6e612717565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612ad5613253565b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b17612717565b604051612b2491906136f0565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390614590565b60405180910390fd5b612ba75f838361329c565b8060025f828254612bb891906142d8565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c65919061385a565b60405180910390a3612c785f83836132a1565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce19061461e565b60405180910390fd5b612cf5825f8361329c565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f906146ac565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e27919061385a565b60405180910390a3612e3a835f846132a1565b505050565b5f60065f9054906101000a900460ff16905090565b612e5c6132a6565b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e9f612717565b604051612eac91906136f0565b60405180910390a1565b5f80612ec0612717565b9050612ecd818585612ed8565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d9061473a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fab906147c8565b60405180910390fd5b612fbf83838361329c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303990614856565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161312b919061385a565b60405180910390a361313e8484846132a1565b50505050565b61314e8282611b1b565b6131c45761315b816132f0565b613168835f1c602061331d565b604051602001613179929190614942565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bb9190613793565b60405180910390fd5b5050565b5f6131d384846122b8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461324d578181101561323f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613236906149c5565b60405180910390fd5b61324c848484840361271e565b5b50505050565b61325b6118b0565b61329a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329190614a2d565b60405180910390fd5b565b505050565b505050565b6132ae6118b0565b156132ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e590614a95565b60405180910390fd5b565b60606133168273ffffffffffffffffffffffffffffffffffffffff16601460ff1661331d565b9050919050565b60605f600283600261332f9190614ab3565b61333991906142d8565b67ffffffffffffffff811115613352576133516139d4565b5b6040519080825280601f01601f1916602001820160405280156133845781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106133bb576133ba614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061341e5761341d614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600184600261345c9190614ab3565b61346691906142d8565b90505b6001811115613505577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106134a8576134a7614af4565b5b1a60f81b8282815181106134bf576134be614af4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c9450806134fe90614b21565b9050613469565b505f8414613548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353f90614b92565b60405180910390fd5b8091505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61359781613563565b81146135a1575f80fd5b50565b5f813590506135b28161358e565b92915050565b5f602082840312156135cd576135cc61355b565b5b5f6135da848285016135a4565b91505092915050565b5f8115159050919050565b6135f7816135e3565b82525050565b5f6020820190506136105f8301846135ee565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61363f82613616565b9050919050565b61364f81613635565b8114613659575f80fd5b50565b5f8135905061366a81613646565b92915050565b5f819050919050565b61368281613670565b811461368c575f80fd5b50565b5f8135905061369d81613679565b92915050565b5f80604083850312156136b9576136b861355b565b5b5f6136c68582860161365c565b92505060206136d78582860161368f565b9150509250929050565b6136ea81613635565b82525050565b5f6020820190506137035f8301846136e1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613740578082015181840152602081019050613725565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61376582613709565b61376f8185613713565b935061377f818560208601613723565b6137888161374b565b840191505092915050565b5f6020820190508181035f8301526137ab818461375b565b905092915050565b5f805f80608085870312156137cb576137ca61355b565b5b5f6137d88782880161365c565b94505060206137e98782880161365c565b93505060406137fa8782880161365c565b925050606061380b8782880161368f565b91505092959194509250565b5f60ff82169050919050565b61382c81613817565b82525050565b5f6020820190506138455f830184613823565b92915050565b61385481613670565b82525050565b5f60208201905061386d5f83018461384b565b92915050565b5f602082840312156138885761388761355b565b5b5f6138958482850161365c565b91505092915050565b5f6040820190506138b15f8301856135ee565b81810360208301526138c3818461375b565b90509392505050565b5f805f606084860312156138e3576138e261355b565b5b5f6138f08682870161365c565b93505060206139018682870161365c565b92505060406139128682870161368f565b9150509250925092565b5f819050919050565b61392e8161391c565b8114613938575f80fd5b50565b5f8135905061394981613925565b92915050565b5f602082840312156139645761396361355b565b5b5f6139718482850161393b565b91505092915050565b6139838161391c565b82525050565b5f60208201905061399c5f83018461397a565b92915050565b6139ab816135e3565b81146139b5575f80fd5b50565b5f813590506139c6816139a2565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613a0a8261374b565b810181811067ffffffffffffffff82111715613a2957613a286139d4565b5b80604052505050565b5f613a3b613552565b9050613a478282613a01565b919050565b5f67ffffffffffffffff821115613a6657613a656139d4565b5b613a6f8261374b565b9050602081019050919050565b828183375f83830152505050565b5f613a9c613a9784613a4c565b613a32565b905082815260208101848484011115613ab857613ab76139d0565b5b613ac3848285613a7c565b509392505050565b5f82601f830112613adf57613ade6139cc565b5b8135613aef848260208601613a8a565b91505092915050565b5f805f60608486031215613b0f57613b0e61355b565b5b5f613b1c8682870161365c565b9350506020613b2d868287016139b8565b925050604084013567ffffffffffffffff811115613b4e57613b4d61355f565b5b613b5a86828701613acb565b9150509250925092565b5f8060408385031215613b7a57613b7961355b565b5b5f613b878582860161393b565b9250506020613b988582860161365c565b9150509250929050565b5f60208284031215613bb757613bb661355b565b5b5f613bc48482850161368f565b91505092915050565b5f805f60608486031215613be457613be361355b565b5b5f613bf18682870161365c565b9350506020613c028682870161365c565b9250506040613c138682870161365c565b9150509250925092565b613c2681613817565b8114613c30575f80fd5b50565b5f81359050613c4181613c1d565b92915050565b5f60208284031215613c5c57613c5b61355b565b5b5f613c6984828501613c33565b91505092915050565b5f8060408385031215613c8857613c8761355b565b5b5f613c958582860161365c565b9250506020613ca68582860161365c565b9150509250929050565b5f604082019050613cc35f83018561384b565b613cd0602083018461384b565b9392505050565b5f805f60608486031215613cee57613ced61355b565b5b5f613cfb8682870161365c565b9350506020613d0c8682870161368f565b9250506040613d1d8682870161368f565b9150509250925092565b5f819050919050565b5f819050919050565b5f613d53613d4e613d4984613d27565b613d30565b613670565b9050919050565b613d6381613d39565b82525050565b5f604082019050613d7c5f8301856136e1565b613d896020830184613d5a565b9392505050565b5f604082019050613da35f8301856136e1565b613db0602083018461384b565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613dfb57607f821691505b602082108103613e0e57613e0d613db7565b5b50919050565b5f608082019050613e275f8301876136e1565b613e3460208301866136e1565b613e4160408301856136e1565b613e4e606083018461384b565b95945050505050565b5f81519050613e6581613c1d565b92915050565b5f60208284031215613e8057613e7f61355b565b5b5f613e8d84828501613e57565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ecd82613670565b9150613ed883613670565b9250828203905081811115613ef057613eef613e96565b5b92915050565b5f613f08613f0384613a4c565b613a32565b905082815260208101848484011115613f2457613f236139d0565b5b613f2f848285613723565b509392505050565b5f82601f830112613f4b57613f4a6139cc565b5b8151613f5b848260208601613ef6565b91505092915050565b5f60208284031215613f7957613f7861355b565b5b5f82015167ffffffffffffffff811115613f9657613f9561355f565b5b613fa284828501613f37565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026140077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fcc565b6140118683613fcc565b95508019841693508086168417925050509392505050565b5f61404361403e61403984613670565b613d30565b613670565b9050919050565b5f819050919050565b61405c83614029565b6140706140688261404a565b848454613fd8565b825550505050565b5f90565b614084614078565b61408f818484614053565b505050565b5b818110156140b2576140a75f8261407c565b600181019050614095565b5050565b601f8211156140f7576140c881613fab565b6140d184613fbd565b810160208510156140e0578190505b6140f46140ec85613fbd565b830182614094565b50505b505050565b5f82821c905092915050565b5f6141175f19846008026140fc565b1980831691505092915050565b5f61412f8383614108565b9150826002028217905092915050565b61414882613709565b67ffffffffffffffff811115614161576141606139d4565b5b61416b8254613de4565b6141768282856140b6565b5f60209050601f8311600181146141a7575f8415614195578287015190505b61419f8582614124565b865550614206565b601f1984166141b586613fab565b5f5b828110156141dc578489015182556001820191506020850194506020810190506141b7565b868310156141f957848901516141f5601f891682614108565b8355505b6001600288020188555050505b505050505050565b5f6060820190506142215f8301866136e1565b61422e60208301856135ee565b8181036040830152614240818461375b565b9050949350505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f6142a4602f83613713565b91506142af8261424a565b604082019050919050565b5f6020820190508181035f8301526142d181614298565b9050919050565b5f6142e282613670565b91506142ed83613670565b925082820190508082111561430557614304613e96565b5b92915050565b5f60408201905061431e5f8301856136e1565b61432b60208301846136e1565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61438c602583613713565b915061439782614332565b604082019050919050565b5f6020820190508181035f8301526143b981614380565b9050919050565b5f6060820190506143d35f8301866136e1565b6143e060208301856136e1565b6143ed604083018461384b565b949350505050565b5f6060820190506144085f8301866136e1565b614415602083018561384b565b614422604083018461384b565b949350505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614484602483613713565b915061448f8261442a565b604082019050919050565b5f6020820190508181035f8301526144b181614478565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614512602283613713565b915061451d826144b8565b604082019050919050565b5f6020820190508181035f83015261453f81614506565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f61457a601f83613713565b915061458582614546565b602082019050919050565b5f6020820190508181035f8301526145a78161456e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f614608602183613713565b9150614613826145ae565b604082019050919050565b5f6020820190508181035f830152614635816145fc565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f614696602283613713565b91506146a18261463c565b604082019050919050565b5f6020820190508181035f8301526146c38161468a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614724602583613713565b915061472f826146ca565b604082019050919050565b5f6020820190508181035f83015261475181614718565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6147b2602383613713565b91506147bd82614758565b604082019050919050565b5f6020820190508181035f8301526147df816147a6565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614840602683613713565b915061484b826147e6565b604082019050919050565b5f6020820190508181035f83015261486d81614834565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f6148b2601783614874565b91506148bd8261487e565b601782019050919050565b5f6148d282613709565b6148dc8185614874565b93506148ec818560208601613723565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61492c601183614874565b9150614937826148f8565b601182019050919050565b5f61494c826148a6565b915061495882856148c8565b915061496382614920565b915061496f82846148c8565b91508190509392505050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6149af601d83613713565b91506149ba8261497b565b602082019050919050565b5f6020820190508181035f8301526149dc816149a3565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614a17601483613713565b9150614a22826149e3565b602082019050919050565b5f6020820190508181035f830152614a4481614a0b565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f614a7f601083613713565b9150614a8a82614a4b565b602082019050919050565b5f6020820190508181035f830152614aac81614a73565b9050919050565b5f614abd82613670565b9150614ac883613670565b9250828202614ad681613670565b91508282048414831517614aed57614aec613e96565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614b2b82613670565b91505f8203614b3d57614b3c613e96565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f614b7c602083613713565b9150614b8782614b48565b602082019050919050565b5f6020820190508181035f830152614ba981614b70565b905091905056fea2646970667358221220948ff0f599f9b35609867f9adf3d9785c1cf3847beea36e28cac405da60b48ef64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b8c5ac6f6945d905bac2649b7369fba36a69d41f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000a56fa5b99019a5c8000000
-----Decoded View---------------
Arg [0] : owner (address): 0xB8c5AC6f6945D905bAc2649b7369fbA36a69D41F
Arg [1] : isMintAllowed (bool): True
Arg [2] : isBurnAllowed (bool): True
Arg [3] : initialSupply (uint256): 200000000000000000000000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b8c5ac6f6945d905bac2649b7369fba36a69d41f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000000000000000000000a56fa5b99019a5c8000000
Deployed Bytecode Sourcemap
55111:20716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28561:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67939:1087;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71871:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39958:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73188:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42318:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69782:997;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55887:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41087:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56642:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;74996:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30384:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64618:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56231:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61058:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75718:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31969:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43769:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64232:79;;;:::i;:::-;;62569:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63282:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66334:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62932:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55774:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56440:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75419:127;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65465:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56519:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41258:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55993:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56300:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73759:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64059:75;;;:::i;:::-;;28857:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40177:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65855:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27962:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44510:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74381:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56746:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;72432:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56162:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61792:573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65134:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71447:259;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41847:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66970:646;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71001:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56371:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63691:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28561:204;28646:4;28685:32;28670:47;;;:11;:47;;;;:87;;;;28721:36;28745:11;28721:23;:36::i;:::-;28670:87;28663:94;;28561:204;;;:::o;67939:1087::-;56561:28;28453:16;28464:4;28453:10;:16::i;:::-;68069:1:::1;68049:22;;:8;:22;;::::0;68045:58:::1;;68080:23;;;;;;;;;;;;;;68045:58;68116:20;68139:7;:17;68147:8;68139:17;;;;;;;;;;;;;;;:24;;;68116:47;;68226:1;68210:12;:17;:41;;;;68250:1;68231:15;:20;68210:41;68207:126;;;68273:27;68288:8;68298:1;68273:27;;;;;;;:::i;:::-;;;;;;;;68315:7;;;68207:126;68353:23;68629:15;68613:12;:31;;:68;;68666:15;68651:12;:30;68613:68;;;68647:1;68613:68;68595:86;;68835:15;68808:7;:17;68816:8;68808:17;;;;;;;;;;;;;;;:24;;:42;;;;68948:56;68963:8;68988:15;68973:12;:30;68948:56;;;;;;;:::i;:::-;;;;;;;;68034:992;;28480:1;67939:1087:::0;;;:::o;71871:122::-;71928:7;71963:21;;;;;;;;;;;71948:37;;71871:122;:::o;39958:100::-;40012:13;40045:5;40038:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39958:100;:::o;73188:356::-;73336:5;73458:21;;;;;;;;;;;:51;;;73510:7;73519:4;73525:2;73529:6;73458:78;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73451:85;;73188:356;;;;;;:::o;42318:201::-;42401:4;42418:13;42434:12;:10;:12::i;:::-;42418:28;;42457:32;42466:5;42473:7;42482:6;42457:8;:32::i;:::-;42507:4;42500:11;;;42318:201;;;;:::o;69782:997::-;69860:4;69920:15;69938:19;69948:8;69938:9;:19::i;:::-;69920:37;;70256:6;70246:7;:16;70242:33;;;70271:4;70264:11;;;;;70242:33;70329:28;70360:7;:17;70368:8;70360:17;;;;;;;;;;;;;;;70329:48;;;;;;;;;;;;;;;;;;;;;;;;;;;70459:10;:22;;;70441:15;:40;70437:57;;;70490:4;70483:11;;;;;;70437:57;70567:23;70603:10;:17;;;70593:7;:27;;;;:::i;:::-;70567:53;;70756:15;70746:6;:25;;70739:32;;;;;69782:997;;;;;:::o;55887:34::-;;;:::o;41087:108::-;41148:7;41175:12;;41168:19;;41087:108;:::o;56642:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74996:253::-;75166:12;75119:10;75131:4;75137:2;75141:5;58431:38;58472:21;;;;;;;;;;;58431:62;;58551:1;58508:45;;58516:22;58508:45;;;58504:97;;58562:39;;;;;;;;;;;;;;58504:97;58612:21;58636:22;:52;;;58689:7;58698:4;58704:2;58708:5;58636:78;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58612:102;;58752:22;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58733:58;;:15;:58;;;58806:22;:52;;;58859:15;58806:69;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58725:151;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;75206:35:::1;75225:4;75231:2;75235:5;75206:18;:35::i;:::-;75196:45;;58420:476:::0;;74996:253;;;;;;;;;:::o;30384:131::-;30458:7;30485:6;:12;30492:4;30485:12;;;;;;;;;;;:22;;;30478:29;;30384:131;;;:::o;64618:300::-;56483:29;28453:16;28464:4;28453:10;:16::i;:::-;64760:1:::1;64740:22;;:8;:22;;::::0;64736:58:::1;;64771:23;;;;;;;;;;;;;;64736:58;64828:27;;;;;;;;64842:6;64828:27;;;;;;64850:4;64828:27;;::::0;64805:10:::1;:20;64816:8;64805:20;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;64871:39;64887:8;64897:6;64905:4;64871:39;;;;;;;;:::i;:::-;;;;;;;;64618:300:::0;;;;:::o;56231:62::-;56269:24;56231:62;:::o;61058:556::-;61141:18;61154:4;61141:12;:18::i;:::-;28453:16;28464:4;28453:10;:16::i;:::-;28007:4:::1;61184:18:::0;::::1;61176:4;:26:::0;61172:395:::1;;61219:32;56200:24;61243:7;61219:10;:32::i;:::-;61266;56269:24;61290:7;61266:10;:32::i;:::-;61313:33;56339:25;61338:7;61313:10;:33::i;:::-;61361:32;56409:24;61385:7;61361:10;:32::i;:::-;61408:37;56483:29;61437:7;61408:10;:37::i;:::-;61460:36;56561:28;61488:7;61460:10;:36::i;:::-;61511:44;61524:7;61533:4;61511:44;;;;;;;;;;;;;;;;::::0;:12:::1;:44::i;:::-;61172:395;61581:25;61592:4;61598:7;61581:10;:25::i;:::-;61058:556:::0;;;:::o;75718:106::-;75775:5;75800:16;:14;:16::i;:::-;75793:23;;75718:106;:::o;31969:218::-;32076:12;:10;:12::i;:::-;32065:23;;:7;:23;;;32057:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;32153:26;32165:4;32171:7;32153:11;:26::i;:::-;31969:218;;:::o;43769:238::-;43857:4;43874:13;43890:12;:10;:12::i;:::-;43874:28;;43913:64;43922:5;43929:7;43966:10;43938:25;43948:5;43955:7;43938:9;:25::i;:::-;:38;;;;:::i;:::-;43913:8;:64::i;:::-;43995:4;43988:11;;;43769:238;;;;:::o;64232:79::-;56409:24;28453:16;28464:4;28453:10;:16::i;:::-;64293:10:::1;:8;:10::i;:::-;64232:79:::0;:::o;62569:164::-;56200:24;28453:16;28464:4;28453:10;:16::i;:::-;62657:12:::1;62653:44;;62678:19;;;;;;;;;;;;;;62653:44;62708:17;62714:2;62718:6;62708:5;:17::i;:::-;62569:164:::0;;;:::o;63282:162::-;56269:24;28453:16;28464:4;28453:10;:16::i;:::-;63359:12:::1;63354:45;;63380:19;;;;;;;;;;;;;;63354:45;63410:26;63416:11;;;;;;;;;;;63429:6;63410:5;:26::i;:::-;63282:162:::0;;:::o;66334:201::-;66425:4;66449:10;:16;66460:4;66449:16;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:48;;;;;66476:10;:14;66487:2;66476:14;;;;;;;;;;;;;;;:21;;;;;;;;;;;;66449:48;:78;;;;;66501:10;:19;66512:7;66501:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;66449:78;66442:85;;66334:201;;;;;:::o;62932:195::-;28007:4;62998:18;;28453:16;28464:4;28453:10;:16::i;:::-;63043:14:::1;63029:11;;:28;;;;;;;;;;;;;;;;;;63073:46;63092:14;63108:10;63073:46;;;;;;;:::i;:::-;;;;;;;;62932:195:::0;;:::o;55774:34::-;;;:::o;56440:72::-;56483:29;56440:72;:::o;75419:127::-;75497:4;75521:17;:15;:17::i;:::-;75514:24;;75419:127;:::o;65465:131::-;65531:13;65563:10;:20;65574:8;65563:20;;;;;;;;;;;;;;;:25;;65556:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65465:131;;;:::o;56519:70::-;56561:28;56519:70;:::o;41258:127::-;41332:7;41359:9;:18;41369:7;41359:18;;;;;;;;;;;;;;;;41352:25;;41258:127;;;:::o;55993:26::-;;;;;;;;;;;;;:::o;56300:64::-;56339:25;56300:64;:::o;73759:286::-;73844:13;73969:21;;;;;;;;;;;:51;;;74021:15;73969:68;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73962:75;;73759:286;;;:::o;64059:75::-;56409:24;28453:16;28464:4;28453:10;:16::i;:::-;64118:8:::1;:6;:8::i;:::-;64059:75:::0;:::o;28857:147::-;28943:4;28967:6;:12;28974:4;28967:12;;;;;;;;;;;:20;;:29;28988:7;28967:29;;;;;;;;;;;;;;;;;;;;;;;;;28960:36;;28857:147;;;;:::o;40177:104::-;40233:13;40266:7;40259:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40177:104;:::o;65855:154::-;65929:4;65953:10;:16;65964:4;65953:16;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:48;;;;;65980:10;:14;65991:2;65980:14;;;;;;;;;;;;;;;:21;;;;;;;;;;;;65953:48;65946:55;;65855:154;;;;:::o;27962:49::-;28007:4;27962:49;;;:::o;44510:436::-;44603:4;44620:13;44636:12;:10;:12::i;:::-;44620:28;;44659:24;44686:25;44696:5;44703:7;44686:9;:25::i;:::-;44659:52;;44750:15;44730:16;:35;;44722:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44843:60;44852:5;44859:7;44887:15;44868:16;:34;44843:8;:60::i;:::-;44934:4;44927:11;;;;44510:436;;;;:::o;74381:207::-;74515:12;74474:10;74486:2;74490:5;57773:38;57814:21;;;;;;;;;;;57773:62;;57893:1;57850:45;;57858:22;57850:45;;;57846:97;;57904:39;;;;;;;;;;;;;;57846:97;57954:21;57978:22;:48;;;58027:4;58033:2;58037:5;57978:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57954:89;;58081:22;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58062:58;;:15;:58;;;58135:22;:52;;;58188:15;58135:69;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58054:151;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;74555:25:::1;74570:2;74574:5;74555:14;:25::i;:::-;74545:35;;57762:463:::0;;74381:207;;;;;;;:::o;56746:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72432:286::-;72532:5;72645:21;;;;;;;;;;;:47;;;72693:4;72699:2;72703:6;72645:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72638:72;;72432:286;;;;;:::o;56162:62::-;56200:24;56162:62;:::o;61792:573::-;61876:18;61889:4;61876:12;:18::i;:::-;28453:16;28464:4;28453:10;:16::i;:::-;28007:4:::1;61919:18:::0;::::1;61911:4;:26:::0;61907:410:::1;;61954:33;56200:24;61979:7;61954:11;:33::i;:::-;62002;56269:24;62027:7;62002:11;:33::i;:::-;62050:34;56339:25;62076:7;62050:11;:34::i;:::-;62099:33;56409:24;62124:7;62099:11;:33::i;:::-;62147:38;56483:29;62177:7;62147:11;:38::i;:::-;62200:37;56561:28;62229:7;62200:11;:37::i;:::-;62252:53;62265:7;62274:5;62252:53;;;;;;;;;;;;;;;;::::0;:12:::1;:53::i;:::-;61907:410;62331:26;62343:4;62349:7;62331:11;:26::i;:::-;61792:573:::0;;;:::o;65134:126::-;65202:4;65225:10;:20;65236:8;65225:20;;;;;;;;;;;;;;;:27;;;;;;;;;;;;65218:34;;65134:126;;;:::o;71447:259::-;28007:4;71533:18;;28453:16;28464:4;28453:10;:16::i;:::-;71604:22:::1;71564:21;;:63;;;;;;;;;;;;;;;;;;71643:55;71663:22;71687:10;71643:55;;;;;;;:::i;:::-;;;;;;;;71447:259:::0;;:::o;41847:151::-;41936:7;41963:11;:18;41975:5;41963:18;;;;;;;;;;;;;;;:27;41982:7;41963:27;;;;;;;;;;;;;;;;41956:34;;41847:151;;;;:::o;66970:646::-;56561:28;28453:16;28464:4;28453:10;:16::i;:::-;67102:15:::1;67087:11;:30;67083:70;;67126:27;;;;;;;;;;;;;;67083:70;67188:1;67168:22;;:8;:22;;::::0;67164:58:::1;;67199:23;;;;;;;;;;;;;;67164:58;67247:1;67237:6;:11:::0;67233:53:::1;;67257:29;;;;;;;;;;;;;;67233:53;67378:15;67396:25;67412:8;67396:15;:25::i;:::-;67378:43;;67452:7;67441:6;:18;;:37;;67471:7;67441:37;;;67462:6;67441:37;67432:46;;67519:31;;;;;;;;67530:6;67519:31;;;;67538:11;67519:31;;::::0;67499:7:::1;:17;67507:8;67499:17;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;;67566:42;67578:8;67588:6;67596:11;67566:42;;;;;;;;:::i;:::-;;;;;;;;67072:544;66970:646:::0;;;;:::o;71001:252::-;71064:7;71073;71134:28;71165:7;:17;71173:8;71165:17;;;;;;;;;;;;;;;71134:48;;;;;;;;;;;;;;;;;;;;;;;;;;;71203:10;:22;;;71227:10;:17;;;71195:50;;;;;71001:252;;;:::o;56371:62::-;56409:24;56371:62;:::o;63691:268::-;56339:25;28453:16;28464:4;28453:10;:16::i;:::-;63785:27:::1;63799:4;63805:6;63785:13;:27::i;:::-;63780:70;;63821:29;;;;;;;;;;;;;;63780:70;63861:42;63877:4;63883:11;;;;;;;;;;;63896:6;63861:15;:42::i;:::-;63938:4;63919:32;;63926:10;63919:32;;;63944:6;63919:32;;;;;;:::i;:::-;;;;;;;;63691:268:::0;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;29308:105::-;29375:30;29386:4;29392:12;:10;:12::i;:::-;29375:10;:30::i;:::-;29308:105;:::o;22988:98::-;23041:7;23068:10;23061:17;;22988:98;:::o;48503:346::-;48622:1;48605:19;;:5;:19;;;48597:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48703:1;48684:21;;:7;:21;;;48676:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48787:6;48757:11;:18;48769:5;48757:18;;;;;;;;;;;;;;;:27;48776:7;48757:27;;;;;;;;;;;;;;;:36;;;;48825:7;48809:32;;48818:5;48809:32;;;48834:6;48809:32;;;;;;:::i;:::-;;;;;;;;48503:346;;;:::o;43099:261::-;43196:4;43213:15;43231:12;:10;:12::i;:::-;43213:30;;43254:38;43270:4;43276:7;43285:6;43254:15;:38::i;:::-;43303:27;43313:4;43319:2;43323:6;43303:9;:27::i;:::-;43348:4;43341:11;;;43099:261;;;;;:::o;33566:238::-;33650:22;33658:4;33664:7;33650;:22::i;:::-;33645:152;;33721:4;33689:6;:12;33696:4;33689:12;;;;;;;;;;;:20;;:29;33710:7;33689:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;33772:12;:10;:12::i;:::-;33745:40;;33763:7;33745:40;;33757:4;33745:40;;;;;;;;;;33645:152;33566:238;;:::o;40929:93::-;40987:5;41012:2;41005:9;;40929:93;:::o;33984:239::-;34068:22;34076:4;34082:7;34068;:22::i;:::-;34064:152;;;34139:5;34107:6;:12;34114:4;34107:12;;;;;;;;;;;:20;;:29;34128:7;34107:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34191:12;:10;:12::i;:::-;34164:40;;34182:7;34164:40;;34176:4;34164:40;;;;;;;;;;34064:152;33984:239;;:::o;25730:120::-;24739:16;:14;:16::i;:::-;25799:5:::1;25789:7;;:15;;;;;;;;;;;;;;;;;;25820:22;25829:12;:10;:12::i;:::-;25820:22;;;;;;:::i;:::-;;;;;;;;25730:120::o:0;46509:548::-;46612:1;46593:21;;:7;:21;;;46585:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46663:49;46692:1;46696:7;46705:6;46663:20;:49::i;:::-;46741:6;46725:12;;:22;;;;;;;:::i;:::-;;;;;;;;46918:6;46896:9;:18;46906:7;46896:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;46972:7;46951:37;;46968:1;46951:37;;;46981:6;46951:37;;;;;;:::i;:::-;;;;;;;;47001:48;47029:1;47033:7;47042:6;47001:19;:48::i;:::-;46509:548;;:::o;47390:675::-;47493:1;47474:21;;:7;:21;;;47466:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47546:49;47567:7;47584:1;47588:6;47546:20;:49::i;:::-;47608:22;47633:9;:18;47643:7;47633:18;;;;;;;;;;;;;;;;47608:43;;47688:6;47670:14;:24;;47662:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47807:6;47790:14;:23;47769:9;:18;47779:7;47769:18;;;;;;;;;;;;;;;:44;;;;47924:6;47908:12;;:22;;;;;;;;;;;47985:1;47959:37;;47968:7;47959:37;;;47989:6;47959:37;;;;;;:::i;:::-;;;;;;;;48009:48;48029:7;48046:1;48050:6;48009:19;:48::i;:::-;47455:610;47390:675;;:::o;24875:86::-;24922:4;24946:7;;;;;;;;;;;24939:14;;24875:86;:::o;25471:118::-;24480:19;:17;:19::i;:::-;25541:4:::1;25531:7;;:14;;;;;;;;;;;;;;;;;;25561:20;25568:12;:10;:12::i;:::-;25561:20;;;;;;:::i;:::-;;;;;;;;25471:118::o:0;41591:193::-;41670:4;41687:13;41703:12;:10;:12::i;:::-;41687:28;;41726;41736:5;41743:2;41747:6;41726:9;:28::i;:::-;41772:4;41765:11;;;41591:193;;;;:::o;45416:806::-;45529:1;45513:18;;:4;:18;;;45505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45606:1;45592:16;;:2;:16;;;45584:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45661:38;45682:4;45688:2;45692:6;45661:20;:38::i;:::-;45712:19;45734:9;:15;45744:4;45734:15;;;;;;;;;;;;;;;;45712:37;;45783:6;45768:11;:21;;45760:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45900:6;45886:11;:20;45868:9;:15;45878:4;45868:15;;;;;;;;;;;;;;;:38;;;;46103:6;46086:9;:13;46096:2;46086:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;46153:2;46138:26;;46147:4;46138:26;;;46157:6;46138:26;;;;;;:::i;:::-;;;;;;;;46177:37;46197:4;46203:2;46207:6;46177:19;:37::i;:::-;45494:728;45416:806;;;:::o;29703:492::-;29792:22;29800:4;29806:7;29792;:22::i;:::-;29787:401;;29980:28;30000:7;29980:19;:28::i;:::-;30081:38;30109:4;30101:13;;30116:2;30081:19;:38::i;:::-;29885:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29831:345;;;;;;;;;;;:::i;:::-;;;;;;;;29787:401;29703:492;;:::o;49140:419::-;49241:24;49268:25;49278:5;49285:7;49268:9;:25::i;:::-;49241:52;;49328:17;49308:16;:37;49304:248;;49390:6;49370:16;:26;;49362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49474:51;49483:5;49490:7;49518:6;49499:16;:25;49474:8;:51::i;:::-;49304:248;49230:329;49140:419;;;:::o;25219:108::-;25286:8;:6;:8::i;:::-;25278:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;25219:108::o;50159:91::-;;;;:::o;50854:90::-;;;;:::o;25034:108::-;25105:8;:6;:8::i;:::-;25104:9;25096:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;25034:108::o;18882:151::-;18940:13;18973:52;19001:4;18985:22;;16757:2;18973:52;;:11;:52::i;:::-;18966:59;;18882:151;;;:::o;18278:447::-;18353:13;18379:19;18424:1;18415:6;18411:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18401:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18379:47;;18437:15;:6;18444:1;18437:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18463;:6;18470:1;18463:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18494:9;18519:1;18510:6;18506:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18494:26;;18489:131;18526:1;18522;:5;18489:131;;;18561:8;18578:3;18570:5;:11;18561:21;;;;;;;:::i;:::-;;;;;18549:6;18556:1;18549:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;18607:1;18597:11;;;;;18529:3;;;;:::i;:::-;;;18489:131;;;;18647:1;18638:5;:10;18630:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18710:6;18696:21;;;18278: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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:118::-;2948:24;2966:5;2948:24;:::i;:::-;2943:3;2936:37;2861:118;;:::o;2985:222::-;3078:4;3116:2;3105:9;3101:18;3093:26;;3129:71;3197:1;3186:9;3182:17;3173:6;3129:71;:::i;:::-;2985:222;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:246::-;3574:1;3584:113;3598:6;3595:1;3592:13;3584:113;;;3683:1;3678:3;3674:11;3668:18;3664:1;3659:3;3655:11;3648:39;3620:2;3617:1;3613:10;3608:15;;3584:113;;;3731:1;3722:6;3717:3;3713:16;3706:27;3555:184;3493:246;;;:::o;3745:102::-;3786:6;3837:2;3833:7;3828:2;3821:5;3817:14;3813:28;3803:38;;3745:102;;;:::o;3853:377::-;3941:3;3969:39;4002:5;3969:39;:::i;:::-;4024:71;4088:6;4083:3;4024:71;:::i;:::-;4017:78;;4104:65;4162:6;4157:3;4150:4;4143:5;4139:16;4104:65;:::i;:::-;4194:29;4216:6;4194:29;:::i;:::-;4189:3;4185:39;4178:46;;3945:285;3853:377;;;;:::o;4236:313::-;4349:4;4387:2;4376:9;4372:18;4364:26;;4436:9;4430:4;4426:20;4422:1;4411:9;4407:17;4400:47;4464:78;4537:4;4528:6;4464:78;:::i;:::-;4456:86;;4236:313;;;;:::o;4555:765::-;4641:6;4649;4657;4665;4714:3;4702:9;4693:7;4689:23;4685:33;4682:120;;;4721:79;;:::i;:::-;4682:120;4841:1;4866:53;4911:7;4902:6;4891:9;4887:22;4866:53;:::i;:::-;4856:63;;4812:117;4968:2;4994:53;5039:7;5030:6;5019:9;5015:22;4994:53;:::i;:::-;4984:63;;4939:118;5096:2;5122:53;5167:7;5158:6;5147:9;5143:22;5122:53;:::i;:::-;5112:63;;5067:118;5224:2;5250:53;5295:7;5286:6;5275:9;5271:22;5250:53;:::i;:::-;5240:63;;5195:118;4555:765;;;;;;;:::o;5326:86::-;5361:7;5401:4;5394:5;5390:16;5379:27;;5326:86;;;:::o;5418:112::-;5501:22;5517:5;5501:22;:::i;:::-;5496:3;5489:35;5418:112;;:::o;5536:214::-;5625:4;5663:2;5652:9;5648:18;5640:26;;5676:67;5740:1;5729:9;5725:17;5716:6;5676:67;:::i;:::-;5536:214;;;;:::o;5756:118::-;5843:24;5861:5;5843:24;:::i;:::-;5838:3;5831:37;5756:118;;:::o;5880:222::-;5973:4;6011:2;6000:9;5996:18;5988:26;;6024:71;6092:1;6081:9;6077:17;6068:6;6024:71;:::i;:::-;5880:222;;;;:::o;6108:329::-;6167:6;6216:2;6204:9;6195:7;6191:23;6187:32;6184:119;;;6222:79;;:::i;:::-;6184:119;6342:1;6367:53;6412:7;6403:6;6392:9;6388:22;6367:53;:::i;:::-;6357:63;;6313:117;6108:329;;;;:::o;6443:411::-;6578:4;6616:2;6605:9;6601:18;6593:26;;6629:65;6691:1;6680:9;6676:17;6667:6;6629:65;:::i;:::-;6741:9;6735:4;6731:20;6726:2;6715:9;6711:18;6704:48;6769:78;6842:4;6833:6;6769:78;:::i;:::-;6761:86;;6443:411;;;;;:::o;6860:619::-;6937:6;6945;6953;7002:2;6990:9;6981:7;6977:23;6973:32;6970:119;;;7008:79;;:::i;:::-;6970:119;7128:1;7153:53;7198:7;7189:6;7178:9;7174:22;7153:53;:::i;:::-;7143:63;;7099:117;7255:2;7281:53;7326:7;7317:6;7306:9;7302:22;7281:53;:::i;:::-;7271:63;;7226:118;7383:2;7409:53;7454:7;7445:6;7434:9;7430:22;7409:53;:::i;:::-;7399:63;;7354:118;6860:619;;;;;:::o;7485:77::-;7522:7;7551:5;7540:16;;7485:77;;;:::o;7568:122::-;7641:24;7659:5;7641:24;:::i;:::-;7634:5;7631:35;7621:63;;7680:1;7677;7670:12;7621:63;7568:122;:::o;7696:139::-;7742:5;7780:6;7767:20;7758:29;;7796:33;7823:5;7796:33;:::i;:::-;7696:139;;;;:::o;7841:329::-;7900:6;7949:2;7937:9;7928:7;7924:23;7920:32;7917:119;;;7955:79;;:::i;:::-;7917:119;8075:1;8100:53;8145:7;8136:6;8125:9;8121:22;8100:53;:::i;:::-;8090:63;;8046:117;7841:329;;;;:::o;8176:118::-;8263:24;8281:5;8263:24;:::i;:::-;8258:3;8251:37;8176:118;;:::o;8300:222::-;8393:4;8431:2;8420:9;8416:18;8408:26;;8444:71;8512:1;8501:9;8497:17;8488:6;8444:71;:::i;:::-;8300:222;;;;:::o;8528:116::-;8598:21;8613:5;8598:21;:::i;:::-;8591:5;8588:32;8578:60;;8634:1;8631;8624:12;8578:60;8528:116;:::o;8650:133::-;8693:5;8731:6;8718:20;8709:29;;8747:30;8771:5;8747:30;:::i;:::-;8650:133;;;;:::o;8789:117::-;8898:1;8895;8888:12;8912:117;9021:1;9018;9011:12;9035:180;9083:77;9080:1;9073:88;9180:4;9177:1;9170:15;9204:4;9201:1;9194:15;9221:281;9304:27;9326:4;9304:27;:::i;:::-;9296:6;9292:40;9434:6;9422:10;9419:22;9398:18;9386:10;9383:34;9380:62;9377:88;;;9445:18;;:::i;:::-;9377:88;9485:10;9481:2;9474:22;9264:238;9221:281;;:::o;9508:129::-;9542:6;9569:20;;:::i;:::-;9559:30;;9598:33;9626:4;9618:6;9598:33;:::i;:::-;9508:129;;;:::o;9643:308::-;9705:4;9795:18;9787:6;9784:30;9781:56;;;9817:18;;:::i;:::-;9781:56;9855:29;9877:6;9855:29;:::i;:::-;9847:37;;9939:4;9933;9929:15;9921:23;;9643:308;;;:::o;9957:146::-;10054:6;10049:3;10044;10031:30;10095:1;10086:6;10081:3;10077:16;10070:27;9957:146;;;:::o;10109:425::-;10187:5;10212:66;10228:49;10270:6;10228:49;:::i;:::-;10212:66;:::i;:::-;10203:75;;10301:6;10294:5;10287:21;10339:4;10332:5;10328:16;10377:3;10368:6;10363:3;10359:16;10356:25;10353:112;;;10384:79;;:::i;:::-;10353:112;10474:54;10521:6;10516:3;10511;10474:54;:::i;:::-;10193:341;10109:425;;;;;:::o;10554:340::-;10610:5;10659:3;10652:4;10644:6;10640:17;10636:27;10626:122;;10667:79;;:::i;:::-;10626:122;10784:6;10771:20;10809:79;10884:3;10876:6;10869:4;10861:6;10857:17;10809:79;:::i;:::-;10800:88;;10616:278;10554:340;;;;:::o;10900:793::-;10984:6;10992;11000;11049:2;11037:9;11028:7;11024:23;11020:32;11017:119;;;11055:79;;:::i;:::-;11017:119;11175:1;11200:53;11245:7;11236:6;11225:9;11221:22;11200:53;:::i;:::-;11190:63;;11146:117;11302:2;11328:50;11370:7;11361:6;11350:9;11346:22;11328:50;:::i;:::-;11318:60;;11273:115;11455:2;11444:9;11440:18;11427:32;11486:18;11478:6;11475:30;11472:117;;;11508:79;;:::i;:::-;11472:117;11613:63;11668:7;11659:6;11648:9;11644:22;11613:63;:::i;:::-;11603:73;;11398:288;10900:793;;;;;:::o;11699:474::-;11767:6;11775;11824:2;11812:9;11803:7;11799:23;11795:32;11792:119;;;11830:79;;:::i;:::-;11792:119;11950:1;11975:53;12020:7;12011:6;12000:9;11996:22;11975:53;:::i;:::-;11965:63;;11921:117;12077:2;12103:53;12148:7;12139:6;12128:9;12124:22;12103:53;:::i;:::-;12093:63;;12048:118;11699:474;;;;;:::o;12179:329::-;12238:6;12287:2;12275:9;12266:7;12262:23;12258:32;12255:119;;;12293:79;;:::i;:::-;12255:119;12413:1;12438:53;12483:7;12474:6;12463:9;12459:22;12438:53;:::i;:::-;12428:63;;12384:117;12179:329;;;;:::o;12514:619::-;12591:6;12599;12607;12656:2;12644:9;12635:7;12631:23;12627:32;12624:119;;;12662:79;;:::i;:::-;12624:119;12782:1;12807:53;12852:7;12843:6;12832:9;12828:22;12807:53;:::i;:::-;12797:63;;12753:117;12909:2;12935:53;12980:7;12971:6;12960:9;12956:22;12935:53;:::i;:::-;12925:63;;12880:118;13037:2;13063:53;13108:7;13099:6;13088:9;13084:22;13063:53;:::i;:::-;13053:63;;13008:118;12514:619;;;;;:::o;13139:118::-;13210:22;13226:5;13210:22;:::i;:::-;13203:5;13200:33;13190:61;;13247:1;13244;13237:12;13190:61;13139:118;:::o;13263:135::-;13307:5;13345:6;13332:20;13323:29;;13361:31;13386:5;13361:31;:::i;:::-;13263:135;;;;:::o;13404:325::-;13461:6;13510:2;13498:9;13489:7;13485:23;13481:32;13478:119;;;13516:79;;:::i;:::-;13478:119;13636:1;13661:51;13704:7;13695:6;13684:9;13680:22;13661:51;:::i;:::-;13651:61;;13607:115;13404:325;;;;:::o;13735:474::-;13803:6;13811;13860:2;13848:9;13839:7;13835:23;13831:32;13828:119;;;13866:79;;:::i;:::-;13828:119;13986:1;14011:53;14056:7;14047:6;14036:9;14032:22;14011:53;:::i;:::-;14001:63;;13957:117;14113:2;14139:53;14184:7;14175:6;14164:9;14160:22;14139:53;:::i;:::-;14129:63;;14084:118;13735:474;;;;;:::o;14215:332::-;14336:4;14374:2;14363:9;14359:18;14351:26;;14387:71;14455:1;14444:9;14440:17;14431:6;14387:71;:::i;:::-;14468:72;14536:2;14525:9;14521:18;14512:6;14468:72;:::i;:::-;14215:332;;;;;:::o;14553:619::-;14630:6;14638;14646;14695:2;14683:9;14674:7;14670:23;14666:32;14663:119;;;14701:79;;:::i;:::-;14663:119;14821:1;14846:53;14891:7;14882:6;14871:9;14867:22;14846:53;:::i;:::-;14836:63;;14792:117;14948:2;14974:53;15019:7;15010:6;14999:9;14995:22;14974:53;:::i;:::-;14964:63;;14919:118;15076:2;15102:53;15147:7;15138:6;15127:9;15123:22;15102:53;:::i;:::-;15092:63;;15047:118;14553:619;;;;;:::o;15178:85::-;15223:7;15252:5;15241:16;;15178:85;;;:::o;15269:60::-;15297:3;15318:5;15311:12;;15269:60;;;:::o;15335:158::-;15393:9;15426:61;15444:42;15453:32;15479:5;15453:32;:::i;:::-;15444:42;:::i;:::-;15426:61;:::i;:::-;15413:74;;15335:158;;;:::o;15499:147::-;15594:45;15633:5;15594:45;:::i;:::-;15589:3;15582:58;15499:147;;:::o;15652:348::-;15781:4;15819:2;15808:9;15804:18;15796:26;;15832:71;15900:1;15889:9;15885:17;15876:6;15832:71;:::i;:::-;15913:80;15989:2;15978:9;15974:18;15965:6;15913:80;:::i;:::-;15652:348;;;;;:::o;16006:332::-;16127:4;16165:2;16154:9;16150:18;16142:26;;16178:71;16246:1;16235:9;16231:17;16222:6;16178:71;:::i;:::-;16259:72;16327:2;16316:9;16312:18;16303:6;16259:72;:::i;:::-;16006:332;;;;;:::o;16344:180::-;16392:77;16389:1;16382:88;16489:4;16486:1;16479:15;16513:4;16510:1;16503:15;16530:320;16574:6;16611:1;16605:4;16601:12;16591:22;;16658:1;16652:4;16648:12;16679:18;16669:81;;16735:4;16727:6;16723:17;16713:27;;16669:81;16797:2;16789:6;16786:14;16766:18;16763:38;16760:84;;16816:18;;:::i;:::-;16760:84;16581:269;16530:320;;;:::o;16856:553::-;17033:4;17071:3;17060:9;17056:19;17048:27;;17085:71;17153:1;17142:9;17138:17;17129:6;17085:71;:::i;:::-;17166:72;17234:2;17223:9;17219:18;17210:6;17166:72;:::i;:::-;17248;17316:2;17305:9;17301:18;17292:6;17248:72;:::i;:::-;17330;17398:2;17387:9;17383:18;17374:6;17330:72;:::i;:::-;16856:553;;;;;;;:::o;17415:139::-;17470:5;17501:6;17495:13;17486:22;;17517:31;17542:5;17517:31;:::i;:::-;17415:139;;;;:::o;17560:347::-;17628:6;17677:2;17665:9;17656:7;17652:23;17648:32;17645:119;;;17683:79;;:::i;:::-;17645:119;17803:1;17828:62;17882:7;17873:6;17862:9;17858:22;17828:62;:::i;:::-;17818:72;;17774:126;17560:347;;;;:::o;17913:180::-;17961:77;17958:1;17951:88;18058:4;18055:1;18048:15;18082:4;18079:1;18072:15;18099:194;18139:4;18159:20;18177:1;18159:20;:::i;:::-;18154:25;;18193:20;18211:1;18193:20;:::i;:::-;18188:25;;18237:1;18234;18230:9;18222:17;;18261:1;18255:4;18252:11;18249:37;;;18266:18;;:::i;:::-;18249:37;18099:194;;;;:::o;18299:434::-;18388:5;18413:66;18429:49;18471:6;18429:49;:::i;:::-;18413:66;:::i;:::-;18404:75;;18502:6;18495:5;18488:21;18540:4;18533:5;18529:16;18578:3;18569:6;18564:3;18560:16;18557:25;18554:112;;;18585:79;;:::i;:::-;18554:112;18675:52;18720:6;18715:3;18710;18675:52;:::i;:::-;18394:339;18299:434;;;;;:::o;18753:355::-;18820:5;18869:3;18862:4;18854:6;18850:17;18846:27;18836:122;;18877:79;;:::i;:::-;18836:122;18987:6;18981:13;19012:90;19098:3;19090:6;19083:4;19075:6;19071:17;19012:90;:::i;:::-;19003:99;;18826:282;18753:355;;;;:::o;19114:524::-;19194:6;19243:2;19231:9;19222:7;19218:23;19214:32;19211:119;;;19249:79;;:::i;:::-;19211:119;19390:1;19379:9;19375:17;19369:24;19420:18;19412:6;19409:30;19406:117;;;19442:79;;:::i;:::-;19406:117;19547:74;19613:7;19604:6;19593:9;19589:22;19547:74;:::i;:::-;19537:84;;19340:291;19114:524;;;;:::o;19644:141::-;19693:4;19716:3;19708:11;;19739:3;19736:1;19729:14;19773:4;19770:1;19760:18;19752:26;;19644:141;;;:::o;19791:93::-;19828:6;19875:2;19870;19863:5;19859:14;19855:23;19845:33;;19791:93;;;:::o;19890:107::-;19934:8;19984:5;19978:4;19974:16;19953:37;;19890:107;;;;:::o;20003:393::-;20072:6;20122:1;20110:10;20106:18;20145:97;20175:66;20164:9;20145:97;:::i;:::-;20263:39;20293:8;20282:9;20263:39;:::i;:::-;20251:51;;20335:4;20331:9;20324:5;20320:21;20311:30;;20384:4;20374:8;20370:19;20363:5;20360:30;20350:40;;20079:317;;20003:393;;;;;:::o;20402:142::-;20452:9;20485:53;20503:34;20512:24;20530:5;20512:24;:::i;:::-;20503:34;:::i;:::-;20485:53;:::i;:::-;20472:66;;20402:142;;;:::o;20550:75::-;20593:3;20614:5;20607:12;;20550:75;;;:::o;20631:269::-;20741:39;20772:7;20741:39;:::i;:::-;20802:91;20851:41;20875:16;20851:41;:::i;:::-;20843:6;20836:4;20830:11;20802:91;:::i;:::-;20796:4;20789:105;20707:193;20631:269;;;:::o;20906:73::-;20951:3;20906:73;:::o;20985:189::-;21062:32;;:::i;:::-;21103:65;21161:6;21153;21147:4;21103:65;:::i;:::-;21038:136;20985:189;;:::o;21180:186::-;21240:120;21257:3;21250:5;21247:14;21240:120;;;21311:39;21348:1;21341:5;21311:39;:::i;:::-;21284:1;21277:5;21273:13;21264:22;;21240:120;;;21180:186;;:::o;21372:543::-;21473:2;21468:3;21465:11;21462:446;;;21507:38;21539:5;21507:38;:::i;:::-;21591:29;21609:10;21591:29;:::i;:::-;21581:8;21577:44;21774:2;21762:10;21759:18;21756:49;;;21795:8;21780:23;;21756:49;21818:80;21874:22;21892:3;21874:22;:::i;:::-;21864:8;21860:37;21847:11;21818:80;:::i;:::-;21477:431;;21462:446;21372:543;;;:::o;21921:117::-;21975:8;22025:5;22019:4;22015:16;21994:37;;21921:117;;;;:::o;22044:169::-;22088:6;22121:51;22169:1;22165:6;22157:5;22154:1;22150:13;22121:51;:::i;:::-;22117:56;22202:4;22196;22192:15;22182:25;;22095:118;22044:169;;;;:::o;22218:295::-;22294:4;22440:29;22465:3;22459:4;22440:29;:::i;:::-;22432:37;;22502:3;22499:1;22495:11;22489:4;22486:21;22478:29;;22218:295;;;;:::o;22518:1395::-;22635:37;22668:3;22635:37;:::i;:::-;22737:18;22729:6;22726:30;22723:56;;;22759:18;;:::i;:::-;22723:56;22803:38;22835:4;22829:11;22803:38;:::i;:::-;22888:67;22948:6;22940;22934:4;22888:67;:::i;:::-;22982:1;23006:4;22993:17;;23038:2;23030:6;23027:14;23055:1;23050:618;;;;23712:1;23729:6;23726:77;;;23778:9;23773:3;23769:19;23763:26;23754:35;;23726:77;23829:67;23889:6;23882:5;23829:67;:::i;:::-;23823:4;23816:81;23685:222;23020:887;;23050:618;23102:4;23098:9;23090:6;23086:22;23136:37;23168:4;23136:37;:::i;:::-;23195:1;23209:208;23223:7;23220:1;23217:14;23209:208;;;23302:9;23297:3;23293:19;23287:26;23279:6;23272:42;23353:1;23345:6;23341:14;23331:24;;23400:2;23389:9;23385:18;23372:31;;23246:4;23243:1;23239:12;23234:17;;23209:208;;;23445:6;23436:7;23433:19;23430:179;;;23503:9;23498:3;23494:19;23488:26;23546:48;23588:4;23580:6;23576:17;23565:9;23546:48;:::i;:::-;23538:6;23531:64;23453:156;23430:179;23655:1;23651;23643:6;23639:14;23635:22;23629:4;23622:36;23057:611;;;23020:887;;22610:1303;;;22518:1395;;:::o;23919:521::-;24082:4;24120:2;24109:9;24105:18;24097:26;;24133:71;24201:1;24190:9;24186:17;24177:6;24133:71;:::i;:::-;24214:66;24276:2;24265:9;24261:18;24252:6;24214:66;:::i;:::-;24327:9;24321:4;24317:20;24312:2;24301:9;24297:18;24290:48;24355:78;24428:4;24419:6;24355:78;:::i;:::-;24347:86;;23919:521;;;;;;:::o;24446:234::-;24586:34;24582:1;24574:6;24570:14;24563:58;24655:17;24650:2;24642:6;24638:15;24631:42;24446:234;:::o;24686:366::-;24828:3;24849:67;24913:2;24908:3;24849:67;:::i;:::-;24842:74;;24925:93;25014:3;24925:93;:::i;:::-;25043:2;25038:3;25034:12;25027:19;;24686:366;;;:::o;25058:419::-;25224:4;25262:2;25251:9;25247:18;25239:26;;25311:9;25305:4;25301:20;25297:1;25286:9;25282:17;25275:47;25339:131;25465:4;25339:131;:::i;:::-;25331:139;;25058:419;;;:::o;25483:191::-;25523:3;25542:20;25560:1;25542:20;:::i;:::-;25537:25;;25576:20;25594:1;25576:20;:::i;:::-;25571:25;;25619:1;25616;25612:9;25605:16;;25640:3;25637:1;25634:10;25631:36;;;25647:18;;:::i;:::-;25631:36;25483:191;;;;:::o;25680:332::-;25801:4;25839:2;25828:9;25824:18;25816:26;;25852:71;25920:1;25909:9;25905:17;25896:6;25852:71;:::i;:::-;25933:72;26001:2;25990:9;25986:18;25977:6;25933:72;:::i;:::-;25680:332;;;;;:::o;26018:224::-;26158:34;26154:1;26146:6;26142:14;26135:58;26227:7;26222:2;26214:6;26210:15;26203:32;26018:224;:::o;26248:366::-;26390:3;26411:67;26475:2;26470:3;26411:67;:::i;:::-;26404:74;;26487:93;26576:3;26487:93;:::i;:::-;26605:2;26600:3;26596:12;26589:19;;26248:366;;;:::o;26620:419::-;26786:4;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26620:419;;;:::o;27045:442::-;27194:4;27232:2;27221:9;27217:18;27209:26;;27245:71;27313:1;27302:9;27298:17;27289:6;27245:71;:::i;:::-;27326:72;27394:2;27383:9;27379:18;27370:6;27326:72;:::i;:::-;27408;27476:2;27465:9;27461:18;27452:6;27408:72;:::i;:::-;27045:442;;;;;;:::o;27493:::-;27642:4;27680:2;27669:9;27665:18;27657:26;;27693:71;27761:1;27750:9;27746:17;27737:6;27693:71;:::i;:::-;27774:72;27842:2;27831:9;27827:18;27818:6;27774:72;:::i;:::-;27856;27924:2;27913:9;27909:18;27900:6;27856:72;:::i;:::-;27493:442;;;;;;:::o;27941:223::-;28081:34;28077:1;28069:6;28065:14;28058:58;28150:6;28145:2;28137:6;28133:15;28126:31;27941:223;:::o;28170:366::-;28312:3;28333:67;28397:2;28392:3;28333:67;:::i;:::-;28326:74;;28409:93;28498:3;28409:93;:::i;:::-;28527:2;28522:3;28518:12;28511:19;;28170:366;;;:::o;28542:419::-;28708:4;28746:2;28735:9;28731:18;28723:26;;28795:9;28789:4;28785:20;28781:1;28770:9;28766:17;28759:47;28823:131;28949:4;28823:131;:::i;:::-;28815:139;;28542:419;;;:::o;28967:221::-;29107:34;29103:1;29095:6;29091:14;29084:58;29176:4;29171:2;29163:6;29159:15;29152:29;28967:221;:::o;29194:366::-;29336:3;29357:67;29421:2;29416:3;29357:67;:::i;:::-;29350:74;;29433:93;29522:3;29433:93;:::i;:::-;29551:2;29546:3;29542:12;29535:19;;29194:366;;;:::o;29566:419::-;29732:4;29770:2;29759:9;29755:18;29747:26;;29819:9;29813:4;29809:20;29805:1;29794:9;29790:17;29783:47;29847:131;29973:4;29847:131;:::i;:::-;29839:139;;29566:419;;;:::o;29991:181::-;30131:33;30127:1;30119:6;30115:14;30108:57;29991:181;:::o;30178:366::-;30320:3;30341:67;30405:2;30400:3;30341:67;:::i;:::-;30334:74;;30417:93;30506:3;30417:93;:::i;:::-;30535:2;30530:3;30526:12;30519:19;;30178:366;;;:::o;30550:419::-;30716:4;30754:2;30743:9;30739:18;30731:26;;30803:9;30797:4;30793:20;30789:1;30778:9;30774:17;30767:47;30831:131;30957:4;30831:131;:::i;:::-;30823:139;;30550:419;;;:::o;30975:220::-;31115:34;31111:1;31103:6;31099:14;31092:58;31184:3;31179:2;31171:6;31167:15;31160:28;30975:220;:::o;31201:366::-;31343:3;31364:67;31428:2;31423:3;31364:67;:::i;:::-;31357:74;;31440:93;31529:3;31440:93;:::i;:::-;31558:2;31553:3;31549:12;31542:19;;31201:366;;;:::o;31573:419::-;31739:4;31777:2;31766:9;31762:18;31754:26;;31826:9;31820:4;31816:20;31812:1;31801:9;31797:17;31790:47;31854:131;31980:4;31854:131;:::i;:::-;31846:139;;31573:419;;;:::o;31998:221::-;32138:34;32134:1;32126:6;32122:14;32115:58;32207:4;32202:2;32194:6;32190:15;32183:29;31998:221;:::o;32225:366::-;32367:3;32388:67;32452:2;32447:3;32388:67;:::i;:::-;32381:74;;32464:93;32553:3;32464:93;:::i;:::-;32582:2;32577:3;32573:12;32566:19;;32225:366;;;:::o;32597:419::-;32763:4;32801:2;32790:9;32786:18;32778:26;;32850:9;32844:4;32840:20;32836:1;32825:9;32821:17;32814:47;32878:131;33004:4;32878:131;:::i;:::-;32870:139;;32597:419;;;:::o;33022:224::-;33162:34;33158:1;33150:6;33146:14;33139:58;33231:7;33226:2;33218:6;33214:15;33207:32;33022:224;:::o;33252:366::-;33394:3;33415:67;33479:2;33474:3;33415:67;:::i;:::-;33408:74;;33491:93;33580:3;33491:93;:::i;:::-;33609:2;33604:3;33600:12;33593:19;;33252:366;;;:::o;33624:419::-;33790:4;33828:2;33817:9;33813:18;33805:26;;33877:9;33871:4;33867:20;33863:1;33852:9;33848:17;33841:47;33905:131;34031:4;33905:131;:::i;:::-;33897:139;;33624:419;;;:::o;34049:222::-;34189:34;34185:1;34177:6;34173:14;34166:58;34258:5;34253:2;34245:6;34241:15;34234:30;34049:222;:::o;34277:366::-;34419:3;34440:67;34504:2;34499:3;34440:67;:::i;:::-;34433:74;;34516:93;34605:3;34516:93;:::i;:::-;34634:2;34629:3;34625:12;34618:19;;34277:366;;;:::o;34649:419::-;34815:4;34853:2;34842:9;34838:18;34830:26;;34902:9;34896:4;34892:20;34888:1;34877:9;34873:17;34866:47;34930:131;35056:4;34930:131;:::i;:::-;34922:139;;34649:419;;;:::o;35074:225::-;35214:34;35210:1;35202:6;35198:14;35191:58;35283:8;35278:2;35270:6;35266:15;35259:33;35074:225;:::o;35305:366::-;35447:3;35468:67;35532:2;35527:3;35468:67;:::i;:::-;35461:74;;35544:93;35633:3;35544:93;:::i;:::-;35662:2;35657:3;35653:12;35646:19;;35305:366;;;:::o;35677:419::-;35843:4;35881:2;35870:9;35866:18;35858:26;;35930:9;35924:4;35920:20;35916:1;35905:9;35901:17;35894:47;35958:131;36084:4;35958:131;:::i;:::-;35950:139;;35677:419;;;:::o;36102:148::-;36204:11;36241:3;36226:18;;36102:148;;;;:::o;36256:173::-;36396:25;36392:1;36384:6;36380:14;36373:49;36256:173;:::o;36435:402::-;36595:3;36616:85;36698:2;36693:3;36616:85;:::i;:::-;36609:92;;36710:93;36799:3;36710:93;:::i;:::-;36828:2;36823:3;36819:12;36812:19;;36435:402;;;:::o;36843:390::-;36949:3;36977:39;37010:5;36977:39;:::i;:::-;37032:89;37114:6;37109:3;37032:89;:::i;:::-;37025:96;;37130:65;37188:6;37183:3;37176:4;37169:5;37165:16;37130:65;:::i;:::-;37220:6;37215:3;37211:16;37204:23;;36953:280;36843:390;;;;:::o;37239:167::-;37379:19;37375:1;37367:6;37363:14;37356:43;37239:167;:::o;37412:402::-;37572:3;37593:85;37675:2;37670:3;37593:85;:::i;:::-;37586:92;;37687:93;37776:3;37687:93;:::i;:::-;37805:2;37800:3;37796:12;37789:19;;37412:402;;;:::o;37820:967::-;38202:3;38224:148;38368:3;38224:148;:::i;:::-;38217:155;;38389:95;38480:3;38471:6;38389:95;:::i;:::-;38382:102;;38501:148;38645:3;38501:148;:::i;:::-;38494:155;;38666:95;38757:3;38748:6;38666:95;:::i;:::-;38659:102;;38778:3;38771:10;;37820:967;;;;;:::o;38793:179::-;38933:31;38929:1;38921:6;38917:14;38910:55;38793:179;:::o;38978:366::-;39120:3;39141:67;39205:2;39200:3;39141:67;:::i;:::-;39134:74;;39217:93;39306:3;39217:93;:::i;:::-;39335:2;39330:3;39326:12;39319:19;;38978:366;;;:::o;39350:419::-;39516:4;39554:2;39543:9;39539:18;39531:26;;39603:9;39597:4;39593:20;39589:1;39578:9;39574:17;39567:47;39631:131;39757:4;39631:131;:::i;:::-;39623:139;;39350:419;;;:::o;39775:170::-;39915:22;39911:1;39903:6;39899:14;39892:46;39775:170;:::o;39951:366::-;40093:3;40114:67;40178:2;40173:3;40114:67;:::i;:::-;40107:74;;40190:93;40279:3;40190:93;:::i;:::-;40308:2;40303:3;40299:12;40292:19;;39951:366;;;:::o;40323:419::-;40489:4;40527:2;40516:9;40512:18;40504:26;;40576:9;40570:4;40566:20;40562:1;40551:9;40547:17;40540:47;40604:131;40730:4;40604:131;:::i;:::-;40596:139;;40323:419;;;:::o;40748:166::-;40888:18;40884:1;40876:6;40872:14;40865:42;40748:166;:::o;40920:366::-;41062:3;41083:67;41147:2;41142:3;41083:67;:::i;:::-;41076:74;;41159:93;41248:3;41159:93;:::i;:::-;41277:2;41272:3;41268:12;41261:19;;40920:366;;;:::o;41292:419::-;41458:4;41496:2;41485:9;41481:18;41473:26;;41545:9;41539:4;41535:20;41531:1;41520:9;41516:17;41509:47;41573:131;41699:4;41573:131;:::i;:::-;41565:139;;41292:419;;;:::o;41717:410::-;41757:7;41780:20;41798:1;41780:20;:::i;:::-;41775:25;;41814:20;41832:1;41814:20;:::i;:::-;41809:25;;41869:1;41866;41862:9;41891:30;41909:11;41891:30;:::i;:::-;41880:41;;42070:1;42061:7;42057:15;42054:1;42051:22;42031:1;42024:9;42004:83;41981:139;;42100:18;;:::i;:::-;41981:139;41765:362;41717:410;;;;:::o;42133:180::-;42181:77;42178:1;42171:88;42278:4;42275:1;42268:15;42302:4;42299:1;42292:15;42319:171;42358:3;42381:24;42399:5;42381:24;:::i;:::-;42372:33;;42427:4;42420:5;42417:15;42414:41;;42435:18;;:::i;:::-;42414:41;42482:1;42475:5;42471:13;42464:20;;42319:171;;;:::o;42496:182::-;42636:34;42632:1;42624:6;42620:14;42613:58;42496:182;:::o;42684:366::-;42826:3;42847:67;42911:2;42906:3;42847:67;:::i;:::-;42840:74;;42923:93;43012:3;42923:93;:::i;:::-;43041:2;43036:3;43032:12;43025:19;;42684:366;;;:::o;43056:419::-;43222:4;43260:2;43249:9;43245:18;43237:26;;43309:9;43303:4;43299:20;43295:1;43284:9;43280:17;43273:47;43337:131;43463:4;43337:131;:::i;:::-;43329:139;;43056:419;;;:::o
Swarm Source
ipfs://948ff0f599f9b35609867f9adf3d9785c1cf3847beea36e28cac405da60b48ef
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.