Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
DEXPay
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-02-19 */ // Sources flattened with hardhat v2.22.17 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 IERC165Upgradeable { /** * @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-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 MathUpgradeable { 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-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 SignedMathUpgradeable { /** * @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-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.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(SignedMathUpgradeable.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, MathUpgradeable.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-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { 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); _; } function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 PausableUpgradeable is Initializable, ContextUpgradeable { /** * @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. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _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()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 IERC20Upgradeable { /** * @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-upgradeable/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20PermitUpgradeable token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token)); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File contracts/DEXPay.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.9; // Custom errors error INSUFFICIENT_ERR(); error NON_SUPPORTED_TOKEN(); error NULL_ADDRESS_ERR(); error ZERO_DIGIT_ERR(); error UNAUTHORIZED_ERR(); error ALREADY_COMPLETED_ERR(); error SIGNATURE_ERR(); error EXPIRED_ERR(); error NONCE_ERR(); error ID_ERR(); // Struct to store escrow vault entry details struct EscrowVaultEntry { address user; address merchant; bool completed; address tokenAddress; bool outcome; bool isbuy; uint256 amount; } struct VerifiedRequest { address from; address to; uint256 nonce; uint256 validUntil; } interface IEIP2612 { function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; } /** * Smart Contract for DEXPay, this contains logics for locking, unlocking and cancelling Tokens for trade */ contract DEXPay is ContextUpgradeable, AccessControlUpgradeable, PausableUpgradeable, UUPSUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; using ECDSAUpgradeable for bytes32; using AddressUpgradeable for address payable; string public constant REQUEST_TYPE = "address from,address to,uint256 nonce,uint256 validUntil"; string public constant EIP712_DOMAIN = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"; bytes32 public constant ADMIN = keccak256("ADMIN"); bytes32 public constant EXECUTOR = keccak256("EXECUTOR"); bytes32 public constant VERIFIED_SIGNER = keccak256("VERIFIED_SIGNER"); bytes32 public domainSeperator; bytes32 public requestType; address payable public paymentWallet; // escrow id to entry info mapping(uint256 => EscrowVaultEntry) public escrowVault; // supported token address to merchant to amount in escrow mapping(address => mapping(address => uint256)) redundant; // supported token address to merchant to amount in escrow mapping(address => mapping(address => uint256)) public sellLockVaults; // supported token address to whitelist status mapping(address => bool) public whitelists; mapping(address => uint256) public nonces; // token to claimable fees mapping(address => uint256) public claimableFees; enum Action { APPROVED, CREATED, UPDATED, CANCELLED, UNLOCKED } // supported token address to merchant to amount in escrow mapping(address => mapping(address => uint256)) public sellLockPromises; event LockVaultEntryUpdate( address indexed tokenAddress, address indexed user, uint256 balance, uint256 amount, bool isBuy, bool locked, Action action ); event EscrowVaultEntryUpdate( uint256 id, address indexed tokenAddress, address indexed merchant, address indexed user, uint256 amount, uint256 fee, bool isbuy, Action action ); event SetPaymentWallet(address indexed newPaymentWallet); event ClaimFee(address indexed token, uint256 balance); event Whitelist(address indexed tokenAddresses, bool isWhitelisted); function initialize( address multisig, address initAdmin, address initExecutor, address initVerifiedSigner, address payable _paymentWallet ) external initializer { if ( _paymentWallet == address(0) || initVerifiedSigner == address(0) || multisig == address(0) || initAdmin == address(0) || initExecutor == address(0) ) revert NULL_ADDRESS_ERR(); __Context_init(); __Pausable_init(); __AccessControl_init(); __UUPSUpgradeable_init(); _grantRole(DEFAULT_ADMIN_ROLE, multisig); _grantRole(ADMIN, multisig); _grantRole(ADMIN, initAdmin); _grantRole(EXECUTOR, initExecutor); _grantRole(VERIFIED_SIGNER, initVerifiedSigner); _setRoleAdmin(DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_ROLE); _setRoleAdmin(VERIFIED_SIGNER, DEFAULT_ADMIN_ROLE); _setRoleAdmin(EXECUTOR, DEFAULT_ADMIN_ROLE); _setRoleAdmin(ADMIN, DEFAULT_ADMIN_ROLE); paymentWallet = _paymentWallet; // whitelist native whitelists[address(0)] = true; uint256 chainId; assembly { chainId := chainid() } domainSeperator = keccak256( abi.encode( keccak256(bytes(EIP712_DOMAIN)), keccak256(bytes(name())), keccak256(bytes(version())), chainId, address(this) ) ); requestType = keccak256(bytes(string(abi.encodePacked("VerifiedRequest(", REQUEST_TYPE, ")")))); } modifier nonZeroAddr(address addr) { _nonZeroAddr(addr); _; } modifier nonZeroDigit(uint256 digit) { _nonZeroDigit(digit); _; } modifier onlyUnusedId(uint256 id) { _onlyUnusedId(id); _; } modifier onlyUsedId(uint256 id) { _onlyUsedId(id); _; } modifier onlyWhitelisted(address addr) { _onlyWhitelisted(addr); _; } modifier whenIncomplete(uint256 id) { _whenIncomplete(id); _; } modifier viableFee(uint256 fee, uint256 amount) { _viableFee(fee, amount); _; } modifier onlyVerified(VerifiedRequest memory verifiedRequest, bytes calldata signature, address user) { _verifyReq(verifiedRequest, signature, user, user); _; } function pause() external onlyRole(ADMIN) { _pause(); } function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } function name() public pure returns (string memory) { return "DEXP2P"; } function version() public pure returns (string memory) { return "2"; } function setPaymentWallet(address payable newPaymentWallet) external onlyRole(DEFAULT_ADMIN_ROLE) nonZeroAddr(newPaymentWallet) { if (newPaymentWallet == address(0)) revert NULL_ADDRESS_ERR(); paymentWallet = newPaymentWallet; emit SetPaymentWallet(newPaymentWallet); } function whitelist(address[] calldata addrs, bool _whitelist) external onlyRole(DEFAULT_ADMIN_ROLE) { uint256 len = addrs.length; address addr; for (uint256 i; i < len; i++) { addr = addrs[i]; whitelists[addr] = _whitelist; emit Whitelist(addr, _whitelist); } } function claimFee(address token) external onlyRole(ADMIN) whenNotPaused { uint256 balance = claimableFees[token]; emit ClaimFee(token, balance); if (balance != 0) { _handleTransfer(token, paymentWallet, balance); } } function sellEscrowLock( VerifiedRequest calldata verifiedRequest, bytes calldata signature, bytes calldata tokenPermitSignature, address tokenAddress, uint256 amount, uint256 feeAmount, bool lock ) external onlyRole(EXECUTOR) whenNotPaused onlyWhitelisted(tokenAddress) returns (bool) { _verifySingleReq(verifiedRequest, signature); address from = verifiedRequest.from; if (tokenPermitSignature.length != 0) { _handlePermit(tokenPermitSignature, tokenAddress, from); } if (lock) IERC20Upgradeable(tokenAddress).safeTransferFrom(from, address(this), amount); else if (feeAmount != 0) IERC20Upgradeable(tokenAddress).safeTransferFrom(from, address(this), feeAmount); return _sellEscrowLock(tokenAddress, from, amount, feeAmount, lock); } function sellEscrowLockNative(VerifiedRequest calldata verifiedRequest, bytes calldata signature, uint256 feeAmount) external payable whenNotPaused onlyVerified(verifiedRequest, signature, _msgSender()) returns (bool) { return _sellEscrowLock( address(0), // native token address _msgSender(), msg.value, feeAmount, true ); } function sellEscrowCancel( VerifiedRequest calldata verifiedRequest, bytes calldata signature, address merchant, address tokenAddress, uint256 amount, bool locked ) external onlyRole(EXECUTOR) whenNotPaused onlyWhitelisted(tokenAddress) nonZeroDigit(amount) returns (bool) { _verifySingleReq(verifiedRequest, signature); uint256 balance = locked ? sellLockVaults[tokenAddress][merchant] : sellLockPromises[tokenAddress][merchant]; if (balance < amount) revert INSUFFICIENT_ERR(); unchecked { balance = balance - amount; } emit LockVaultEntryUpdate(tokenAddress, merchant, balance, amount, false, locked, Action.CANCELLED); if (locked) { sellLockVaults[tokenAddress][merchant] = balance; _handleTransfer(tokenAddress, payable(merchant), amount); } else { sellLockPromises[tokenAddress][merchant] = balance; } return true; } function buyEscrowApprove( VerifiedRequest memory verifiedRequest, bytes calldata signature, address merchant, address user, address tokenAddress, uint256 id, uint256 amount, uint256 fee, bool locked ) external onlyRole(EXECUTOR) whenNotPaused onlyUnusedId(id) viableFee(fee, amount) { _verifyDoubleReq(verifiedRequest, signature, merchant, user); _buy(tokenAddress, merchant, user, id, amount, locked); emit EscrowVaultEntryUpdate(id, tokenAddress, merchant, user, amount, fee, true, Action.APPROVED); uint256 bal = claimableFees[tokenAddress]; unchecked { amount = amount - fee; if (bal != 0) { claimableFees[tokenAddress] = 0; fee = fee + bal; } } _handleTransfer(tokenAddress, paymentWallet, fee); _handleTransfer(tokenAddress, payable(user), amount); } function _buy(address tokenAddress, address merchant, address user, uint256 id, uint256 amount, bool locked) private onlyWhitelisted(tokenAddress) onlyUnusedId(id) nonZeroDigit(amount) nonZeroAddr(merchant) { // lock the amount + fee from the merchant's balance _sellUnlock(tokenAddress, merchant, amount, locked); escrowVault[id] = EscrowVaultEntry(user, merchant, true, tokenAddress, true, true, amount); } function sell( VerifiedRequest memory verifiedRequest, bytes calldata signature, bytes calldata tokenPermitSignature, address tokenAddress, address merchant, uint256 id, uint256 amount, uint256 fee ) external onlyRole(EXECUTOR) whenNotPaused onlyUnusedId(id) onlyWhitelisted(tokenAddress) nonZeroDigit(amount) { _verifySingleReq(verifiedRequest, signature); _viableFee(fee, amount); address from = verifiedRequest.from; if (tokenPermitSignature.length != 0) { _handlePermit(tokenPermitSignature, tokenAddress, from); } IERC20Upgradeable(tokenAddress).safeTransferFrom(from, address(this), amount); _sell(tokenAddress, from, merchant, id, amount, fee); } function sellNative( VerifiedRequest memory verifiedRequest, bytes calldata signature, address merchant, uint256 id, uint256 fee ) external payable whenNotPaused onlyVerified(verifiedRequest, signature, _msgSender()) onlyUnusedId(id) nonZeroDigit(msg.value) { _viableFee(fee, msg.value); _sell(address(0), _msgSender(), merchant, id, msg.value, fee); } function sellEscrowApprove( VerifiedRequest memory verifiedRequest, bytes calldata signature, uint256 id, address merchant, bool approve, uint256 fee ) external onlyRole(EXECUTOR) whenNotPaused onlyUsedId(id) whenIncomplete(id) { EscrowVaultEntry memory eve = escrowVault[id]; _verifyDoubleReq(verifiedRequest, signature, eve.merchant, eve.user); EscrowVaultEntry storage eve_ = escrowVault[id]; if (approve) { eve_.outcome = true; eve_.completed = true; uint256 amount = eve.amount - fee; _handleTransfer(eve.tokenAddress, payable(eve.merchant), amount); uint256 accruedFee = claimableFees[eve.tokenAddress]; // collect fee if (accruedFee != 0) { claimableFees[eve.tokenAddress] = 0; _handleTransfer(eve.tokenAddress, paymentWallet, accruedFee + fee); } emit EscrowVaultEntryUpdate(id, eve.tokenAddress, eve.merchant, eve.user, amount, 0, false, Action.APPROVED); } else { if (merchant != address(0)) { eve_.merchant = merchant; emit EscrowVaultEntryUpdate( id, eve.tokenAddress, merchant, eve.user, eve.amount, 0, false, Action.UPDATED ); } else { emit EscrowVaultEntryUpdate( id, eve.tokenAddress, eve.merchant, eve.user, eve.amount, 0, false, Action.CANCELLED ); eve_.completed = true; // return tokens to user _handleTransfer(eve.tokenAddress, payable(eve.user), eve.amount); } } } function _sell(address tokenAddress, address user, address merchant, uint256 id, uint256 amount, uint256 fee) private { uint256 amountFinal; unchecked { claimableFees[tokenAddress] = claimableFees[tokenAddress] + fee; } amountFinal = amount - fee; escrowVault[id] = EscrowVaultEntry(user, merchant, false, tokenAddress, false, false, amountFinal); emit EscrowVaultEntryUpdate(id, tokenAddress, merchant, user, amountFinal, fee, false, Action.CREATED); } function _handleTransfer(address token, address payable to, uint256 amount) private { if (token == address(0)) { to.sendValue(amount); } else { IERC20Upgradeable(token).safeTransfer(to, amount); } } function _sellEscrowLock(address tokenAddress, address merchant, uint256 amount, uint256 feeAmount, bool lock) private nonZeroDigit(amount) returns (bool) { if (amount <= feeAmount) revert INSUFFICIENT_ERR(); uint256 balance; unchecked { uint256 adjustedAmount = amount; if (feeAmount != 0) { claimableFees[tokenAddress] = claimableFees[tokenAddress] + feeAmount; adjustedAmount = amount - feeAmount; } if (lock) { sellLockVaults[tokenAddress][merchant] = sellLockVaults[tokenAddress][merchant] + adjustedAmount; balance = sellLockVaults[tokenAddress][merchant]; } else { sellLockPromises[tokenAddress][merchant] = sellLockPromises[tokenAddress][merchant] + adjustedAmount; balance = sellLockPromises[tokenAddress][merchant]; } } emit LockVaultEntryUpdate(tokenAddress, merchant, balance, amount, false, lock, Action.UPDATED); return true; } function _nonZeroAddr(address addr) private pure { if (addr == address(0)) revert NULL_ADDRESS_ERR(); } function _nonZeroDigit(uint256 digit) private pure { if (digit == 0) revert ZERO_DIGIT_ERR(); } function _onlyUnusedId(uint256 id) private view { EscrowVaultEntry memory eve = escrowVault[id]; if (eve.user != address(0)) revert ID_ERR(); } function _onlyUsedId(uint256 id) private view { EscrowVaultEntry memory eve = escrowVault[id]; if (eve.user == address(0)) revert ID_ERR(); } function _onlyWhitelisted(address addr) private view { if (!whitelists[addr]) revert NON_SUPPORTED_TOKEN(); } function _whenIncomplete(uint256 id) private view { EscrowVaultEntry memory eve = escrowVault[id]; if (eve.completed) revert ALREADY_COMPLETED_ERR(); } /** * this function is a to be used by the internal escrow function to unlock some funds into the escrow to be used for trade. * * this is for the unlocking of sell locks * * @param merchant the merchant lock to be unlocked * @param amount the amount to be unlocked excluding the fee charge * @param tokenAddress - the address of the ERC20 token */ function _sellUnlock(address tokenAddress, address merchant, uint256 amount, bool locked) private { uint256 balance; if (locked) { balance = sellLockVaults[tokenAddress][merchant]; if (balance < amount) revert INSUFFICIENT_ERR(); unchecked { balance = balance - amount; } sellLockVaults[tokenAddress][merchant] = balance; } else { if (tokenAddress == address(0)) revert NON_SUPPORTED_TOKEN(); balance = sellLockPromises[tokenAddress][merchant]; if (balance < amount) revert INSUFFICIENT_ERR(); IERC20Upgradeable(tokenAddress).safeTransferFrom(merchant, address(this), amount); unchecked { balance = balance - amount; } sellLockPromises[tokenAddress][merchant] = balance; } emit LockVaultEntryUpdate(tokenAddress, merchant, balance, amount, true, locked, Action.UNLOCKED); } function _verifyReq( VerifiedRequest memory verifiedRequest, bytes calldata signature, address merchant, address user ) private { uint256 nonce = nonces[verifiedRequest.to]; if (verifiedRequest.nonce != nonce) revert NONCE_ERR(); if (verifiedRequest.validUntil < block.timestamp) revert EXPIRED_ERR(); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeperator, keccak256( abi.encodePacked( requestType, uint256(uint160(verifiedRequest.from)), uint256(uint160(verifiedRequest.to)), verifiedRequest.nonce, verifiedRequest.validUntil ) ) ) ); if (verifiedRequest.to != merchant && verifiedRequest.to != user) { revert SIGNATURE_ERR(); } if (!hasRole(VERIFIED_SIGNER, digest.recover(signature))) { revert SIGNATURE_ERR(); } unchecked { nonces[verifiedRequest.to]++; } } function _verifyDoubleReq( VerifiedRequest memory verifiedRequest, bytes calldata signature, address merchant, address user ) private { if (verifiedRequest.from != merchant) { if (verifiedRequest.from != user) revert UNAUTHORIZED_ERR(); if (verifiedRequest.to != merchant) revert SIGNATURE_ERR(); } else { if (verifiedRequest.to != user) revert SIGNATURE_ERR(); } uint256 nonce = nonces[verifiedRequest.from]; if (verifiedRequest.nonce != nonce) revert NONCE_ERR(); if (verifiedRequest.validUntil < block.timestamp) revert EXPIRED_ERR(); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeperator, keccak256( abi.encodePacked( requestType, uint256(uint160(verifiedRequest.from)), uint256(uint160(verifiedRequest.to)), verifiedRequest.nonce, verifiedRequest.validUntil ) ) ) ); if (digest.recover(signature) != verifiedRequest.from) { revert SIGNATURE_ERR(); } unchecked { nonces[verifiedRequest.from]++; } } function _verifySingleReq(VerifiedRequest memory verifiedRequest, bytes calldata signature) private { uint256 nonce = nonces[verifiedRequest.from]; if (verifiedRequest.nonce != nonce) revert NONCE_ERR(); if (verifiedRequest.validUntil < block.timestamp) revert EXPIRED_ERR(); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeperator, keccak256( abi.encodePacked( requestType, uint256(uint160(verifiedRequest.from)), uint256(uint160(_msgSender())), verifiedRequest.nonce, verifiedRequest.validUntil ) ) ) ); if (digest.recover(signature) != verifiedRequest.from) { revert SIGNATURE_ERR(); } unchecked { nonces[verifiedRequest.from]++; } } function _viableFee(uint256 fee, uint256 amount) private pure { if (fee == 0 || fee >= amount) revert INSUFFICIENT_ERR(); } function _handlePermit(bytes calldata tokenPermitSignature, address tokenAddress, address from) private { (address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) = abi.decode(tokenPermitSignature, (address, address, uint256, uint256, uint8, bytes32, bytes32)); if (spender != address(this) || owner != from) { revert SIGNATURE_ERR(); } IEIP2612(tokenAddress).permit(owner, spender, value, deadline, v, r, s); } function _msgSender() internal view override(ContextUpgradeable) returns (address sender) { return ContextUpgradeable._msgSender(); } function _msgData() internal view override(ContextUpgradeable) returns (bytes calldata) { return ContextUpgradeable._msgData(); } ///@dev required by the OZ UUPS module function _authorizeUpgrade(address) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ALREADY_COMPLETED_ERR","type":"error"},{"inputs":[],"name":"EXPIRED_ERR","type":"error"},{"inputs":[],"name":"ID_ERR","type":"error"},{"inputs":[],"name":"INSUFFICIENT_ERR","type":"error"},{"inputs":[],"name":"NONCE_ERR","type":"error"},{"inputs":[],"name":"NON_SUPPORTED_TOKEN","type":"error"},{"inputs":[],"name":"NULL_ADDRESS_ERR","type":"error"},{"inputs":[],"name":"SIGNATURE_ERR","type":"error"},{"inputs":[],"name":"UNAUTHORIZED_ERR","type":"error"},{"inputs":[],"name":"ZERO_DIGIT_ERR","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"merchant","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isbuy","type":"bool"},{"indexed":false,"internalType":"enum DEXPay.Action","name":"action","type":"uint8"}],"name":"EscrowVaultEntryUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":false,"internalType":"bool","name":"locked","type":"bool"},{"indexed":false,"internalType":"enum DEXPay.Action","name":"action","type":"uint8"}],"name":"LockVaultEntryUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"newPaymentWallet","type":"address"}],"name":"SetPaymentWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddresses","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"Whitelist","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_TYPE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERIFIED_SIGNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"}],"name":"buyEscrowApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"escrowVault","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"outcome","type":"bool"},{"internalType":"bool","name":"isbuy","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"},{"internalType":"address","name":"initAdmin","type":"address"},{"internalType":"address","name":"initExecutor","type":"address"},{"internalType":"address","name":"initVerifiedSigner","type":"address"},{"internalType":"address payable","name":"_paymentWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestType","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"tokenPermitSignature","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"bool","name":"approve","type":"bool"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"sellEscrowApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"}],"name":"sellEscrowCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"tokenPermitSignature","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"sellEscrowLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"sellEscrowLockNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"sellLockPromises","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"sellLockVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct VerifiedRequest","name":"verifiedRequest","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"merchant","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"sellNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPaymentWallet","type":"address"}],"name":"setPaymentWallet","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b506080516144f461004c60003960008181610f2901528181610f6901528181611070015281816110b0015261113f01526144f46000f3fe60806040526004361061023b5760003560e01c806352d1902d1161012e578063a217fddf116100ab578063e1b11da41161006f578063e1b11da41461078a578063e32204dd1461079f578063e41c9ce7146107d8578063e92263b1146107f8578063fd6cb6131461080d57600080fd5b8063a217fddf146106e5578063b0bddb87146106fa578063cb73ac561461071a578063cd11600814610731578063d547741f1461076a57600080fd5b80636ebc51e1116100f25780636ebc51e1146106345780637e0b2492146106545780637ecebe00146106825780638456cb59146106b057806391d14854146106c557600080fd5b806352d1902d1461059b57806354fd4d50146105b05780635c975abb146105da5780635f8a7c4e146105f2578063630dc7cb1461061257600080fd5b80632a0acc6a116101bc5780633659cfe6116101805780633659cfe6146105075780633f4ba83a14610527578063442ffd2f1461053c57806349c7dfa01461054f5780634f1ef2861461058857600080fd5b80632a0acc6a1461047b5780632af69b151461049d5780632f2ff15d146104b05780632ff36969146104d057806336568abe146104e757600080fd5b80631095cad2116102035780631095cad21461031f5780631459457a1461033f5780631e7be2101461035f578063248a9ca31461039057806324ead40b146103c057600080fd5b8063018a5ae91461024057806301b38af51461027557806301ffc9a71461029757806304b208fa146102b757806306fdde03146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b3660046137e2565b61082d565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061029561029036600461389e565b6108ee565b005b3480156102a357600080fd5b506102606102b2366004613923565b6109af565b3480156102c357600080fd5b506102d960008051602061436e83398151915281565b60405190815260200161026c565b3480156102f357600080fd5b5060408051808201909152600681526504445585032560d41b60208201525b60405161026c9190613979565b34801561032b57600080fd5b5061029561033a366004613a69565b6109e6565b34801561034b57600080fd5b5061029561035a366004613b30565b610a81565b34801561036b57600080fd5b5061026061037a366004613ba1565b6101336020526000908152604090205460ff1681565b34801561039c57600080fd5b506102d96103ab366004613bbe565b60009081526065602052604090206001015490565b3480156103cc57600080fd5b506104306103db366004613bbe565b6101306020526000908152604090208054600182015460028301546003909301546001600160a01b03928316938284169360ff600160a01b9485900481169491831693918304811692600160a81b9004169087565b604080516001600160a01b0398891681529688166020880152941515948601949094529490911660608401521515608083015291151560a082015260c081019190915260e00161026c565b34801561048757600080fd5b506102d960008051602061449f83398151915281565b6102606104ab366004613bd7565b610e31565b3480156104bc57600080fd5b506102956104cb366004613c31565b610e76565b3480156104dc57600080fd5b506102d961012e5481565b3480156104f357600080fd5b50610295610502366004613c31565b610ea0565b34801561051357600080fd5b50610295610522366004613ba1565b610f1e565b34801561053357600080fd5b50610295610ffe565b61029561054a366004613c61565b611011565b34801561055b57600080fd5b506102d961056a366004613cda565b61013260209081526000928352604080842090915290825290205481565b610295610596366004613d08565b611065565b3480156105a757600080fd5b506102d9611132565b3480156105bc57600080fd5b506040805180820190915260018152601960f91b6020820152610312565b3480156105e657600080fd5b5060975460ff16610260565b3480156105fe57600080fd5b5061026061060d366004613daf565b6111e5565b34801561061e57600080fd5b506102d960008051602061445883398151915281565b34801561064057600080fd5b5061029561064f366004613ba1565b611387565b34801561066057600080fd5b506102d961066f366004613ba1565b6101356020526000908152604090205481565b34801561068e57600080fd5b506102d961069d366004613ba1565b6101346020526000908152604090205481565b3480156106bc57600080fd5b50610295611417565b3480156106d157600080fd5b506102606106e0366004613c31565b611437565b3480156106f157600080fd5b506102d9600081565b34801561070657600080fd5b50610295610715366004613e48565b611462565b34801561072657600080fd5b506102d961012d5481565b34801561073d57600080fd5b506102d961074c366004613cda565b61013660209081526000928352604080842090915290825290205481565b34801561077657600080fd5b50610295610785366004613c31565b61174f565b34801561079657600080fd5b50610312611774565b3480156107ab57600080fd5b5061012f546107c0906001600160a01b031681565b6040516001600160a01b03909116815260200161026c565b3480156107e457600080fd5b506102956107f3366004613ed8565b611790565b34801561080457600080fd5b50610312611896565b34801561081957600080fd5b50610295610828366004613ba1565b6118b2565b60006000805160206144588339815191526108478161193b565b61084f611945565b856108598161198d565b61087261086b368e90038e018e613f99565b8c8c6119c7565b600061088160208e018e613ba1565b90508815610895576108958a8a8a84611b6d565b84156108b5576108b06001600160a01b03891682308a611c64565b6108d0565b85156108d0576108d06001600160a01b038916823089611c64565b6108dd8882898989611cd5565b9d9c50505050505050505050505050565b60006108f98161193b565b826000805b828110156109a65786868281811061091857610918613fb5565b905060200201602081019061092d9190613ba1565b6001600160a01b0381166000818152610133602052604090819020805489151560ff1990911617905551919350907f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d9061098c90881515815260200190565b60405180910390a28061099e81613fe1565b9150506108fe565b50505050505050565b60006001600160e01b03198216637965db0b60e01b14806109e057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206144588339815191526109fe8161193b565b610a06611945565b83610a1081611dfe565b86610a1a8161198d565b84610a2481611e9f565b610a2f8e8e8e6119c7565b610a398587611ebd565b8d518a15610a4d57610a4d8c8c8c84611b6d565b610a626001600160a01b038b1682308a611c64565b610a708a828b8b8b8b611ee8565b505050505050505050505050505050565b600054610100900460ff1615808015610aa15750600054600160ff909116105b80610abb5750303b158015610abb575060005460ff166001145b610b235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610b46576000805461ff0019166101001790555b6001600160a01b0382161580610b6357506001600160a01b038316155b80610b7557506001600160a01b038616155b80610b8757506001600160a01b038516155b80610b9957506001600160a01b038416155b15610bb757604051632e36adcd60e11b815260040160405180910390fd5b610bbf6120c8565b610bc76120ef565b610bcf6120c8565b610bd76120c8565b610be260008761211e565b610bfa60008051602061449f8339815191528761211e565b610c1260008051602061449f8339815191528661211e565b610c2a6000805160206144588339815191528561211e565b610c4260008051602061436e8339815191528461211e565b610c4d6000806121a4565b610c6660008051602061436e83398151915260006121a4565b610c7f60008051602061445883398151915260006121a4565b610c9860008051602061449f83398151915260006121a4565b61012f80546001600160a01b0319166001600160a01b0384161790556000805261013360209081527fa729f2b7e889b2ebf4d780e1fbffc38754bf520be086b132a2961d8dad3e68fe805460ff191660011790556040805160808101909152605280825246926144069083013980519060200120610d2f60408051808201909152600681526504445585032560d41b602082015290565b80519060200120610d546040805180820190915260018152601960f91b602082015290565b80516020918201206040805192830194909452928101919091526060810191909152608081018290523060a082015260c00160408051601f19818403018152828252805160209182012061012d55606083019091526038808352906143ce90830139604051602001610dc69190613ffc565b60408051601f19818403018152919052805160209091012061012e55508015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6000610e3b611945565b610e4a36869003860186613f99565b848433610e5a84848484856121ef565b610e6960003334896001611cd5565b9998505050505050505050565b600082815260656020526040902060010154610e918161193b565b610e9b838361211e565b505050565b6001600160a01b0381163314610f105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b1a565b610f1a82826123f1565b5050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610f675760405162461bcd60e51b8152600401610b1a9061403f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fb06000805160206143ae833981519152546001600160a01b031690565b6001600160a01b031614610fd65760405162461bcd60e51b8152600401610b1a9061408b565b610fdf81612458565b60408051600080825260208201909252610ffb91839190612463565b50565b60006110098161193b565b610ffb6125dd565b611019611945565b8585853361102a84848484856121ef565b8561103481611dfe565b3461103e81611e9f565b6110488734611ebd565b6110576000338b8b348c611ee8565b505050505050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156110ae5760405162461bcd60e51b8152600401610b1a9061403f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110f76000805160206143ae833981519152546001600160a01b031690565b6001600160a01b03161461111d5760405162461bcd60e51b8152600401610b1a9061408b565b61112682612458565b610f1a82826001612463565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111d25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b1a565b506000805160206143ae83398151915290565b60006000805160206144588339815191526111ff8161193b565b611207611945565b846112118161198d565b8461121b81611e9f565b61123461122d368d90038d018d613f99565b8b8b6119c7565b600085611267576001600160a01b03808916600090815261013660209081526040808320938d168352929052205461128f565b6001600160a01b03808916600090815261013260209081526040808320938d16835292905220545b9050868110156112b25760405163ed62766160e01b815260040160405180910390fd5b8681039050886001600160a01b0316886001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b393838a60008b600360405161130495949392919061410f565b60405180910390a3851561134b576001600160a01b03808916600090815261013260209081526040808320938d16835292905220819055611346888a8961262f565b611375565b6001600160a01b03808916600090815261013660209081526040808320938d168352929052208190555b5060019b9a5050505050505050505050565b60008051602061449f83398151915261139f8161193b565b6113a7611945565b6001600160a01b038216600081815261013560209081526040918290205491518281529192917ff40b9ca28516abde647ef8ed0e7b155e16347eb4d8dd6eb29989ed2c0c3d27e8910160405180910390a28015610e9b5761012f54610e9b9084906001600160a01b03168361262f565b60008051602061449f83398151915261142f8161193b565b610ffb612664565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60008051602061445883398151915261147a8161193b565b611482611945565b8461148c816126a1565b8561149681612741565b60008781526101306020908152604091829020825160e08101845281546001600160a01b03908116808352600184015480831695840186905260ff600160a01b918290048116151597850197909752600285015492831660608501528204861615156080840152600160a81b909104909416151560a082015260039091015460c08201529161152a918d918d918d916127e2565b600088815261013060205260409020861561164d57600281018054600160a01b60ff60a01b199182168117909255600183018054909116909117905560c082015160009061157990889061413a565b905061158e836060015184602001518361262f565b60608301516001600160a01b03166000908152610135602052604090205480156115ed576060840180516001600160a01b0390811660009081526101356020526040812055905161012f546115ed92166115e88b85614151565b61262f565b83600001516001600160a01b031684602001516001600160a01b031685606001516001600160a01b031660008051602061438e8339815191528e86600080600060405161163e959493929190614169565b60405180910390a45050611057565b6001600160a01b038816156116c6576001810180546001600160a01b0319166001600160a01b038a81169182179092558351606085015160c086015160405192851694919091169160008051602061438e833981519152916116b9918f91906000908190600290614169565b60405180910390a4611057565b81600001516001600160a01b031682602001516001600160a01b031683606001516001600160a01b031660008051602061438e8339815191528c8660c00151600080600360405161171b959493929190614169565b60405180910390a460018101805460ff60a01b1916600160a01b1790556060820151825160c084015161105792919061262f565b60008281526065602052604090206001015461176a8161193b565b610e9b83836123f1565b6040518060800160405280605281526020016144066052913981565b6000805160206144588339815191526117a88161193b565b6117b0611945565b846117ba81611dfe565b83856117c68282611ebd565b6117d38e8e8e8e8e6127e2565b6117e1898c8c8b8b8a612a4c565b896001600160a01b03168b6001600160a01b03168a6001600160a01b031660008051602061438e8339815191528b8b8b60016000604051611826959493929190614169565b60405180910390a46001600160a01b0389166000908152610135602052604090205496869003968015611872576001600160a01b038a1660009081526101356020526040812055958601955b61012f5461188b908b906001600160a01b03168961262f565b610a708a8c8a61262f565b6040518060600160405280603881526020016143ce6038913981565b60006118bd8161193b565b816118c781612b5d565b6001600160a01b0383166118ee57604051632e36adcd60e11b815260040160405180910390fd5b61012f80546001600160a01b0319166001600160a01b0385169081179091556040517fde92b13b60fc7d75045f2f14f3f6895326c7c355f64d6f052a38ac75a784979790600090a2505050565b610ffb8133612b84565b60975460ff161561198b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b1a565b565b6001600160a01b0381166000908152610133602052604090205460ff16610ffb57604051635619a8c960e11b815260040160405180910390fd5b82516001600160a01b0316600090815261013460205260409081902054908401518114611a0757604051631ca3e5a560e11b815260040160405180910390fd5b4284606001511015611a2c5760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5486600001516001600160a01b0316611a4b3390565b6001600160a01b031688604001518960600151604051602001611a90959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051602001611ab7929190614193565b60405160208183030381529060405280519060200120905084600001516001600160a01b0316611b1f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050612bdd9050565b6001600160a01b031614611b4657604051631a571b6160e11b815260040160405180910390fd5b505091516001600160a01b0316600090815261013460205260409020805460010190555050565b6000808080808080611b818a8c018c6141ae565b9650965096509650965096509650306001600160a01b0316866001600160a01b0316141580611bc25750876001600160a01b0316876001600160a01b031614155b15611be057604051631a571b6160e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b0388811660048301528781166024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390528a169063d505accf9060e401600060405180830381600087803b158015611c5057600080fd5b505af1158015610a70573d6000803e3d6000fd5b6040516001600160a01b0380851660248301528316604482015260648101829052611ccf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c01565b50505050565b600083611ce181611e9f565b838511611d015760405163ed62766160e01b815260040160405180910390fd5b6000858515611d2e57506001600160a01b0388166000908152610135602052604090208054860190558486035b8415611d69576001600160a01b03898116600090815261013260209081526040808320938c1683529290522080548201908190559150611d9a565b6001600160a01b03898116600090815261013660209081526040808320938c16835292905220805482019081905591505b50866001600160a01b0316886001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b39383896000896002604051611de895949392919061410f565b60405180910390a3506001979650505050505050565b60008181526101306020908152604091829020825160e08101845281546001600160a01b0390811680835260018401548083169584019590955260ff600160a01b95869004811615159684019690965260028401549182166060840152938104851615156080830152600160a81b9004909316151560a08401526003015460c083015215610f1a576040516315797c3960e21b815260040160405180910390fd5b80610ffb57604051632fbc6b5960e01b815260040160405180910390fd5b811580611eca5750808210155b15610f1a5760405163ed62766160e01b815260040160405180910390fd5b6001600160a01b038616600090815261013560205260408120805483019055611f11828461413a565b90506040518060e00160405280876001600160a01b03168152602001866001600160a01b03168152602001600015158152602001886001600160a01b0316815260200160001515815260200160001515815260200182815250610130600086815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a81548160ff02191690831515021790555060608201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160020160146101000a81548160ff02191690831515021790555060a08201518160020160156101000a81548160ff02191690831515021790555060c08201518160030155905050856001600160a01b0316856001600160a01b0316886001600160a01b031660008051602061438e833981519152878587600060016040516120b7959493929190614169565b60405180910390a450505050505050565b600054610100900460ff1661198b5760405162461bcd60e51b8152600401610b1a90614225565b600054610100900460ff166121165760405162461bcd60e51b8152600401610b1a90614225565b61198b612cd6565b6121288282611437565b610f1a5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556121603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6020808601516001600160a01b031660009081526101349091526040908190205490860151811461223357604051631ca3e5a560e11b815260040160405180910390fd5b42866060015110156122585760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5488600001516001600160a01b031689602001516001600160a01b03168a604001518b606001516040516020016122ba959493929190948552602085019390935260408401919091526060830152608082015260a00190565b604051602081830303815290604052805190602001206040516020016122e1929190614193565b604051602081830303815290604052805190602001209050836001600160a01b031687602001516001600160a01b0316141580156123355750826001600160a01b031687602001516001600160a01b031614155b1561235357604051631a571b6160e11b815260040160405180910390fd5b6123a760008051602061436e8339815191526106e088888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508793925050612bdd9050565b6123c457604051631a571b6160e11b815260040160405180910390fd5b505050506020928301516001600160a01b0316600090815261013490935250506040902080546001019055565b6123fb8282611437565b15610f1a5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610f1a8161193b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561249657610e9b83612d09565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124cf57600080fd5b505afa9250505080156124ff575060408051601f3d908101601f191682019092526124fc91810190614270565b60015b6125625760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b1a565b6000805160206143ae83398151915281146125d15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b1a565b50610e9b838383612da5565b6125e5612dca565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661265057610e9b6001600160a01b03831682612e13565b610e9b6001600160a01b0384168383612f2c565b61266c611945565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126123390565b60008181526101306020908152604091829020825160e08101845281546001600160a01b0390811680835260018401548083169584019590955260ff600160a01b95869004811615159684019690965260028401549182166060840152938104851615156080830152600160a81b9004909316151560a08401526003015460c0830152610f1a576040516315797c3960e21b815260040160405180910390fd5b60008181526101306020908152604091829020825160e08101845281546001600160a01b03908116825260018301548082169483019490945260ff600160a01b9485900481161580159684019690965260028401549182166060840152938104841615156080830152600160a81b9004909216151560a08301526003015460c082015290610f1a576040516345493bf160e11b815260040160405180910390fd5b816001600160a01b031685600001516001600160a01b03161461287057806001600160a01b031685600001516001600160a01b031614612835576040516357a78cd360e11b815260040160405180910390fd5b816001600160a01b031685602001516001600160a01b03161461286b57604051631a571b6160e11b815260040160405180910390fd5b6128a6565b806001600160a01b031685602001516001600160a01b0316146128a657604051631a571b6160e11b815260040160405180910390fd5b84516001600160a01b03166000908152610134602052604090819020549086015181146128e657604051631ca3e5a560e11b815260040160405180910390fd5b428660600151101561290b5760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5488600001516001600160a01b031689602001516001600160a01b03168a604001518b6060015160405160200161296d959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051602001612994929190614193565b60405160208183030381529060405280519060200120905086600001516001600160a01b03166129fc87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050612bdd9050565b6001600160a01b031614612a2357604051631a571b6160e11b815260040160405180910390fd5b505093516001600160a01b03166000908152610134602052604090208054600101905550505050565b85612a568161198d565b83612a6081611dfe565b83612a6a81611e9f565b87612a7481612b5d565b612a808a8a8888612f5c565b50506040805160e0810182526001600160a01b0397881681529787166020808a0191825260018a84018181529b8a1660608c0190815260808c0182815260a08d0183815260c08e019a8b5260009b8c52610130909452949099209a518b546001600160a01b031916908b16178b559151918a0180549b51928a166001600160a81b03199c8d1617600160a01b9315158402179055965160028a018054935198519190991692909a1691909117951515029490941760ff60a81b1916600160a81b971515979097029690961790935551600390930192909255505050565b6001600160a01b038116610ffb57604051632e36adcd60e11b815260040160405180910390fd5b612b8e8282611437565b610f1a57612b9b816130f0565b612ba6836020613102565b604051602001612bb7929190614289565b60408051601f198184030181529082905262461bcd60e51b8252610b1a91600401613979565b6000806000612bec85856132a4565b91509150612bf9816132ea565b509392505050565b6000612c56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134389092919063ffffffff16565b9050805160001480612c77575080806020019051810190612c7791906142fe565b610e9b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b1a565b600054610100900460ff16612cfd5760405162461bcd60e51b8152600401610b1a90614225565b6097805460ff19169055565b6001600160a01b0381163b612d765760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b1a565b6000805160206143ae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612dae8361344f565b600082511180612dbb5750805b15610e9b57611ccf838361348f565b60975460ff1661198b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b1a565b80471015612e635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b1a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eb0576040519150601f19603f3d011682016040523d82523d6000602084013e612eb5565b606091505b5050905080610e9b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b1a565b6040516001600160a01b038316602482015260448101829052610e9b90849063a9059cbb60e01b90606401611c98565b60008115612fe057506001600160a01b038085166000908152610132602090815260408083209387168352929052205482811015612fad5760405163ed62766160e01b815260040160405180910390fd5b6001600160a01b038086166000908152610132602090815260408083209388168352929052209083900390819055613094565b6001600160a01b03851661300757604051635619a8c960e11b815260040160405180910390fd5b506001600160a01b0380851660009081526101366020908152604080832093871683529290522054828110156130505760405163ed62766160e01b815260040160405180910390fd5b6130656001600160a01b038616853086611c64565b6001600160a01b0380861660009081526101366020908152604080832093881683529290522090839003908190555b836001600160a01b0316856001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b393838660018760046040516130e195949392919061410f565b60405180910390a35050505050565b60606109e06001600160a01b03831660145b6060600061311183600261431b565b61311c906002614151565b6001600160401b03811115613133576131336139ac565b6040519080825280601f01601f19166020018201604052801561315d576020820181803683370190505b509050600360fc1b8160008151811061317857613178613fb5565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106131a7576131a7613fb5565b60200101906001600160f81b031916908160001a90535060006131cb84600261431b565b6131d6906001614151565b90505b600181111561324e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061320a5761320a613fb5565b1a60f81b82828151811061322057613220613fb5565b60200101906001600160f81b031916908160001a90535060049490941c936132478161433a565b90506131d9565b50831561329d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b1a565b9392505050565b6000808251604114156132db5760208301516040840151606085015160001a6132cf878285856134b4565b945094505050506132e3565b506000905060025b9250929050565b60008160048111156132fe576132fe6140d7565b14156133075750565b600181600481111561331b5761331b6140d7565b14156133695760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b1a565b600281600481111561337d5761337d6140d7565b14156133cb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b1a565b60038160048111156133df576133df6140d7565b1415610ffb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b1a565b60606134478484600085613578565b949350505050565b61345881612d09565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061329d838360405180606001604052806027815260200161447860279139613653565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156134eb575060009050600361356f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561353f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135685760006001925092505061356f565b9150600090505b94509492505050565b6060824710156135d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b1a565b600080866001600160a01b031685876040516135f59190614351565b60006040518083038185875af1925050503d8060008114613632576040519150601f19603f3d011682016040523d82523d6000602084013e613637565b606091505b5091509150613648878383876136cb565b979650505050505050565b6060600080856001600160a01b0316856040516136709190614351565b600060405180830381855af49150503d80600081146136ab576040519150601f19603f3d011682016040523d82523d6000602084013e6136b0565b606091505b50915091506136c1868383876136cb565b9695505050505050565b60608315613737578251613730576001600160a01b0385163b6137305760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b5081613447565b613447838381511561374c5781518083602001fd5b8060405162461bcd60e51b8152600401610b1a9190613979565b60006080828403121561377857600080fd5b50919050565b60008083601f84011261379057600080fd5b5081356001600160401b038111156137a757600080fd5b6020830191508360208285010111156132e357600080fd5b6001600160a01b0381168114610ffb57600080fd5b8015158114610ffb57600080fd5b60008060008060008060008060006101408a8c03121561380157600080fd5b61380b8b8b613766565b985060808a01356001600160401b038082111561382757600080fd5b6138338d838e0161377e565b909a50985060a08c013591508082111561384c57600080fd5b506138598c828d0161377e565b90975095505060c08a013561386d816137bf565b935060e08a013592506101008a013591506101208a013561388d816137d4565b809150509295985092959850929598565b6000806000604084860312156138b357600080fd5b83356001600160401b03808211156138ca57600080fd5b818601915086601f8301126138de57600080fd5b8135818111156138ed57600080fd5b8760208260051b850101111561390257600080fd5b60209283019550935050840135613918816137d4565b809150509250925092565b60006020828403121561393557600080fd5b81356001600160e01b03198116811461329d57600080fd5b60005b83811015613968578181015183820152602001613950565b83811115611ccf5750506000910152565b602081526000825180602084015261399881604085016020870161394d565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156139ea576139ea6139ac565b604052919050565b600060808284031215613a0457600080fd5b604051608081018181106001600160401b0382111715613a2657613a266139ac565b6040529050808235613a37816137bf565b81526020830135613a47816137bf565b8060208301525060408301356040820152606083013560608201525092915050565b6000806000806000806000806000806101608b8d031215613a8957600080fd5b613a938c8c6139f2565b995060808b01356001600160401b0380821115613aaf57600080fd5b613abb8e838f0161377e565b909b50995060a08d0135915080821115613ad457600080fd5b50613ae18d828e0161377e565b90985096505060c08b0135613af5816137bf565b945060e08b0135613b05816137bf565b809450506101008b013592506101208b013591506101408b013590509295989b9194979a5092959850565b600080600080600060a08688031215613b4857600080fd5b8535613b53816137bf565b94506020860135613b63816137bf565b93506040860135613b73816137bf565b92506060860135613b83816137bf565b91506080860135613b93816137bf565b809150509295509295909350565b600060208284031215613bb357600080fd5b813561329d816137bf565b600060208284031215613bd057600080fd5b5035919050565b60008060008060c08587031215613bed57600080fd5b613bf78686613766565b935060808501356001600160401b03811115613c1257600080fd5b613c1e8782880161377e565b9598909750949560a00135949350505050565b60008060408385031215613c4457600080fd5b823591506020830135613c56816137bf565b809150509250929050565b6000806000806000806101008789031215613c7b57600080fd5b613c8588886139f2565b955060808701356001600160401b03811115613ca057600080fd5b613cac89828a0161377e565b90965094505060a0870135613cc0816137bf565b9598949750929560c08101359460e0909101359350915050565b60008060408385031215613ced57600080fd5b8235613cf8816137bf565b91506020830135613c56816137bf565b60008060408385031215613d1b57600080fd5b8235613d26816137bf565b91506020838101356001600160401b0380821115613d4357600080fd5b818601915086601f830112613d5757600080fd5b813581811115613d6957613d696139ac565b613d7b601f8201601f191685016139c2565b91508082528784828501011115613d9157600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806000806000610120888a031215613dcb57600080fd5b613dd58989613766565b965060808801356001600160401b03811115613df057600080fd5b613dfc8a828b0161377e565b90975095505060a0880135613e10816137bf565b935060c0880135613e20816137bf565b925060e08801359150610100880135613e38816137d4565b8091505092959891949750929550565b6000806000806000806000610120888a031215613e6457600080fd5b613e6e89896139f2565b965060808801356001600160401b03811115613e8957600080fd5b613e958a828b0161377e565b90975095505060a0880135935060c0880135613eb0816137bf565b925060e0880135613ec0816137d4565b80925050610100880135905092959891949750929550565b6000806000806000806000806000806101808b8d031215613ef857600080fd5b613f028c8c6139f2565b995060808b01356001600160401b03811115613f1d57600080fd5b613f298d828e0161377e565b909a5098505060a08b0135613f3d816137bf565b965060c08b0135613f4d816137bf565b955060e08b0135613f5d816137bf565b94506101008b013593506101208b013592506101408b013591506101608b0135613f86816137d4565b809150509295989b9194979a5092959850565b600060808284031215613fab57600080fd5b61329d83836139f2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613ff557613ff5613fcb565b5060010190565b6f0accae4d2ccd2cac8a4cae2eacae6e8560831b81526000825161402781601085016020870161394d565b602960f81b6010939091019283015250601101919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b6005811061410b57634e487b7160e01b600052602160045260246000fd5b9052565b858152602081018590528315156040820152821515606082015260a081016136c160808301846140ed565b60008282101561414c5761414c613fcb565b500390565b6000821982111561416457614164613fcb565b500190565b8581526020810185905260408101849052821515606082015260a081016136c160808301846140ed565b61190160f01b81526002810192909252602282015260420190565b600080600080600080600060e0888a0312156141c957600080fd5b87356141d4816137bf565b965060208801356141e4816137bf565b95506040880135945060608801359350608088013560ff8116811461420857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561428257600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516142c181601785016020880161394d565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516142f281602884016020880161394d565b01602801949350505050565b60006020828403121561431057600080fd5b815161329d816137d4565b600081600019048311821515161561433557614335613fcb565b500290565b60008161434957614349613fcb565b506000190190565b6000825161436381846020870161394d565b919091019291505056feaae872cdab9eca592756bbacf3e549319d576c15de6bc32b676dbdf654ef264e84132bf9839ca99a4face5adf4402aad7745b07d336ac551b72b682ed396b7d0360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc616464726573732066726f6d2c6164647265737320746f2c75696e74323536206e6f6e63652c75696e743235362076616c6964556e74696c454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374299cf85f95575c3af1e116e3d37fd41e7f36a8a373623f51ffaaa87fdd032fa767416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a26469706673582212202d78e5422ea3c3c932670ba3d3dcf978d41425e71c7fa8cb8fc01b479b1cfec164736f6c63430008090033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806352d1902d1161012e578063a217fddf116100ab578063e1b11da41161006f578063e1b11da41461078a578063e32204dd1461079f578063e41c9ce7146107d8578063e92263b1146107f8578063fd6cb6131461080d57600080fd5b8063a217fddf146106e5578063b0bddb87146106fa578063cb73ac561461071a578063cd11600814610731578063d547741f1461076a57600080fd5b80636ebc51e1116100f25780636ebc51e1146106345780637e0b2492146106545780637ecebe00146106825780638456cb59146106b057806391d14854146106c557600080fd5b806352d1902d1461059b57806354fd4d50146105b05780635c975abb146105da5780635f8a7c4e146105f2578063630dc7cb1461061257600080fd5b80632a0acc6a116101bc5780633659cfe6116101805780633659cfe6146105075780633f4ba83a14610527578063442ffd2f1461053c57806349c7dfa01461054f5780634f1ef2861461058857600080fd5b80632a0acc6a1461047b5780632af69b151461049d5780632f2ff15d146104b05780632ff36969146104d057806336568abe146104e757600080fd5b80631095cad2116102035780631095cad21461031f5780631459457a1461033f5780631e7be2101461035f578063248a9ca31461039057806324ead40b146103c057600080fd5b8063018a5ae91461024057806301b38af51461027557806301ffc9a71461029757806304b208fa146102b757806306fdde03146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b3660046137e2565b61082d565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061029561029036600461389e565b6108ee565b005b3480156102a357600080fd5b506102606102b2366004613923565b6109af565b3480156102c357600080fd5b506102d960008051602061436e83398151915281565b60405190815260200161026c565b3480156102f357600080fd5b5060408051808201909152600681526504445585032560d41b60208201525b60405161026c9190613979565b34801561032b57600080fd5b5061029561033a366004613a69565b6109e6565b34801561034b57600080fd5b5061029561035a366004613b30565b610a81565b34801561036b57600080fd5b5061026061037a366004613ba1565b6101336020526000908152604090205460ff1681565b34801561039c57600080fd5b506102d96103ab366004613bbe565b60009081526065602052604090206001015490565b3480156103cc57600080fd5b506104306103db366004613bbe565b6101306020526000908152604090208054600182015460028301546003909301546001600160a01b03928316938284169360ff600160a01b9485900481169491831693918304811692600160a81b9004169087565b604080516001600160a01b0398891681529688166020880152941515948601949094529490911660608401521515608083015291151560a082015260c081019190915260e00161026c565b34801561048757600080fd5b506102d960008051602061449f83398151915281565b6102606104ab366004613bd7565b610e31565b3480156104bc57600080fd5b506102956104cb366004613c31565b610e76565b3480156104dc57600080fd5b506102d961012e5481565b3480156104f357600080fd5b50610295610502366004613c31565b610ea0565b34801561051357600080fd5b50610295610522366004613ba1565b610f1e565b34801561053357600080fd5b50610295610ffe565b61029561054a366004613c61565b611011565b34801561055b57600080fd5b506102d961056a366004613cda565b61013260209081526000928352604080842090915290825290205481565b610295610596366004613d08565b611065565b3480156105a757600080fd5b506102d9611132565b3480156105bc57600080fd5b506040805180820190915260018152601960f91b6020820152610312565b3480156105e657600080fd5b5060975460ff16610260565b3480156105fe57600080fd5b5061026061060d366004613daf565b6111e5565b34801561061e57600080fd5b506102d960008051602061445883398151915281565b34801561064057600080fd5b5061029561064f366004613ba1565b611387565b34801561066057600080fd5b506102d961066f366004613ba1565b6101356020526000908152604090205481565b34801561068e57600080fd5b506102d961069d366004613ba1565b6101346020526000908152604090205481565b3480156106bc57600080fd5b50610295611417565b3480156106d157600080fd5b506102606106e0366004613c31565b611437565b3480156106f157600080fd5b506102d9600081565b34801561070657600080fd5b50610295610715366004613e48565b611462565b34801561072657600080fd5b506102d961012d5481565b34801561073d57600080fd5b506102d961074c366004613cda565b61013660209081526000928352604080842090915290825290205481565b34801561077657600080fd5b50610295610785366004613c31565b61174f565b34801561079657600080fd5b50610312611774565b3480156107ab57600080fd5b5061012f546107c0906001600160a01b031681565b6040516001600160a01b03909116815260200161026c565b3480156107e457600080fd5b506102956107f3366004613ed8565b611790565b34801561080457600080fd5b50610312611896565b34801561081957600080fd5b50610295610828366004613ba1565b6118b2565b60006000805160206144588339815191526108478161193b565b61084f611945565b856108598161198d565b61087261086b368e90038e018e613f99565b8c8c6119c7565b600061088160208e018e613ba1565b90508815610895576108958a8a8a84611b6d565b84156108b5576108b06001600160a01b03891682308a611c64565b6108d0565b85156108d0576108d06001600160a01b038916823089611c64565b6108dd8882898989611cd5565b9d9c50505050505050505050505050565b60006108f98161193b565b826000805b828110156109a65786868281811061091857610918613fb5565b905060200201602081019061092d9190613ba1565b6001600160a01b0381166000818152610133602052604090819020805489151560ff1990911617905551919350907f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d9061098c90881515815260200190565b60405180910390a28061099e81613fe1565b9150506108fe565b50505050505050565b60006001600160e01b03198216637965db0b60e01b14806109e057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206144588339815191526109fe8161193b565b610a06611945565b83610a1081611dfe565b86610a1a8161198d565b84610a2481611e9f565b610a2f8e8e8e6119c7565b610a398587611ebd565b8d518a15610a4d57610a4d8c8c8c84611b6d565b610a626001600160a01b038b1682308a611c64565b610a708a828b8b8b8b611ee8565b505050505050505050505050505050565b600054610100900460ff1615808015610aa15750600054600160ff909116105b80610abb5750303b158015610abb575060005460ff166001145b610b235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610b46576000805461ff0019166101001790555b6001600160a01b0382161580610b6357506001600160a01b038316155b80610b7557506001600160a01b038616155b80610b8757506001600160a01b038516155b80610b9957506001600160a01b038416155b15610bb757604051632e36adcd60e11b815260040160405180910390fd5b610bbf6120c8565b610bc76120ef565b610bcf6120c8565b610bd76120c8565b610be260008761211e565b610bfa60008051602061449f8339815191528761211e565b610c1260008051602061449f8339815191528661211e565b610c2a6000805160206144588339815191528561211e565b610c4260008051602061436e8339815191528461211e565b610c4d6000806121a4565b610c6660008051602061436e83398151915260006121a4565b610c7f60008051602061445883398151915260006121a4565b610c9860008051602061449f83398151915260006121a4565b61012f80546001600160a01b0319166001600160a01b0384161790556000805261013360209081527fa729f2b7e889b2ebf4d780e1fbffc38754bf520be086b132a2961d8dad3e68fe805460ff191660011790556040805160808101909152605280825246926144069083013980519060200120610d2f60408051808201909152600681526504445585032560d41b602082015290565b80519060200120610d546040805180820190915260018152601960f91b602082015290565b80516020918201206040805192830194909452928101919091526060810191909152608081018290523060a082015260c00160408051601f19818403018152828252805160209182012061012d55606083019091526038808352906143ce90830139604051602001610dc69190613ffc565b60408051601f19818403018152919052805160209091012061012e55508015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6000610e3b611945565b610e4a36869003860186613f99565b848433610e5a84848484856121ef565b610e6960003334896001611cd5565b9998505050505050505050565b600082815260656020526040902060010154610e918161193b565b610e9b838361211e565b505050565b6001600160a01b0381163314610f105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b1a565b610f1a82826123f1565b5050565b306001600160a01b037f00000000000000000000000068ad818ca3022a130050297135a99a00d5b4333a161415610f675760405162461bcd60e51b8152600401610b1a9061403f565b7f00000000000000000000000068ad818ca3022a130050297135a99a00d5b4333a6001600160a01b0316610fb06000805160206143ae833981519152546001600160a01b031690565b6001600160a01b031614610fd65760405162461bcd60e51b8152600401610b1a9061408b565b610fdf81612458565b60408051600080825260208201909252610ffb91839190612463565b50565b60006110098161193b565b610ffb6125dd565b611019611945565b8585853361102a84848484856121ef565b8561103481611dfe565b3461103e81611e9f565b6110488734611ebd565b6110576000338b8b348c611ee8565b505050505050505050505050565b306001600160a01b037f00000000000000000000000068ad818ca3022a130050297135a99a00d5b4333a1614156110ae5760405162461bcd60e51b8152600401610b1a9061403f565b7f00000000000000000000000068ad818ca3022a130050297135a99a00d5b4333a6001600160a01b03166110f76000805160206143ae833981519152546001600160a01b031690565b6001600160a01b03161461111d5760405162461bcd60e51b8152600401610b1a9061408b565b61112682612458565b610f1a82826001612463565b6000306001600160a01b037f00000000000000000000000068ad818ca3022a130050297135a99a00d5b4333a16146111d25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b1a565b506000805160206143ae83398151915290565b60006000805160206144588339815191526111ff8161193b565b611207611945565b846112118161198d565b8461121b81611e9f565b61123461122d368d90038d018d613f99565b8b8b6119c7565b600085611267576001600160a01b03808916600090815261013660209081526040808320938d168352929052205461128f565b6001600160a01b03808916600090815261013260209081526040808320938d16835292905220545b9050868110156112b25760405163ed62766160e01b815260040160405180910390fd5b8681039050886001600160a01b0316886001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b393838a60008b600360405161130495949392919061410f565b60405180910390a3851561134b576001600160a01b03808916600090815261013260209081526040808320938d16835292905220819055611346888a8961262f565b611375565b6001600160a01b03808916600090815261013660209081526040808320938d168352929052208190555b5060019b9a5050505050505050505050565b60008051602061449f83398151915261139f8161193b565b6113a7611945565b6001600160a01b038216600081815261013560209081526040918290205491518281529192917ff40b9ca28516abde647ef8ed0e7b155e16347eb4d8dd6eb29989ed2c0c3d27e8910160405180910390a28015610e9b5761012f54610e9b9084906001600160a01b03168361262f565b60008051602061449f83398151915261142f8161193b565b610ffb612664565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60008051602061445883398151915261147a8161193b565b611482611945565b8461148c816126a1565b8561149681612741565b60008781526101306020908152604091829020825160e08101845281546001600160a01b03908116808352600184015480831695840186905260ff600160a01b918290048116151597850197909752600285015492831660608501528204861615156080840152600160a81b909104909416151560a082015260039091015460c08201529161152a918d918d918d916127e2565b600088815261013060205260409020861561164d57600281018054600160a01b60ff60a01b199182168117909255600183018054909116909117905560c082015160009061157990889061413a565b905061158e836060015184602001518361262f565b60608301516001600160a01b03166000908152610135602052604090205480156115ed576060840180516001600160a01b0390811660009081526101356020526040812055905161012f546115ed92166115e88b85614151565b61262f565b83600001516001600160a01b031684602001516001600160a01b031685606001516001600160a01b031660008051602061438e8339815191528e86600080600060405161163e959493929190614169565b60405180910390a45050611057565b6001600160a01b038816156116c6576001810180546001600160a01b0319166001600160a01b038a81169182179092558351606085015160c086015160405192851694919091169160008051602061438e833981519152916116b9918f91906000908190600290614169565b60405180910390a4611057565b81600001516001600160a01b031682602001516001600160a01b031683606001516001600160a01b031660008051602061438e8339815191528c8660c00151600080600360405161171b959493929190614169565b60405180910390a460018101805460ff60a01b1916600160a01b1790556060820151825160c084015161105792919061262f565b60008281526065602052604090206001015461176a8161193b565b610e9b83836123f1565b6040518060800160405280605281526020016144066052913981565b6000805160206144588339815191526117a88161193b565b6117b0611945565b846117ba81611dfe565b83856117c68282611ebd565b6117d38e8e8e8e8e6127e2565b6117e1898c8c8b8b8a612a4c565b896001600160a01b03168b6001600160a01b03168a6001600160a01b031660008051602061438e8339815191528b8b8b60016000604051611826959493929190614169565b60405180910390a46001600160a01b0389166000908152610135602052604090205496869003968015611872576001600160a01b038a1660009081526101356020526040812055958601955b61012f5461188b908b906001600160a01b03168961262f565b610a708a8c8a61262f565b6040518060600160405280603881526020016143ce6038913981565b60006118bd8161193b565b816118c781612b5d565b6001600160a01b0383166118ee57604051632e36adcd60e11b815260040160405180910390fd5b61012f80546001600160a01b0319166001600160a01b0385169081179091556040517fde92b13b60fc7d75045f2f14f3f6895326c7c355f64d6f052a38ac75a784979790600090a2505050565b610ffb8133612b84565b60975460ff161561198b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b1a565b565b6001600160a01b0381166000908152610133602052604090205460ff16610ffb57604051635619a8c960e11b815260040160405180910390fd5b82516001600160a01b0316600090815261013460205260409081902054908401518114611a0757604051631ca3e5a560e11b815260040160405180910390fd5b4284606001511015611a2c5760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5486600001516001600160a01b0316611a4b3390565b6001600160a01b031688604001518960600151604051602001611a90959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051602001611ab7929190614193565b60405160208183030381529060405280519060200120905084600001516001600160a01b0316611b1f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050612bdd9050565b6001600160a01b031614611b4657604051631a571b6160e11b815260040160405180910390fd5b505091516001600160a01b0316600090815261013460205260409020805460010190555050565b6000808080808080611b818a8c018c6141ae565b9650965096509650965096509650306001600160a01b0316866001600160a01b0316141580611bc25750876001600160a01b0316876001600160a01b031614155b15611be057604051631a571b6160e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b0388811660048301528781166024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390528a169063d505accf9060e401600060405180830381600087803b158015611c5057600080fd5b505af1158015610a70573d6000803e3d6000fd5b6040516001600160a01b0380851660248301528316604482015260648101829052611ccf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c01565b50505050565b600083611ce181611e9f565b838511611d015760405163ed62766160e01b815260040160405180910390fd5b6000858515611d2e57506001600160a01b0388166000908152610135602052604090208054860190558486035b8415611d69576001600160a01b03898116600090815261013260209081526040808320938c1683529290522080548201908190559150611d9a565b6001600160a01b03898116600090815261013660209081526040808320938c16835292905220805482019081905591505b50866001600160a01b0316886001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b39383896000896002604051611de895949392919061410f565b60405180910390a3506001979650505050505050565b60008181526101306020908152604091829020825160e08101845281546001600160a01b0390811680835260018401548083169584019590955260ff600160a01b95869004811615159684019690965260028401549182166060840152938104851615156080830152600160a81b9004909316151560a08401526003015460c083015215610f1a576040516315797c3960e21b815260040160405180910390fd5b80610ffb57604051632fbc6b5960e01b815260040160405180910390fd5b811580611eca5750808210155b15610f1a5760405163ed62766160e01b815260040160405180910390fd5b6001600160a01b038616600090815261013560205260408120805483019055611f11828461413a565b90506040518060e00160405280876001600160a01b03168152602001866001600160a01b03168152602001600015158152602001886001600160a01b0316815260200160001515815260200160001515815260200182815250610130600086815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a81548160ff02191690831515021790555060608201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160020160146101000a81548160ff02191690831515021790555060a08201518160020160156101000a81548160ff02191690831515021790555060c08201518160030155905050856001600160a01b0316856001600160a01b0316886001600160a01b031660008051602061438e833981519152878587600060016040516120b7959493929190614169565b60405180910390a450505050505050565b600054610100900460ff1661198b5760405162461bcd60e51b8152600401610b1a90614225565b600054610100900460ff166121165760405162461bcd60e51b8152600401610b1a90614225565b61198b612cd6565b6121288282611437565b610f1a5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556121603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6020808601516001600160a01b031660009081526101349091526040908190205490860151811461223357604051631ca3e5a560e11b815260040160405180910390fd5b42866060015110156122585760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5488600001516001600160a01b031689602001516001600160a01b03168a604001518b606001516040516020016122ba959493929190948552602085019390935260408401919091526060830152608082015260a00190565b604051602081830303815290604052805190602001206040516020016122e1929190614193565b604051602081830303815290604052805190602001209050836001600160a01b031687602001516001600160a01b0316141580156123355750826001600160a01b031687602001516001600160a01b031614155b1561235357604051631a571b6160e11b815260040160405180910390fd5b6123a760008051602061436e8339815191526106e088888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508793925050612bdd9050565b6123c457604051631a571b6160e11b815260040160405180910390fd5b505050506020928301516001600160a01b0316600090815261013490935250506040902080546001019055565b6123fb8282611437565b15610f1a5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610f1a8161193b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561249657610e9b83612d09565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124cf57600080fd5b505afa9250505080156124ff575060408051601f3d908101601f191682019092526124fc91810190614270565b60015b6125625760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b1a565b6000805160206143ae83398151915281146125d15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b1a565b50610e9b838383612da5565b6125e5612dca565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661265057610e9b6001600160a01b03831682612e13565b610e9b6001600160a01b0384168383612f2c565b61266c611945565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126123390565b60008181526101306020908152604091829020825160e08101845281546001600160a01b0390811680835260018401548083169584019590955260ff600160a01b95869004811615159684019690965260028401549182166060840152938104851615156080830152600160a81b9004909316151560a08401526003015460c0830152610f1a576040516315797c3960e21b815260040160405180910390fd5b60008181526101306020908152604091829020825160e08101845281546001600160a01b03908116825260018301548082169483019490945260ff600160a01b9485900481161580159684019690965260028401549182166060840152938104841615156080830152600160a81b9004909216151560a08301526003015460c082015290610f1a576040516345493bf160e11b815260040160405180910390fd5b816001600160a01b031685600001516001600160a01b03161461287057806001600160a01b031685600001516001600160a01b031614612835576040516357a78cd360e11b815260040160405180910390fd5b816001600160a01b031685602001516001600160a01b03161461286b57604051631a571b6160e11b815260040160405180910390fd5b6128a6565b806001600160a01b031685602001516001600160a01b0316146128a657604051631a571b6160e11b815260040160405180910390fd5b84516001600160a01b03166000908152610134602052604090819020549086015181146128e657604051631ca3e5a560e11b815260040160405180910390fd5b428660600151101561290b5760405163be5115cd60e01b815260040160405180910390fd5b600061012d5461012e5488600001516001600160a01b031689602001516001600160a01b03168a604001518b6060015160405160200161296d959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051602001612994929190614193565b60405160208183030381529060405280519060200120905086600001516001600160a01b03166129fc87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050612bdd9050565b6001600160a01b031614612a2357604051631a571b6160e11b815260040160405180910390fd5b505093516001600160a01b03166000908152610134602052604090208054600101905550505050565b85612a568161198d565b83612a6081611dfe565b83612a6a81611e9f565b87612a7481612b5d565b612a808a8a8888612f5c565b50506040805160e0810182526001600160a01b0397881681529787166020808a0191825260018a84018181529b8a1660608c0190815260808c0182815260a08d0183815260c08e019a8b5260009b8c52610130909452949099209a518b546001600160a01b031916908b16178b559151918a0180549b51928a166001600160a81b03199c8d1617600160a01b9315158402179055965160028a018054935198519190991692909a1691909117951515029490941760ff60a81b1916600160a81b971515979097029690961790935551600390930192909255505050565b6001600160a01b038116610ffb57604051632e36adcd60e11b815260040160405180910390fd5b612b8e8282611437565b610f1a57612b9b816130f0565b612ba6836020613102565b604051602001612bb7929190614289565b60408051601f198184030181529082905262461bcd60e51b8252610b1a91600401613979565b6000806000612bec85856132a4565b91509150612bf9816132ea565b509392505050565b6000612c56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134389092919063ffffffff16565b9050805160001480612c77575080806020019051810190612c7791906142fe565b610e9b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b1a565b600054610100900460ff16612cfd5760405162461bcd60e51b8152600401610b1a90614225565b6097805460ff19169055565b6001600160a01b0381163b612d765760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b1a565b6000805160206143ae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612dae8361344f565b600082511180612dbb5750805b15610e9b57611ccf838361348f565b60975460ff1661198b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b1a565b80471015612e635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b1a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eb0576040519150601f19603f3d011682016040523d82523d6000602084013e612eb5565b606091505b5050905080610e9b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b1a565b6040516001600160a01b038316602482015260448101829052610e9b90849063a9059cbb60e01b90606401611c98565b60008115612fe057506001600160a01b038085166000908152610132602090815260408083209387168352929052205482811015612fad5760405163ed62766160e01b815260040160405180910390fd5b6001600160a01b038086166000908152610132602090815260408083209388168352929052209083900390819055613094565b6001600160a01b03851661300757604051635619a8c960e11b815260040160405180910390fd5b506001600160a01b0380851660009081526101366020908152604080832093871683529290522054828110156130505760405163ed62766160e01b815260040160405180910390fd5b6130656001600160a01b038616853086611c64565b6001600160a01b0380861660009081526101366020908152604080832093881683529290522090839003908190555b836001600160a01b0316856001600160a01b03167f9e3689b8ccd112c74fbc221f796128e9492fd9d6db818006910db342d595b393838660018760046040516130e195949392919061410f565b60405180910390a35050505050565b60606109e06001600160a01b03831660145b6060600061311183600261431b565b61311c906002614151565b6001600160401b03811115613133576131336139ac565b6040519080825280601f01601f19166020018201604052801561315d576020820181803683370190505b509050600360fc1b8160008151811061317857613178613fb5565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106131a7576131a7613fb5565b60200101906001600160f81b031916908160001a90535060006131cb84600261431b565b6131d6906001614151565b90505b600181111561324e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061320a5761320a613fb5565b1a60f81b82828151811061322057613220613fb5565b60200101906001600160f81b031916908160001a90535060049490941c936132478161433a565b90506131d9565b50831561329d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b1a565b9392505050565b6000808251604114156132db5760208301516040840151606085015160001a6132cf878285856134b4565b945094505050506132e3565b506000905060025b9250929050565b60008160048111156132fe576132fe6140d7565b14156133075750565b600181600481111561331b5761331b6140d7565b14156133695760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b1a565b600281600481111561337d5761337d6140d7565b14156133cb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b1a565b60038160048111156133df576133df6140d7565b1415610ffb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b1a565b60606134478484600085613578565b949350505050565b61345881612d09565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061329d838360405180606001604052806027815260200161447860279139613653565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156134eb575060009050600361356f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561353f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135685760006001925092505061356f565b9150600090505b94509492505050565b6060824710156135d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b1a565b600080866001600160a01b031685876040516135f59190614351565b60006040518083038185875af1925050503d8060008114613632576040519150601f19603f3d011682016040523d82523d6000602084013e613637565b606091505b5091509150613648878383876136cb565b979650505050505050565b6060600080856001600160a01b0316856040516136709190614351565b600060405180830381855af49150503d80600081146136ab576040519150601f19603f3d011682016040523d82523d6000602084013e6136b0565b606091505b50915091506136c1868383876136cb565b9695505050505050565b60608315613737578251613730576001600160a01b0385163b6137305760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b5081613447565b613447838381511561374c5781518083602001fd5b8060405162461bcd60e51b8152600401610b1a9190613979565b60006080828403121561377857600080fd5b50919050565b60008083601f84011261379057600080fd5b5081356001600160401b038111156137a757600080fd5b6020830191508360208285010111156132e357600080fd5b6001600160a01b0381168114610ffb57600080fd5b8015158114610ffb57600080fd5b60008060008060008060008060006101408a8c03121561380157600080fd5b61380b8b8b613766565b985060808a01356001600160401b038082111561382757600080fd5b6138338d838e0161377e565b909a50985060a08c013591508082111561384c57600080fd5b506138598c828d0161377e565b90975095505060c08a013561386d816137bf565b935060e08a013592506101008a013591506101208a013561388d816137d4565b809150509295985092959850929598565b6000806000604084860312156138b357600080fd5b83356001600160401b03808211156138ca57600080fd5b818601915086601f8301126138de57600080fd5b8135818111156138ed57600080fd5b8760208260051b850101111561390257600080fd5b60209283019550935050840135613918816137d4565b809150509250925092565b60006020828403121561393557600080fd5b81356001600160e01b03198116811461329d57600080fd5b60005b83811015613968578181015183820152602001613950565b83811115611ccf5750506000910152565b602081526000825180602084015261399881604085016020870161394d565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156139ea576139ea6139ac565b604052919050565b600060808284031215613a0457600080fd5b604051608081018181106001600160401b0382111715613a2657613a266139ac565b6040529050808235613a37816137bf565b81526020830135613a47816137bf565b8060208301525060408301356040820152606083013560608201525092915050565b6000806000806000806000806000806101608b8d031215613a8957600080fd5b613a938c8c6139f2565b995060808b01356001600160401b0380821115613aaf57600080fd5b613abb8e838f0161377e565b909b50995060a08d0135915080821115613ad457600080fd5b50613ae18d828e0161377e565b90985096505060c08b0135613af5816137bf565b945060e08b0135613b05816137bf565b809450506101008b013592506101208b013591506101408b013590509295989b9194979a5092959850565b600080600080600060a08688031215613b4857600080fd5b8535613b53816137bf565b94506020860135613b63816137bf565b93506040860135613b73816137bf565b92506060860135613b83816137bf565b91506080860135613b93816137bf565b809150509295509295909350565b600060208284031215613bb357600080fd5b813561329d816137bf565b600060208284031215613bd057600080fd5b5035919050565b60008060008060c08587031215613bed57600080fd5b613bf78686613766565b935060808501356001600160401b03811115613c1257600080fd5b613c1e8782880161377e565b9598909750949560a00135949350505050565b60008060408385031215613c4457600080fd5b823591506020830135613c56816137bf565b809150509250929050565b6000806000806000806101008789031215613c7b57600080fd5b613c8588886139f2565b955060808701356001600160401b03811115613ca057600080fd5b613cac89828a0161377e565b90965094505060a0870135613cc0816137bf565b9598949750929560c08101359460e0909101359350915050565b60008060408385031215613ced57600080fd5b8235613cf8816137bf565b91506020830135613c56816137bf565b60008060408385031215613d1b57600080fd5b8235613d26816137bf565b91506020838101356001600160401b0380821115613d4357600080fd5b818601915086601f830112613d5757600080fd5b813581811115613d6957613d696139ac565b613d7b601f8201601f191685016139c2565b91508082528784828501011115613d9157600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806000806000610120888a031215613dcb57600080fd5b613dd58989613766565b965060808801356001600160401b03811115613df057600080fd5b613dfc8a828b0161377e565b90975095505060a0880135613e10816137bf565b935060c0880135613e20816137bf565b925060e08801359150610100880135613e38816137d4565b8091505092959891949750929550565b6000806000806000806000610120888a031215613e6457600080fd5b613e6e89896139f2565b965060808801356001600160401b03811115613e8957600080fd5b613e958a828b0161377e565b90975095505060a0880135935060c0880135613eb0816137bf565b925060e0880135613ec0816137d4565b80925050610100880135905092959891949750929550565b6000806000806000806000806000806101808b8d031215613ef857600080fd5b613f028c8c6139f2565b995060808b01356001600160401b03811115613f1d57600080fd5b613f298d828e0161377e565b909a5098505060a08b0135613f3d816137bf565b965060c08b0135613f4d816137bf565b955060e08b0135613f5d816137bf565b94506101008b013593506101208b013592506101408b013591506101608b0135613f86816137d4565b809150509295989b9194979a5092959850565b600060808284031215613fab57600080fd5b61329d83836139f2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613ff557613ff5613fcb565b5060010190565b6f0accae4d2ccd2cac8a4cae2eacae6e8560831b81526000825161402781601085016020870161394d565b602960f81b6010939091019283015250601101919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b6005811061410b57634e487b7160e01b600052602160045260246000fd5b9052565b858152602081018590528315156040820152821515606082015260a081016136c160808301846140ed565b60008282101561414c5761414c613fcb565b500390565b6000821982111561416457614164613fcb565b500190565b8581526020810185905260408101849052821515606082015260a081016136c160808301846140ed565b61190160f01b81526002810192909252602282015260420190565b600080600080600080600060e0888a0312156141c957600080fd5b87356141d4816137bf565b965060208801356141e4816137bf565b95506040880135945060608801359350608088013560ff8116811461420857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561428257600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516142c181601785016020880161394d565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516142f281602884016020880161394d565b01602801949350505050565b60006020828403121561431057600080fd5b815161329d816137d4565b600081600019048311821515161561433557614335613fcb565b500290565b60008161434957614349613fcb565b506000190190565b6000825161436381846020870161394d565b919091019291505056feaae872cdab9eca592756bbacf3e549319d576c15de6bc32b676dbdf654ef264e84132bf9839ca99a4face5adf4402aad7745b07d336ac551b72b682ed396b7d0360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc616464726573732066726f6d2c6164647265737320746f2c75696e74323536206e6f6e63652c75696e743235362076616c6964556e74696c454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374299cf85f95575c3af1e116e3d37fd41e7f36a8a373623f51ffaaa87fdd032fa767416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a26469706673582212202d78e5422ea3c3c932670ba3d3dcf978d41425e71c7fa8cb8fc01b479b1cfec164736f6c63430008090033
Deployed Bytecode Sourcemap
97064:22647:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103288:891;;;;;;;;;;-1:-1:-1;103288:891:0;;;;;:::i;:::-;;:::i;:::-;;;2236:14:1;;2229:22;2211:41;;2199:2;2184:18;103288:891:0;;;;;;;;102655:343;;;;;;;;;;-1:-1:-1;102655:343:0;;;;;:::i;:::-;;:::i;:::-;;44615:215;;;;;;;;;;-1:-1:-1;44615:215:0;;;;;:::i;:::-;;:::i;97686:70::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;97686:70:0;;;;;3455:25:1;;;3443:2;3428:18;97686:70:0;3309:177:1;102128:86:0;;;;;;;;;;-1:-1:-1;102191:15:0;;;;;;;;;;;;-1:-1:-1;;;102191:15:0;;;;102128:86;;;;;;;:::i;107217:817::-;;;;;;;;;;-1:-1:-1;107217:817:0;;;;;:::i;:::-;;:::i;99447:1643::-;;;;;;;;;;-1:-1:-1;99447:1643:0;;;;;:::i;:::-;;:::i;98300:42::-;;;;;;;;;;-1:-1:-1;98300:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46471:131;;;;;;;;;;-1:-1:-1;46471:131:0;;;;;:::i;:::-;46545:7;46572:12;;;:6;:12;;;;;:22;;;;46471:131;97912:55;;;;;;;;;;-1:-1:-1;97912:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;97912:55:0;;;;;;;;;-1:-1:-1;;;97912:55:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;97912:55:0;;;;;;;;;;-1:-1:-1;;;;;8459:15:1;;;8441:34;;8511:15;;;8506:2;8491:18;;8484:43;8570:14;;8563:22;8543:18;;;8536:50;;;;8622:15;;;;8617:2;8602:18;;8595:43;8682:14;8675:22;8669:3;8654:19;;8647:51;8742:14;;8735:22;8421:3;8714:19;;8707:51;8789:3;8774:19;;8767:35;;;;8390:3;8375:19;97912:55:0;8106:702:1;97566:50:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;97566:50:0;;104187:463;;;;;;:::i;:::-;;:::i;46912:147::-;;;;;;;;;;-1:-1:-1;46912:147:0;;;;;:::i;:::-;;:::i;97802:26::-;;;;;;;;;;;;;;;;48056:218;;;;;;;;;;-1:-1:-1;48056:218:0;;;;;:::i;:::-;;:::i;67629:198::-;;;;;;;;;;-1:-1:-1;67629:198:0;;;;;:::i;:::-;;:::i;102034:86::-;;;;;;;;;;;;;:::i;108042:486::-;;;;;;:::i;:::-;;:::i;98170:69::-;;;;;;;;;;-1:-1:-1;98170:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;68158:223;;;;;;:::i;:::-;;:::i;67235:133::-;;;;;;;;;;;;;:::i;102222:84::-;;;;;;;;;;-1:-1:-1;102288:10:0;;;;;;;;;;;;-1:-1:-1;;;102288:10:0;;;;102222:84;;71123:86;;;;;;;;;;-1:-1:-1;71194:7:0;;;;71123:86;;104658:1040;;;;;;;;;;-1:-1:-1;104658:1040:0;;;;;:::i;:::-;;:::i;97623:56::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;97623:56:0;;103006:274;;;;;;;;;;-1:-1:-1;103006:274:0;;;;;:::i;:::-;;:::i;98433:48::-;;;;;;;;;;-1:-1:-1;98433:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;98351:41;;;;;;;;;;-1:-1:-1;98351:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;101957:69;;;;;;;;;;;;;:::i;44922:147::-;;;;;;;;;;-1:-1:-1;44922:147:0;;;;;:::i;:::-;;:::i;43860:49::-;;;;;;;;;;-1:-1:-1;43860:49:0;43905:4;43860:49;;108536:1784;;;;;;;;;;-1:-1:-1;108536:1784:0;;;;;:::i;:::-;;:::i;97765:30::-;;;;;;;;;;;;;;;;98675:71;;;;;;;;;;-1:-1:-1;98675:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;47352:149;;;;;;;;;;-1:-1:-1;47352:149:0;;;;;:::i;:::-;;:::i;97425:132::-;;;;;;;;;;;;;:::i;97835:36::-;;;;;;;;;;-1:-1:-1;97835:36:0;;;;-1:-1:-1;;;;;97835:36:0;;;;;;-1:-1:-1;;;;;14237:32:1;;;14219:51;;14207:2;14192:18;97835:36:0;14057:219:1;105706:1003:0;;;;;;;;;;-1:-1:-1;105706:1003:0;;;;;:::i;:::-;;:::i;97322:96::-;;;;;;;;;;;;;:::i;102314:333::-;;;;;;;;;;-1:-1:-1;102314:333:0;;;;;:::i;:::-;;:::i;103288:891::-;103636:4;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;103613:12:::2;101512:22;101529:4;101512:16;:22::i;:::-;103653:44:::3;;;::::0;;::::3;::::0;::::3;103670:15:::0;103653:44:::3;:::i;:::-;103687:9;;103653:16;:44::i;:::-;103708:12;103723:20;;::::0;::::3;:15:::0;:20:::3;:::i;:::-;103708:35:::0;-1:-1:-1;103760:32:0;;103756:120:::3;;103809:55;103823:20;;103845:12;103859:4;103809:13;:55::i;:::-;103892:4;103888:203;;;103898:77;-1:-1:-1::0;;;;;103898:48:0;::::3;103947:4:::0;103961::::3;103968:6:::0;103898:48:::3;:77::i;:::-;103888:203;;;103995:14:::0;;103991:100:::3;;104011:80;-1:-1:-1::0;;;;;104011:48:0;::::3;104060:4:::0;104074::::3;104081:9:::0;104011:48:::3;:80::i;:::-;104111:60;104127:12;104141:4;104147:6;104155:9;104166:4;104111:15;:60::i;:::-;104104:67:::0;103288:891;-1:-1:-1;;;;;;;;;;;;;103288:891:0:o;102655:343::-;43905:4;44351:16;43905:4;44351:10;:16::i;:::-;102780:5;102766:11:::1;::::0;102828:163:::1;102848:3;102844:1;:7;102828:163;;;102880:5;;102886:1;102880:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102903:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;:29;;;::::1;;-1:-1:-1::0;;102903:29:0;;::::1;;::::0;;102952:27;102873:15;;-1:-1:-1;102903:16:0;102952:27:::1;::::0;::::1;::::0;102922:10;2236:14:1;2229:22;2211:41;;2199:2;2184:18;;2071:187;102952:27:0::1;;;;;;;;102853:3:::0;::::1;::::0;::::1;:::i;:::-;;;;102828:163;;;;102755:243;;102655:343:::0;;;;:::o;44615:215::-;44700:4;-1:-1:-1;;;;;;44724:58:0;;-1:-1:-1;;;44724:58:0;;:98;;-1:-1:-1;;;;;;;;;;23626:51:0;;;44786:36;44717:105;44615:215;-1:-1:-1;;44615:215:0:o;107217:817::-;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;107549:2:::2;101331:17;101345:2;101331:13;:17::i;:::-;107569:12:::3;101512:22;101529:4;101512:16;:22::i;:::-;107596:6:::4;101238:20;101252:5;101238:13;:20::i;:::-;107615:44:::5;107632:15;107649:9;;107615:16;:44::i;:::-;107670:23;107681:3;107686:6;107670:10;:23::i;:::-;107719:20:::0;;107756:32;;107752:120:::5;;107805:55;107819:20;;107841:12;107855:4;107805:13;:55::i;:::-;107884:77;-1:-1:-1::0;;;;;107884:48:0;::::5;107933:4:::0;107947::::5;107954:6:::0;107884:48:::5;:77::i;:::-;107974:52;107980:12;107994:4;108000:8;108010:2;108014:6;108022:3;107974:5;:52::i;:::-;107604:430;101545:1:::4;101359::::3;70758::::2;107217:817:::0;;;;;;;;;;;:::o;99447:1643::-;16374:19;16397:13;;;;;;16396:14;;16444:34;;;;-1:-1:-1;16462:12:0;;16477:1;16462:12;;;;:16;16444:34;16443:108;;;-1:-1:-1;16523:4:0;5091:19;:23;;;16484:66;;-1:-1:-1;16533:12:0;;;;;:17;16484:66;16421:204;;;;-1:-1:-1;;;16421:204:0;;16706:2:1;16421:204:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:34;16764:18;;;16757:62;-1:-1:-1;;;16835:18:1;;;16828:44;16889:19;;16421:204:0;;;;;;;;;16636:12;:16;;-1:-1:-1;;16636:16:0;16651:1;16636:16;;;16663:67;;;;16698:13;:20;;-1:-1:-1;;16698:20:0;;;;;16663:67;-1:-1:-1;;;;;99688:28:0;::::1;::::0;;:64:::1;;-1:-1:-1::0;;;;;;99720:32:0;::::1;::::0;99688:64:::1;:90;;;-1:-1:-1::0;;;;;;99756:22:0;::::1;::::0;99688:90:::1;:134;;;-1:-1:-1::0;;;;;;99799:23:0;::::1;::::0;99688:134:::1;:164;;;-1:-1:-1::0;;;;;;99826:26:0;::::1;::::0;99688:164:::1;99670:219;;;99871:18;;-1:-1:-1::0;;;99871:18:0::1;;;;;;;;;;;99670:219;99902:16;:14;:16::i;:::-;99929:17;:15;:17::i;:::-;99957:22;:20;:22::i;:::-;99990:24;:22;:24::i;:::-;100027:40;43905:4;100058:8:::0;100027:10:::1;:40::i;:::-;100078:27;-1:-1:-1::0;;;;;;;;;;;100096:8:0::1;100078:10;:27::i;:::-;100116:28;-1:-1:-1::0;;;;;;;;;;;100134:9:0::1;100116:10;:28::i;:::-;100155:34;-1:-1:-1::0;;;;;;;;;;;100176:12:0::1;100155:10;:34::i;:::-;100200:47;-1:-1:-1::0;;;;;;;;;;;100228:18:0::1;100200:10;:47::i;:::-;100260:53;43905:4;::::0;100260:13:::1;:53::i;:::-;100324:50;-1:-1:-1::0;;;;;;;;;;;43905:4:0::1;100324:13;:50::i;:::-;100385:43;-1:-1:-1::0;;;;;;;;;;;43905:4:0::1;100385:13;:43::i;:::-;100439:40;-1:-1:-1::0;;;;;;;;;;;43905:4:0::1;100439:13;:40::i;:::-;100492:13;:30:::0;;-1:-1:-1;;;;;;100492:30:0::1;-1:-1:-1::0;;;;;100492:30:0;::::1;;::::0;;-1:-1:-1;100564:22:0;;:10:::1;:22;::::0;;;;:29;;-1:-1:-1;;100564:29:0::1;-1:-1:-1::0;100564:29:0::1;::::0;;:22;100786:13;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;100667:9:::1;::::0;100786:13:::1;::::0;;::::1;;100770:31;;;;;;100836:6;102191:15:::0;;;;;;;;;;;;-1:-1:-1;;;102191:15:0;;;;;102128:86;100836:6:::1;100820:24;;;;;;100879:9;102288:10:::0;;;;;;;;;;;;-1:-1:-1;;;102288:10:0;;;;;102222:84;100879:9:::1;100863:27:::0;;::::1;::::0;;::::1;::::0;100741:222:::1;::::0;;;;::::1;17178:25:1::0;;;;17219:18;;;17212:34;;;;17262:18;;;17255:34;;;;17305:18;;;17298:34;;;100943:4:0::1;17348:19:1::0;;;17341:61;17150:19;;100741:222:0::1;::::0;;-1:-1:-1;;100741:222:0;;::::1;::::0;;;;;;100717:257;;100741:222:::1;100717:257:::0;;::::1;::::0;100699:15:::1;:275:::0;101061:12:::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;;101024:55;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;101024:55:0;;::::1;::::0;;;;;;101001:81;;101024:55:::1;101001:81:::0;;::::1;::::0;100987:11:::1;:95:::0;-1:-1:-1;16752:102:0;;;;16803:5;16787:21;;-1:-1:-1;;16787:21:0;;;16828:14;;-1:-1:-1;18160:36:1;;16828:14:0;;18148:2:1;18133:18;16828:14:0;;;;;;;16752:102;16363:498;99447:1643;;;;;:::o;104187:463::-;104444:4;70728:19;:17;:19::i;:::-;101766:183:::1;;::::0;;::::1;::::0;::::1;104384:15:::0;101766:183:::1;:::i;:::-;104401:9:::0;;20846:10;101879:50:::1;101890:15;101907:9;;101918:4;101924;101879:10;:50::i;:::-;104473:169:::2;104511:1;20846:10:::0;104579:9:::2;104603;104627:4;104473:15;:169::i;:::-;104466:176:::0;104187:463;-1:-1:-1;;;;;;;;;104187:463:0:o;46912:147::-;46545:7;46572:12;;;:6;:12;;;;;:22;;;44351:16;44362:4;44351:10;:16::i;:::-;47026:25:::1;47037:4;47043:7;47026:10;:25::i;:::-;46912:147:::0;;;:::o;48056:218::-;-1:-1:-1;;;;;48152:23:0;;20846:10;48152:23;48144:83;;;;-1:-1:-1;;;48144:83:0;;18409:2:1;48144:83:0;;;18391:21:1;18448:2;18428:18;;;18421:30;18487:34;18467:18;;;18460:62;-1:-1:-1;;;18538:18:1;;;18531:45;18593:19;;48144:83:0;18207:411:1;48144:83:0;48240:26;48252:4;48258:7;48240:11;:26::i;:::-;48056:218;;:::o;67629:198::-;65936:4;-1:-1:-1;;;;;65945:6:0;65928:23;;;65920:80;;;;-1:-1:-1;;;65920:80:0;;;;;;;:::i;:::-;66043:6;-1:-1:-1;;;;;66019:30:0;:20;-1:-1:-1;;;;;;;;;;;58822:65:0;-1:-1:-1;;;;;58822:65:0;;58742:153;66019:20;-1:-1:-1;;;;;66019:30:0;;66011:87;;;;-1:-1:-1;;;66011:87:0;;;;;;;:::i;:::-;67711:36:::1;67729:17;67711;:36::i;:::-;67799:12;::::0;;67809:1:::1;67799:12:::0;;;::::1;::::0;::::1;::::0;;;67758:61:::1;::::0;67780:17;;67799:12;67758:21:::1;:61::i;:::-;67629:198:::0;:::o;102034:86::-;43905:4;44351:16;43905:4;44351:10;:16::i;:::-;102102:10:::1;:8;:10::i;108042:486::-:0;70728:19;:17;:19::i;:::-;108303:15;108320:9;;20846:10;101879:50:::1;101890:15;101907:9;;101918:4;101924;101879:10;:50::i;:::-;108367:2:::2;101331:17;101345:2;101331:13;:17::i;:::-;108393:9:::3;101238:20;101252:5;101238:13;:20::i;:::-;108420:26:::4;108431:3;108436:9;108420:10;:26::i;:::-;108459:61;108473:1;20846:10:::0;108491:8:::4;108501:2;108505:9;108516:3;108459:5;:61::i;:::-;101359:1:::3;101940::::2;70758::::1;;;;108042:486:::0;;;;;;:::o;68158:223::-;65936:4;-1:-1:-1;;;;;65945:6:0;65928:23;;;65920:80;;;;-1:-1:-1;;;65920:80:0;;;;;;;:::i;:::-;66043:6;-1:-1:-1;;;;;66019:30:0;:20;-1:-1:-1;;;;;;;;;;;58822:65:0;-1:-1:-1;;;;;58822:65:0;;58742:153;66019:20;-1:-1:-1;;;;;66019:30:0;;66011:87;;;;-1:-1:-1;;;66011:87:0;;;;;;;:::i;:::-;68274:36:::1;68292:17;68274;:36::i;:::-;68321:52;68343:17;68362:4;68368;68321:21;:52::i;67235:133::-:0;67313:7;66381:4;-1:-1:-1;;;;;66390:6:0;66373:23;;66365:92;;;;-1:-1:-1;;;66365:92:0;;19651:2:1;66365:92:0;;;19633:21:1;19690:2;19670:18;;;19663:30;19729:34;19709:18;;;19702:62;19800:26;19780:18;;;19773:54;19844:19;;66365:92:0;19449:420:1;66365:92:0;-1:-1:-1;;;;;;;;;;;;67235:133:0;:::o;104658:1040::-;104984:4;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;104940:12:::2;101512:22;101529:4;101512:16;:22::i;:::-;104967:6:::3;101238:20;101252:5;101238:13;:20::i;:::-;105001:44:::4;;;::::0;;::::4;::::0;::::4;105018:15:::0;105001:44:::4;:::i;:::-;105035:9;;105001:16;:44::i;:::-;105058:15;105076:6;:90;;-1:-1:-1::0;;;;;105126:30:0;;::::4;;::::0;;;:16:::4;:30;::::0;;;;;;;:40;;::::4;::::0;;;;;;;105076:90:::4;;;-1:-1:-1::0;;;;;105085:28:0;;::::4;;::::0;;;:14:::4;:28;::::0;;;;;;;:38;;::::4;::::0;;;;;;;105076:90:::4;105058:108;;105193:6;105183:7;:16;105179:47;;;105208:18;;-1:-1:-1::0;;;105208:18:0::4;;;;;;;;;;;105179:47;105284:6;105274:7;:16;105264:26;;105354:8;-1:-1:-1::0;;;;;105319:94:0::4;105340:12;-1:-1:-1::0;;;;;105319:94:0::4;;105364:7;105373:6;105381:5;105388:6;105396:16;105319:94;;;;;;;;;;:::i;:::-;;;;;;;;105430:6;105426:241;;;-1:-1:-1::0;;;;;105453:28:0;;::::4;;::::0;;;:14:::4;:28;::::0;;;;;;;:38;;::::4;::::0;;;;;;:48;;;105516:56:::4;105468:12:::0;105482:8;105565:6;105516:15:::4;:56::i;:::-;105426:241;;;-1:-1:-1::0;;;;;105605:30:0;;::::4;;::::0;;;:16:::4;:30;::::0;;;;;;;:40;;::::4;::::0;;;;;;:50;;;105426:241:::4;-1:-1:-1::0;105686:4:0::4;::::0;104658:1040;-1:-1:-1;;;;;;;;;;;104658:1040:0:o;103006:274::-;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;103107:20:0;::::2;103089:15;103107:20:::0;;;:13:::2;:20;::::0;;;;;;;;;103145:24;;3455:25:1;;;103107:20:0;;;103145:24:::2;::::0;3428:18:1;103145:24:0::2;;;;;;;103186:12:::0;;103182:91:::2;;103238:13;::::0;103215:46:::2;::::0;103231:5;;-1:-1:-1;;;;;103238:13:0::2;103253:7:::0;103215:15:::2;:46::i;101957:69::-:0;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;102010:8:::1;:6;:8::i;44922:147::-:0;45008:4;45032:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;45032:29:0;;;;;;;;;;;;;;;44922:147::o;108536:1784::-;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;108800:2:::2;101419:15;101431:2;101419:11;:15::i;:::-;108819:2:::3;101609:19;101625:2;101609:15;:19::i;:::-;108834:27:::4;108864:15:::0;;;:11:::4;:15;::::0;;;;;;;;108834:45;;::::4;::::0;::::4;::::0;;;;-1:-1:-1;;;;;108834:45:0;;::::4;::::0;;;;;::::4;::::0;;;::::4;::::0;;::::4;::::0;;;::::4;-1:-1:-1::0;;;108834:45:0;;;::::4;::::0;::::4;;;::::0;;;;;;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;;;::::4;::::0;::::4;;;::::0;;;;-1:-1:-1;;;108834:45:0;;::::4;::::0;;::::4;;;::::0;;;;::::4;::::0;;::::4;::::0;;;;;;108890:68:::4;::::0;108907:15;;108924:9;;;;108890:16:::4;:68::i;:::-;108971:29;109003:15:::0;;;:11:::4;:15;::::0;;;;109031:1282;::::4;;;109059:12;::::0;::::4;:19:::0;;-1:-1:-1;;;;;;;109059:19:0;;::::4;::::0;::::4;::::0;;;-1:-1:-1;109093:14:0;::::4;:21:::0;;;;::::4;::::0;;::::4;::::0;;109146:10:::4;::::0;::::4;::::0;-1:-1:-1;;109146:16:0::4;::::0;109159:3;;109146:16:::4;:::i;:::-;109129:33;;109177:64;109193:3;:16;;;109219:3;:12;;;109234:6;109177:15;:64::i;:::-;109293:16;::::0;::::4;::::0;-1:-1:-1;;;;;109279:31:0::4;109258:18;109279:31:::0;;;:13:::4;:31;::::0;;;;;109359:15;;109355:176:::4;;109409:16;::::0;::::4;::::0;;-1:-1:-1;;;;;109395:31:0;;::::4;109429:1;109395:31:::0;;;:13:::4;:31;::::0;;;;:35;109465:16;;109483:13:::4;::::0;109449:66:::4;::::0;109483:13:::4;109498:16;109511:3:::0;109498:10;:16:::4;:::i;:::-;109449:15;:66::i;:::-;109611:3;:8;;;-1:-1:-1::0;;;;;109552:103:0::4;109597:3;:12;;;-1:-1:-1::0;;;;;109552:103:0::4;109579:3;:16;;;-1:-1:-1::0;;;;;109552:103:0::4;-1:-1:-1::0;;;;;;;;;;;109575:2:0::4;109621:6;109629:1;109632:5:::0;109639:15:::4;109552:103;;;;;;;;;;:::i;:::-;;;;;;;;109044:623;;109031:1282;;;-1:-1:-1::0;;;;;109692:22:0;::::4;::::0;109688:614:::4;;109735:13;::::0;::::4;:24:::0;;-1:-1:-1;;;;;;109735:24:0::4;-1:-1:-1::0;;;;;109735:24:0;;::::4;::::0;;::::4;::::0;;;109860:8;;109832:16:::4;::::0;::::4;::::0;109870:10:::4;::::0;::::4;::::0;109783:142:::4;::::0;;;::::4;::::0;;;;::::4;::::0;-1:-1:-1;;;;;;;;;;;109783:142:0;::::4;::::0;109828:2;;109870:10;-1:-1:-1;;;;109892:14:0::4;::::0;109783:142:::4;:::i;:::-;;;;;;;;109688:614;;;110052:3;:8;;;-1:-1:-1::0;;;;;109971:148:0::4;110038:3;:12;;;-1:-1:-1::0;;;;;109971:148:0::4;110020:3;:16;;;-1:-1:-1::0;;;;;109971:148:0::4;-1:-1:-1::0;;;;;;;;;;;110016:2:0::4;110062:3;:10;;;110074:1;110077:5:::0;110084:16:::4;109971:148;;;;;;;;;;:::i;:::-;;;;;;;;110157:4;110140:14:::0;::::4;:21:::0;;-1:-1:-1;;;;110140:21:0::4;-1:-1:-1::0;;;110140:21:0::4;::::0;;110238:16:::4;::::0;::::4;::::0;110264:8;;110275:10:::4;::::0;::::4;::::0;110222:64:::4;::::0;110238:16;110264:8;110222:15:::4;:64::i;47352:149::-:0;46545:7;46572:12;;;:6;:12;;;;;:22;;;44351:16;44362:4;44351:10;:16::i;:::-;47467:26:::1;47479:4;47485:7;47467:11;:26::i;97425:132::-:0;;;;;;;;;;;;;;;;;;;:::o;105706:1003::-;-1:-1:-1;;;;;;;;;;;44351:16:0;44362:4;44351:10;:16::i;:::-;70728:19:::1;:17;:19::i;:::-;106049:2:::2;101331:17;101345:2;101331:13;:17::i;:::-;106063:3:::3;106068:6;101715:23;101726:3;101731:6;101715:10;:23::i;:::-;106087:60:::4;106104:15;106121:9;;106132:8;106142:4;106087:16;:60::i;:::-;106158:54;106163:12;106177:8;106187:4;106193:2;106197:6;106205;106158:4;:54::i;:::-;106281:4;-1:-1:-1::0;;;;;106230:92:0::4;106271:8;-1:-1:-1::0;;;;;106230:92:0::4;106257:12;-1:-1:-1::0;;;;;106230:92:0::4;-1:-1:-1::0;;;;;;;;;;;106253:2:0::4;106287:6;106295:3;106300:4;106306:15;106230:92;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;106349:27:0;::::4;106335:11;106349:27:::0;;;:13:::4;:27;::::0;;;;;106423:12;;;::::4;::::0;106456:8;;106452:114:::4;;-1:-1:-1::0;;;;;106485:27:0;::::4;106515:1;106485:27:::0;;;:13:::4;:27;::::0;;;;:31;106541:9;;::::4;::::0;106452:114:::4;106619:13;::::0;106589:49:::4;::::0;106605:12;;-1:-1:-1;;;;;106619:13:0::4;106634:3:::0;106589:15:::4;:49::i;:::-;106649:52;106665:12;106687:4;106694:6;106649:15;:52::i;97322:96::-:0;;;;;;;;;;;;;;;;;;;:::o;102314:333::-;43905:4;44351:16;43905:4;44351:10;:16::i;:::-;102451::::1;101144:18;101157:4;101144:12;:18::i;:::-;-1:-1:-1::0;;;;;102489:30:0;::::2;102485:61;;102528:18;;-1:-1:-1::0;;;102528:18:0::2;;;;;;;;;;;102485:61;102557:13;:32:::0;;-1:-1:-1;;;;;;102557:32:0::2;-1:-1:-1::0;;;;;102557:32:0;::::2;::::0;;::::2;::::0;;;102605:34:::2;::::0;::::2;::::0;-1:-1:-1;;102605:34:0::2;44378:1:::1;102314:333:::0;;:::o;45373:105::-;45440:30;45451:4;20846:10;45440;:30::i;71282:108::-;71194:7;;;;71352:9;71344:38;;;;-1:-1:-1;;;71344:38:0;;22237:2:1;71344:38:0;;;22219:21:1;22276:2;22256:18;;;22249:30;-1:-1:-1;;;22295:18:1;;;22288:46;22351:18;;71344:38:0;22035:340:1;71344:38:0;71282:108::o;112859:123::-;-1:-1:-1;;;;;112928:16:0;;;;;;:10;:16;;;;;;;;112923:51;;112953:21;;-1:-1:-1;;;112953:21:0;;;;;;;;;;;117259:1033;117393:20;;-1:-1:-1;;;;;117386:28:0;117370:13;117386:28;;;:6;:28;;;;;;;;117429:21;;;;:30;;117425:54;;117468:11;;-1:-1:-1;;;117468:11:0;;;;;;;;;;;117425:54;117523:15;117494;:26;;;:44;117490:70;;;117547:13;;-1:-1:-1;;;117547:13:0;;;;;;;;;;;117490:70;117573:14;117678:15;;117787:11;;117841:15;:20;;;-1:-1:-1;;;;;117825:38:0;117906:12;20846:10;;118975:147;117906:12;-1:-1:-1;;;;;117890:30:0;117947:15;:21;;;117995:15;:26;;;117744:300;;;;;;;;;;;22621:19:1;;;22665:2;22656:12;;22649:28;;;;22702:2;22693:12;;22686:28;;;;22739:2;22730:12;;22723:28;22776:3;22767:13;;22760:29;22814:3;22805:13;;22380:444;117744:300:0;;;;;;;;;;;;;117712:351;;;;;;117614:464;;;;;;;;;:::i;:::-;;;;;;;;;;;;;117590:499;;;;;;117573:516;;118135:15;:20;;;-1:-1:-1;;;;;118106:49:0;:25;118121:9;;118106:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;118106:6:0;;:25;-1:-1:-1;;118106:14:0;:25;-1:-1:-1;118106:25:0:i;:::-;-1:-1:-1;;;;;118106:49:0;;118102:104;;118179:15;;-1:-1:-1;;;118179:15:0;;;;;;;;;;;118102:104;-1:-1:-1;;118250:20:0;;-1:-1:-1;;;;;118243:28:0;;;;;:6;:28;;;;;:30;;;;;;-1:-1:-1;;117259:1033:0:o;118445:522::-;118561:13;;;;;;;118672:95;;;;118683:20;118672:95;:::i;:::-;118560:207;;;;;;;;;;;;;;118803:4;-1:-1:-1;;;;;118784:24:0;:7;-1:-1:-1;;;;;118784:24:0;;;:41;;;;118821:4;-1:-1:-1;;;;;118812:13:0;:5;-1:-1:-1;;;;;118812:13:0;;;118784:41;118780:96;;;118849:15;;-1:-1:-1;;;118849:15:0;;;;;;;;;;;118780:96;118888:71;;-1:-1:-1;;;118888:71:0;;-1:-1:-1;;;;;24443:15:1;;;118888:71:0;;;24425:34:1;24495:15;;;24475:18;;;24468:43;24527:18;;;24520:34;;;24570:18;;;24563:34;;;24646:4;24634:17;;24613:19;;;24606:46;24668:19;;;24661:35;;;24712:19;;;24705:35;;;118888:29:0;;;;;24359:19:1;;118888:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80804:216;80943:68;;-1:-1:-1;;;;;25009:15:1;;;80943:68:0;;;24991:34:1;25061:15;;25041:18;;;25034:43;25093:18;;;25086:34;;;80916:96:0;;80936:5;;-1:-1:-1;;;80966:27:0;24926:18:1;;80943:68:0;;;;-1:-1:-1;;80943:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;80943:68:0;-1:-1:-1;;;;;;80943:68:0;;;;;;;;;;80916:19;:96::i;:::-;80804:216;;;;:::o;111145:1118::-;111321:4;111295:6;101238:20;101252:5;101238:13;:20::i;:::-;111357:9:::1;111347:6;:19;111343:50;;111375:18;;-1:-1:-1::0;;;111375:18:0::1;;;;;;;;;;;111343:50;111404:15;111482:6:::0;111507:14;;111503:178:::1;;-1:-1:-1::0;;;;;;111572:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;;:39;::::1;111542:69:::0;;111647:18;;::::1;111503:178;111701:4;111697:418;;;-1:-1:-1::0;;;;;111767:28:0;;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;:38;;::::1;::::0;;;;;;;;:55;::::1;111726:96:::0;;;;111767:55;-1:-1:-1;111697:418:0::1;;;-1:-1:-1::0;;;;;111973:30:0;;::::1;;::::0;;;:16:::1;:30;::::0;;;;;;;:40;;::::1;::::0;;;;;;;;:57;::::1;111930:100:::0;;;;111973:57;-1:-1:-1;111697:418:0::1;111432:694;112178:8;-1:-1:-1::0;;;;;112143:90:0::1;112164:12;-1:-1:-1::0;;;;;112143:90:0::1;;112188:7;112197:6;112205:5;112212:4;112218:14;112143:90;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;112251:4:0::1;::::0;111145:1118;-1:-1:-1;;;;;;;111145:1118:0:o;112513:166::-;112572:27;112602:15;;;:11;:15;;;;;;;;;112572:45;;;;;;;;;-1:-1:-1;;;;;112572:45:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112572:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112572:45:0;;;;;;;;;;;;;;;;;;112632:22;112628:43;;112663:8;;-1:-1:-1;;;112663:8:0;;;;;;;;;;;112396:109;112462:10;112458:39;;112481:16;;-1:-1:-1;;;112481:16:0;;;;;;;;;;;118300:137;118377:8;;;:25;;;118396:6;118389:3;:13;;118377:25;118373:56;;;118411:18;;-1:-1:-1;;;118411:18:0;;;;;;;;;;;110328:545;-1:-1:-1;;;;;110558:27:0;;110471:19;110558:27;;;:13;:27;;;;;;;:33;;110528:63;;110627:12;110588:3;110627:6;:12;:::i;:::-;110613:26;;110670:80;;;;;;;;110687:4;-1:-1:-1;;;;;110670:80:0;;;;;110693:8;-1:-1:-1;;;;;110670:80:0;;;;;110703:5;110670:80;;;;;;110710:12;-1:-1:-1;;;;;110670:80:0;;;;;110724:5;110670:80;;;;;;110731:5;110670:80;;;;;;110738:11;110670:80;;;110652:11;:15;110664:2;110652:15;;;;;;;;;;;:98;;;;;;;;;;;;;-1:-1:-1;;;;;110652:98:0;;;;;-1:-1:-1;;;;;110652:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110652:98:0;;;;;-1:-1:-1;;;;;110652:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110652:98:0;;;;;-1:-1:-1;;;;;110652:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110819:4;-1:-1:-1;;;;;110768:97:0;110809:8;-1:-1:-1;;;;;110768:97:0;110795:12;-1:-1:-1;;;;;110768:97:0;-1:-1:-1;;;;;;;;;;;110791:2:0;110825:11;110838:3;110843:5;110850:14;110768:97;;;;;;;;;;:::i;:::-;;;;;;;;110460:413;110328:545;;;;;;:::o;20622:60::-;18517:13;;;;;;;18509:69;;;;-1:-1:-1;;;18509:69:0;;;;;;;:::i;70293:99::-;18517:13;;;;;;;18509:69;;;;-1:-1:-1;;;18509:69:0;;;;;;;:::i;:::-;70357:27:::1;:25;:27::i;49653:238::-:0;49737:22;49745:4;49751:7;49737;:22::i;:::-;49732:152;;49776:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;49776:29:0;;;;;;;;;:36;;-1:-1:-1;;49776:36:0;49808:4;49776:36;;;49859:12;20846:10;;118975:147;49859:12;-1:-1:-1;;;;;49832:40:0;49850:7;-1:-1:-1;;;;;49832:40:0;49844:4;49832:40;;;;;;;;;;49653:238;;:::o;49225:251::-;49309:25;46572:12;;;:6;:12;;;;;;:22;;;;49366:34;;;;49416:52;;46572:22;;49366:34;;46572:22;;:12;;49416:52;;49309:25;49416:52;49298:178;49225:251;;:::o;114599:1234::-;114802:18;;;;;-1:-1:-1;;;;;114795:26:0;114779:13;114795:26;;;:6;:26;;;;;;;;;114836:21;;;;:30;;114832:54;;114875:11;;-1:-1:-1;;;114875:11:0;;;;;;;;;;;114832:54;114930:15;114901;:26;;;:44;114897:70;;;114954:13;;-1:-1:-1;;;114954:13:0;;;;;;;;;;;114897:70;114980:14;115085:15;;115194:11;;115248:15;:20;;;-1:-1:-1;;;;;115232:38:0;115313:15;:18;;;-1:-1:-1;;;;;115297:36:0;115360:15;:21;;;115408:15;:26;;;115151:306;;;;;;;;;;;22621:19:1;;;22665:2;22656:12;;22649:28;;;;22702:2;22693:12;;22686:28;;;;22739:2;22730:12;;22723:28;22776:3;22767:13;;22760:29;22814:3;22805:13;;22380:444;115151:306:0;;;;;;;;;;;;;115119:357;;;;;;115021:470;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114997:505;;;;;;114980:522;;115541:8;-1:-1:-1;;;;;115519:30:0;:15;:18;;;-1:-1:-1;;;;;115519:30:0;;;:60;;;;;115575:4;-1:-1:-1;;;;;115553:26:0;:15;:18;;;-1:-1:-1;;;;;115553:26:0;;;115519:60;115515:115;;;115603:15;;-1:-1:-1;;;115603:15:0;;;;;;;;;;;115515:115;115647:51;-1:-1:-1;;;;;;;;;;;115672:25:0;115687:9;;115672:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;115672:6:0;;:25;-1:-1:-1;;115672:14:0;:25;-1:-1:-1;115672:25:0:i;115647:51::-;115642:107;;115722:15;;-1:-1:-1;;;115722:15:0;;;;;;;;;;;115642:107;-1:-1:-1;;;;115793:18:0;;;;;-1:-1:-1;;;;;115786:26:0;;;;;:6;:26;;;-1:-1:-1;;115786:26:0;;;:28;;;;;;114599:1234::o;50071:239::-;50155:22;50163:4;50169:7;50155;:22::i;:::-;50151:152;;;50226:5;50194:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;50194:29:0;;;;;;;;;;:37;;-1:-1:-1;;50194:37:0;;;50251:40;20846:10;;50194:12;;50251:40;;50226:5;50251:40;50071:239;;:::o;119325:85::-;43905:4;44351:16;43905:4;44351:10;:16::i;60144:958::-;58086:66;60564:59;;;60560:535;;;60640:37;60659:17;60640:18;:37::i;60560:535::-;60743:17;-1:-1:-1;;;;;60714:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60714:63:0;;;;;;;;-1:-1:-1;;60714:63:0;;;;;;;;;;;;:::i;:::-;;;60710:306;;60944:56;;-1:-1:-1;;;60944:56:0;;25934:2:1;60944:56:0;;;25916:21:1;25973:2;25953:18;;;25946:30;26012:34;25992:18;;;25985:62;-1:-1:-1;;;26063:18:1;;;26056:44;26117:19;;60944:56:0;25732:410:1;60710:306:0;-1:-1:-1;;;;;;;;;;;60828:28:0;;60820:82;;;;-1:-1:-1;;;60820:82:0;;26349:2:1;60820:82:0;;;26331:21:1;26388:2;26368:18;;;26361:30;26427:34;26407:18;;;26400:62;-1:-1:-1;;;26478:18:1;;;26471:39;26527:19;;60820:82:0;26147:405:1;60820:82:0;60778:140;61030:53;61048:17;61067:4;61073:9;61030:17;:53::i;71978:120::-;70987:16;:14;:16::i;:::-;72037:7:::1;:15:::0;;-1:-1:-1;;72037:15:0::1;::::0;;72068:22:::1;20846:10:::0;72077:12:::1;72068:22;::::0;-1:-1:-1;;;;;14237:32:1;;;14219:51;;14207:2;14192:18;72068:22:0::1;;;;;;;71978:120::o:0;110881:256::-;-1:-1:-1;;;;;110980:19:0;;110976:154;;111016:20;-1:-1:-1;;;;;111016:12:0;;111029:6;111016:12;:20::i;110976:154::-;111069:49;-1:-1:-1;;;;;111069:37:0;;111107:2;111111:6;111069:37;:49::i;71719:118::-;70728:19;:17;:19::i;:::-;71779:7:::1;:14:::0;;-1:-1:-1;;71779:14:0::1;71789:4;71779:14;::::0;;71809:20:::1;71816:12;20846:10:::0;;118975:147;112687:164;112744:27;112774:15;;;:11;:15;;;;;;;;;112744:45;;;;;;;;;-1:-1:-1;;;;;112744:45:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112744:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112744:45:0;;;;;;;;;;;;;;;;;;112800:43;;112835:8;;-1:-1:-1;;;112835:8:0;;;;;;;;;;;112990:174;113051:27;113081:15;;;:11;:15;;;;;;;;;113051:45;;;;;;;;;-1:-1:-1;;;;;113051:45:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;113051:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;113051:45:0;;;;;;;;;;;;;;;;;;;113107:49;;113133:23;;-1:-1:-1;;;113133:23:0;;;;;;;;;;;115841:1410;116055:8;-1:-1:-1;;;;;116031:32:0;:15;:20;;;-1:-1:-1;;;;;116031:32:0;;116027:284;;116108:4;-1:-1:-1;;;;;116084:28:0;:15;:20;;;-1:-1:-1;;;;;116084:28:0;;116080:59;;116121:18;;-1:-1:-1;;;116121:18:0;;;;;;;;;;;116080:59;116180:8;-1:-1:-1;;;;;116158:30:0;:15;:18;;;-1:-1:-1;;;;;116158:30:0;;116154:58;;116197:15;;-1:-1:-1;;;116197:15:0;;;;;;;;;;;116154:58;116027:284;;;116271:4;-1:-1:-1;;;;;116249:26:0;:15;:18;;;-1:-1:-1;;;;;116249:26:0;;116245:54;;116284:15;;-1:-1:-1;;;116284:15:0;;;;;;;;;;;116245:54;116346:20;;-1:-1:-1;;;;;116339:28:0;116323:13;116339:28;;;:6;:28;;;;;;;;116382:21;;;;:30;;116378:54;;116421:11;;-1:-1:-1;;;116421:11:0;;;;;;;;;;;116378:54;116476:15;116447;:26;;;:44;116443:70;;;116500:13;;-1:-1:-1;;;116500:13:0;;;;;;;;;;;116443:70;116526:14;116631:15;;116740:11;;116794:15;:20;;;-1:-1:-1;;;;;116778:38:0;116859:15;:18;;;-1:-1:-1;;;;;116843:36:0;116906:15;:21;;;116954:15;:26;;;116697:306;;;;;;;;;;;22621:19:1;;;22665:2;22656:12;;22649:28;;;;22702:2;22693:12;;22686:28;;;;22739:2;22730:12;;22723:28;22776:3;22767:13;;22760:29;22814:3;22805:13;;22380:444;116697:306:0;;;;;;;;;;;;;116665:357;;;;;;116567:470;;;;;;;;;:::i;:::-;;;;;;;;;;;;;116543:505;;;;;;116526:522;;117094:15;:20;;;-1:-1:-1;;;;;117065:49:0;:25;117080:9;;117065:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;117065:6:0;;:25;-1:-1:-1;;117065:14:0;:25;-1:-1:-1;117065:25:0:i;:::-;-1:-1:-1;;;;;117065:49:0;;117061:104;;117138:15;;-1:-1:-1;;;117138:15:0;;;;;;;;;;;117061:104;-1:-1:-1;;117209:20:0;;-1:-1:-1;;;;;117202:28:0;;;;;:6;:28;;;;;:30;;;;;;-1:-1:-1;;;;115841:1410:0:o;106717:492::-;106868:12;101512:22;101529:4;101512:16;:22::i;:::-;106904:2:::1;101331:17;101345:2;101331:13;:17::i;:::-;106930:6:::2;101238:20;101252:5;101238:13;:20::i;:::-;106959:8:::3;101144:18;101157:4;101144:12;:18::i;:::-;107047:51:::4;107059:12;107073:8;107083:6;107091;107047:11;:51::i;:::-;-1:-1:-1::0;;107129:72:0::4;::::0;;::::4;::::0;::::4;::::0;;-1:-1:-1;;;;;107129:72:0;;::::4;::::0;;;;::::4;;::::0;;::::4;::::0;;;107162:4:::4;107129:72:::0;;;;;;;;::::4;::::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107111:15:0;;;:11:::4;:15:::0;;;;;;;:90;;;;-1:-1:-1;;;;;;107111:90:0::4;::::0;;::::4;;::::0;;;;;;::::4;::::0;;;;;;::::4;-1:-1:-1::0;;;;;;107111:90:0;;;;-1:-1:-1;;;107111:90:0;::::4;;::::0;::::4;;::::0;;;;::::4;::::0;::::4;::::0;;;;;;;;;::::4;::::0;;;;;;;;;::::4;;;::::0;;;::::4;-1:-1:-1::0;;;;107111:90:0::4;-1:-1:-1::0;;;107111:90:0;::::4;;::::0;;;::::4;::::0;;;::::4;::::0;;;;::::4;::::0;;::::4;::::0;;;;-1:-1:-1;;;106717:492:0:o;112271:117::-;-1:-1:-1;;;;;112335:18:0;;112331:49;;112362:18;;-1:-1:-1;;;112362:18:0;;;;;;;;;;;45768:514;45857:22;45865:4;45871:7;45857;:22::i;:::-;45852:423;;46045:39;46076:7;46045:30;:39::i;:::-;46157:49;46196:4;46203:2;46157:30;:49::i;:::-;45950:279;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45950:279:0;;;;;;;;;;-1:-1:-1;;;45896:367:0;;;;;;;:::i;90441:231::-;90519:7;90540:17;90559:18;90581:27;90592:4;90598:9;90581:10;:27::i;:::-;90539:69;;;;90619:18;90631:5;90619:11;:18::i;:::-;-1:-1:-1;90655:9:0;90441:231;-1:-1:-1;;;90441:231:0:o;84794:660::-;85229:23;85255:69;85283:4;85255:69;;;;;;;;;;;;;;;;;85263:5;-1:-1:-1;;;;;85255:27:0;;;:69;;;;;:::i;:::-;85229:95;;85343:10;:17;85364:1;85343:22;:56;;;;85380:10;85369:30;;;;;;;;;;;;:::i;:::-;85335:111;;;;-1:-1:-1;;;85335:111:0;;28008:2:1;85335:111:0;;;27990:21:1;28047:2;28027:18;;;28020:30;28086:34;28066:18;;;28059:62;-1:-1:-1;;;28137:18:1;;;28130:40;28187:19;;85335:111:0;27806:406:1;70400:97:0;18517:13;;;;;;;18509:69;;;;-1:-1:-1;;;18509:69:0;;;;;;;:::i;:::-;70474:7:::1;:15:::0;;-1:-1:-1;;70474:15:0::1;::::0;;70400:97::o;58991:284::-;-1:-1:-1;;;;;5091:19:0;;;59065:106;;;;-1:-1:-1;;;59065:106:0;;28419:2:1;59065:106:0;;;28401:21:1;28458:2;28438:18;;;28431:30;28497:34;28477:18;;;28470:62;-1:-1:-1;;;28548:18:1;;;28541:43;28601:19;;59065:106:0;28217:409:1;59065:106:0;-1:-1:-1;;;;;;;;;;;59182:85:0;;-1:-1:-1;;;;;;59182:85:0;-1:-1:-1;;;;;59182:85:0;;;;;;;;;;58991:284::o;59684:281::-;59793:29;59804:17;59793:10;:29::i;:::-;59851:1;59837:4;:11;:15;:28;;;;59856:9;59837:28;59833:125;;;59882:64;59922:17;59941:4;59882:39;:64::i;71467:108::-;71194:7;;;;71526:41;;;;-1:-1:-1;;;71526:41:0;;28833:2:1;71526:41:0;;;28815:21:1;28872:2;28852:18;;;28845:30;-1:-1:-1;;;28891:18:1;;;28884:50;28951:18;;71526:41:0;28631:344:1;6055:317:0;6170:6;6145:21;:31;;6137:73;;;;-1:-1:-1;;;6137:73:0;;29182:2:1;6137:73:0;;;29164:21:1;29221:2;29201:18;;;29194:30;29260:31;29240:18;;;29233:59;29309:18;;6137:73:0;28980:353:1;6137:73:0;6224:12;6242:9;-1:-1:-1;;;;;6242:14:0;6264:6;6242:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6223:52;;;6294:7;6286:78;;;;-1:-1:-1;;;6286:78:0;;29750:2:1;6286:78:0;;;29732:21:1;29789:2;29769:18;;;29762:30;29828:34;29808:18;;;29801:62;29899:28;29879:18;;;29872:56;29945:19;;6286:78:0;29548:422:1;80371:188:0;80492:58;;-1:-1:-1;;;;;30167:32:1;;80492:58:0;;;30149:51:1;30216:18;;;30209:34;;;80465:86:0;;80485:5;;-1:-1:-1;;;80515:23:0;30122:18:1;;80492:58:0;29975:274:1;113574:1017:0;113683:15;113715:6;113711:763;;;-1:-1:-1;;;;;;113748:28:0;;;;;;;:14;:28;;;;;;;;:38;;;;;;;;;;113805:16;;;113801:47;;;113830:18;;-1:-1:-1;;;113830:18:0;;;;;;;;;;;113801:47;-1:-1:-1;;;;;113948:28:0;;;;;;;:14;:28;;;;;;;;:38;;;;;;;;;113902:16;;;;113948:48;;;;113711:763;;;-1:-1:-1;;;;;114033:26:0;;114029:60;;114068:21;;-1:-1:-1;;;114068:21:0;;;;;;;;;;;114029:60;-1:-1:-1;;;;;;114114:30:0;;;;;;;:16;:30;;;;;;;;:40;;;;;;;;;;114173:16;;;114169:47;;;114198:18;;-1:-1:-1;;;114198:18:0;;;;;;;;;;;114169:47;114231:81;-1:-1:-1;;;;;114231:48:0;;114280:8;114298:4;114305:6;114231:48;:81::i;:::-;-1:-1:-1;;;;;114412:30:0;;;;;;;:16;:30;;;;;;;;:40;;;;;;;;;114366:16;;;;114412:50;;;;113711:763;114526:8;-1:-1:-1;;;;;114491:92:0;114512:12;-1:-1:-1;;;;;114491:92:0;;114536:7;114545:6;114553:4;114559:6;114567:15;114491:92;;;;;;;;;;:::i;:::-;;;;;;;;113672:919;113574:1017;;;;:::o;41230:151::-;41288:13;41321:52;-1:-1:-1;;;;;41333:22:0;;39072:2;40626:447;40701:13;40727:19;40759:10;40763:6;40759:1;:10;:::i;:::-;:14;;40772:1;40759:14;:::i;:::-;-1:-1:-1;;;;;40749:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40749:25:0;;40727:47;;-1:-1:-1;;;40785:6:0;40792:1;40785:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;40785:15:0;;;;;;;;;-1:-1:-1;;;40811:6:0;40818:1;40811:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;40811:15:0;;;;;;;;-1:-1:-1;40842:9:0;40854:10;40858:6;40854:1;:10;:::i;:::-;:14;;40867:1;40854:14;:::i;:::-;40842:26;;40837:131;40874:1;40870;:5;40837:131;;;-1:-1:-1;;;40918:5:0;40926:3;40918:11;40909:21;;;;;;;:::i;:::-;;;;40897:6;40904:1;40897:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;40897:33:0;;;;;;;;-1:-1:-1;40955:1:0;40945:11;;;;;40877:3;;;:::i;:::-;;;40837:131;;;-1:-1:-1;40986:10:0;;40978:55;;;;-1:-1:-1;;;40978:55:0;;30770:2:1;40978:55:0;;;30752:21:1;;;30789:18;;;30782:30;30848:34;30828:18;;;30821:62;30900:18;;40978:55:0;30568:356:1;40978:55:0;41058:6;40626:447;-1:-1:-1;;;40626:447:0:o;88892:747::-;88973:7;88982:12;89011:9;:16;89031:2;89011:22;89007:625;;;89355:4;89340:20;;89334:27;89405:4;89390:20;;89384:27;89463:4;89448:20;;89442:27;89050:9;89434:36;89506:25;89517:4;89434:36;89334:27;89384;89506:10;:25::i;:::-;89499:32;;;;;;;;;89007:625;-1:-1:-1;89580:1:0;;-1:-1:-1;89584:35:0;89007:625;88892:747;;;;;:::o;87285:521::-;87363:20;87354:5;:29;;;;;;;;:::i;:::-;;87350:449;;;87285:521;:::o;87350:449::-;87461:29;87452:5;:38;;;;;;;;:::i;:::-;;87448:351;;;87507:34;;-1:-1:-1;;;87507:34:0;;31131:2:1;87507:34:0;;;31113:21:1;31170:2;31150:18;;;31143:30;31209:26;31189:18;;;31182:54;31253:18;;87507:34:0;30929:348:1;87448:351:0;87572:35;87563:5;:44;;;;;;;;:::i;:::-;;87559:240;;;87624:41;;-1:-1:-1;;;87624:41:0;;31484:2:1;87624:41:0;;;31466:21:1;31523:2;31503:18;;;31496:30;31562:33;31542:18;;;31535:61;31613:18;;87624:41:0;31282:355:1;87559:240:0;87696:30;87687:5;:39;;;;;;;;:::i;:::-;;87683:116;;;87743:44;;-1:-1:-1;;;87743:44:0;;31844:2:1;87743:44:0;;;31826:21:1;31883:2;31863:18;;;31856:30;31922:34;31902:18;;;31895:62;-1:-1:-1;;;31973:18:1;;;31966:32;32015:19;;87743:44:0;31642:398:1;7551:229:0;7688:12;7720:52;7742:6;7750:4;7756:1;7759:12;7720:21;:52::i;:::-;7713:59;7551:229;-1:-1:-1;;;;7551:229:0:o;59388:155::-;59455:37;59474:17;59455:18;:37::i;:::-;59508:27;;-1:-1:-1;;;;;59508:27:0;;;;;;;;59388:155;:::o;10188:200::-;10271:12;10303:77;10324:6;10332:4;10303:77;;;;;;;;;;;;;;;;;:20;:77::i;91825:1477::-;91913:7;;92847:66;92834:79;;92830:163;;;-1:-1:-1;92946:1:0;;-1:-1:-1;92950:30:0;92930:51;;92830:163;93107:24;;;93090:14;93107:24;;;;;;;;;32272:25:1;;;32345:4;32333:17;;32313:18;;;32306:45;;;;32367:18;;;32360:34;;;32410:18;;;32403:34;;;93107:24:0;;32244:19:1;;93107:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;93107:24:0;;-1:-1:-1;;93107:24:0;;;-1:-1:-1;;;;;;;93146:20:0;;93142:103;;93199:1;93203:29;93183:50;;;;;;;93142:103;93265:6;-1:-1:-1;93273:20:0;;-1:-1:-1;91825:1477:0;;;;;;;;:::o;8637:455::-;8807:12;8865:5;8840:21;:30;;8832:81;;;;-1:-1:-1;;;8832:81:0;;32650:2:1;8832:81:0;;;32632:21:1;32689:2;32669:18;;;32662:30;32728:34;32708:18;;;32701:62;-1:-1:-1;;;32779:18:1;;;32772:36;32825:19;;8832:81:0;32448:402:1;8832:81:0;8925:12;8939:23;8966:6;-1:-1:-1;;;;;8966:11:0;8985:5;8992:4;8966:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8924:73;;;;9015:69;9042:6;9050:7;9059:10;9071:12;9015:26;:69::i;:::-;9008:76;8637:455;-1:-1:-1;;;;;;;8637:455:0:o;10582:332::-;10727:12;10753;10767:23;10794:6;-1:-1:-1;;;;;10794:19:0;10814:4;10794:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10752:67;;;;10837:69;10864:6;10872:7;10881:10;10893:12;10837:26;:69::i;:::-;10830:76;10582:332;-1:-1:-1;;;;;;10582:332:0:o;11210:644::-;11395:12;11424:7;11420:427;;;11452:17;;11448:290;;-1:-1:-1;;;;;5091:19:0;;;11662:60;;;;-1:-1:-1;;;11662:60:0;;33336:2:1;11662:60:0;;;33318:21:1;33375:2;33355:18;;;33348:30;33414:31;33394:18;;;33387:59;33463:18;;11662:60:0;33134:353:1;11662:60:0;-1:-1:-1;11759:10:0;11752:17;;11420:427;11802:33;11810:10;11822:12;12557:17;;:21;12553:388;;12789:10;12783:17;12846:15;12833:10;12829:2;12825:19;12818:44;12553:388;12916:12;12909:20;;-1:-1:-1;;;12909:20:0;;;;;;;;:::i;14:164:1:-;82:5;127:3;118:6;113:3;109:16;105:26;102:46;;;144:1;141;134:12;102:46;-1:-1:-1;166:6:1;14:164;-1:-1:-1;14:164:1:o;183:347::-;234:8;244:6;298:3;291:4;283:6;279:17;275:27;265:55;;316:1;313;306:12;265:55;-1:-1:-1;339:20:1;;-1:-1:-1;;;;;371:30:1;;368:50;;;414:1;411;404:12;368:50;451:4;443:6;439:17;427:29;;503:3;496:4;487:6;479;475:19;471:30;468:39;465:59;;;520:1;517;510:12;535:131;-1:-1:-1;;;;;610:31:1;;600:42;;590:70;;656:1;653;646:12;671:118;757:5;750:13;743:21;736:5;733:32;723:60;;779:1;776;769:12;794:1272;961:6;969;977;985;993;1001;1009;1017;1025;1078:3;1066:9;1057:7;1053:23;1049:33;1046:53;;;1095:1;1092;1085:12;1046:53;1118:62;1172:7;1161:9;1118:62;:::i;:::-;1108:72;;1231:3;1220:9;1216:19;1203:33;-1:-1:-1;;;;;1296:2:1;1288:6;1285:14;1282:34;;;1312:1;1309;1302:12;1282:34;1351:58;1401:7;1392:6;1381:9;1377:22;1351:58;:::i;:::-;1428:8;;-1:-1:-1;1325:84:1;-1:-1:-1;1516:3:1;1501:19;;1488:33;;-1:-1:-1;1533:16:1;;;1530:36;;;1562:1;1559;1552:12;1530:36;;1601:60;1653:7;1642:8;1631:9;1627:24;1601:60;:::i;:::-;1680:8;;-1:-1:-1;1575:86:1;-1:-1:-1;;1765:3:1;1750:19;;1737:33;1779:31;1737:33;1779:31;:::i;:::-;1829:5;-1:-1:-1;1881:3:1;1866:19;;1853:33;;-1:-1:-1;1933:3:1;1918:19;;1905:33;;-1:-1:-1;1990:3:1;1975:19;;1962:33;2004:30;1962:33;2004:30;:::i;:::-;2053:7;2043:17;;;794:1272;;;;;;;;;;;:::o;2263:750::-;2355:6;2363;2371;2424:2;2412:9;2403:7;2399:23;2395:32;2392:52;;;2440:1;2437;2430:12;2392:52;2480:9;2467:23;-1:-1:-1;;;;;2550:2:1;2542:6;2539:14;2536:34;;;2566:1;2563;2556:12;2536:34;2604:6;2593:9;2589:22;2579:32;;2649:7;2642:4;2638:2;2634:13;2630:27;2620:55;;2671:1;2668;2661:12;2620:55;2711:2;2698:16;2737:2;2729:6;2726:14;2723:34;;;2753:1;2750;2743:12;2723:34;2808:7;2801:4;2791:6;2788:1;2784:14;2780:2;2776:23;2772:34;2769:47;2766:67;;;2829:1;2826;2819:12;2766:67;2860:4;2852:13;;;;-1:-1:-1;2884:6:1;-1:-1:-1;;2925:20:1;;2912:34;2955:28;2912:34;2955:28;:::i;:::-;3002:5;2992:15;;;2263:750;;;;;:::o;3018:286::-;3076:6;3129:2;3117:9;3108:7;3104:23;3100:32;3097:52;;;3145:1;3142;3135:12;3097:52;3171:23;;-1:-1:-1;;;;;;3223:32:1;;3213:43;;3203:71;;3270:1;3267;3260:12;3491:258;3563:1;3573:113;3587:6;3584:1;3581:13;3573:113;;;3663:11;;;3657:18;3644:11;;;3637:39;3609:2;3602:10;3573:113;;;3704:6;3701:1;3698:13;3695:48;;;-1:-1:-1;;3739:1:1;3721:16;;3714:27;3491:258::o;3754:383::-;3903:2;3892:9;3885:21;3866:4;3935:6;3929:13;3978:6;3973:2;3962:9;3958:18;3951:34;3994:66;4053:6;4048:2;4037:9;4033:18;4028:2;4020:6;4016:15;3994:66;:::i;:::-;4121:2;4100:15;-1:-1:-1;;4096:29:1;4081:45;;;;4128:2;4077:54;;3754:383;-1:-1:-1;;3754:383:1:o;4142:127::-;4203:10;4198:3;4194:20;4191:1;4184:31;4234:4;4231:1;4224:15;4258:4;4255:1;4248:15;4274:275;4345:2;4339:9;4410:2;4391:13;;-1:-1:-1;;4387:27:1;4375:40;;-1:-1:-1;;;;;4430:34:1;;4466:22;;;4427:62;4424:88;;;4492:18;;:::i;:::-;4528:2;4521:22;4274:275;;-1:-1:-1;4274:275:1:o;4554:758::-;4616:5;4664:4;4652:9;4647:3;4643:19;4639:30;4636:50;;;4682:1;4679;4672:12;4636:50;4715:2;4709:9;4757:4;4749:6;4745:17;4828:6;4816:10;4813:22;-1:-1:-1;;;;;4780:10:1;4777:34;4774:62;4771:88;;;4839:18;;:::i;:::-;4875:2;4868:22;4908:6;-1:-1:-1;4908:6:1;4938:23;;4970:33;4938:23;4970:33;:::i;:::-;5012:23;;5087:2;5072:18;;5059:32;5100:33;5059:32;5100:33;:::i;:::-;5166:7;5161:2;5153:6;5149:15;5142:32;;5235:2;5224:9;5220:18;5207:32;5202:2;5194:6;5190:15;5183:57;5301:2;5290:9;5286:18;5273:32;5268:2;5260:6;5256:15;5249:57;;4554:758;;;;:::o;5317:1336::-;5494:6;5502;5510;5518;5526;5534;5542;5550;5558;5566;5619:3;5607:9;5598:7;5594:23;5590:33;5587:53;;;5636:1;5633;5626:12;5587:53;5659;5704:7;5693:9;5659:53;:::i;:::-;5649:63;;5763:3;5752:9;5748:19;5735:33;-1:-1:-1;;;;;5828:2:1;5820:6;5817:14;5814:34;;;5844:1;5841;5834:12;5814:34;5883:58;5933:7;5924:6;5913:9;5909:22;5883:58;:::i;:::-;5960:8;;-1:-1:-1;5857:84:1;-1:-1:-1;6048:3:1;6033:19;;6020:33;;-1:-1:-1;6065:16:1;;;6062:36;;;6094:1;6091;6084:12;6062:36;;6133:60;6185:7;6174:8;6163:9;6159:24;6133:60;:::i;:::-;6212:8;;-1:-1:-1;6107:86:1;-1:-1:-1;;6297:3:1;6282:19;;6269:33;6311:31;6269:33;6311:31;:::i;:::-;6361:5;-1:-1:-1;6418:3:1;6403:19;;6390:33;6432;6390;6432;:::i;:::-;6484:7;6474:17;;;6538:3;6527:9;6523:19;6510:33;6500:43;;6590:3;6579:9;6575:19;6562:33;6552:43;;6642:3;6631:9;6627:19;6614:33;6604:43;;5317:1336;;;;;;;;;;;;;:::o;6658:821::-;6761:6;6769;6777;6785;6793;6846:3;6834:9;6825:7;6821:23;6817:33;6814:53;;;6863:1;6860;6853:12;6814:53;6902:9;6889:23;6921:31;6946:5;6921:31;:::i;:::-;6971:5;-1:-1:-1;7028:2:1;7013:18;;7000:32;7041:33;7000:32;7041:33;:::i;:::-;7093:7;-1:-1:-1;7152:2:1;7137:18;;7124:32;7165:33;7124:32;7165:33;:::i;:::-;7217:7;-1:-1:-1;7276:2:1;7261:18;;7248:32;7289:33;7248:32;7289:33;:::i;:::-;7341:7;-1:-1:-1;7400:3:1;7385:19;;7372:33;7414;7372;7414;:::i;:::-;7466:7;7456:17;;;6658:821;;;;;;;;:::o;7484:247::-;7543:6;7596:2;7584:9;7575:7;7571:23;7567:32;7564:52;;;7612:1;7609;7602:12;7564:52;7651:9;7638:23;7670:31;7695:5;7670:31;:::i;7736:180::-;7795:6;7848:2;7836:9;7827:7;7823:23;7819:32;7816:52;;;7864:1;7861;7854:12;7816:52;-1:-1:-1;7887:23:1;;7736:180;-1:-1:-1;7736:180:1:o;8813:622::-;8936:6;8944;8952;8960;9013:3;9001:9;8992:7;8988:23;8984:33;8981:53;;;9030:1;9027;9020:12;8981:53;9053:62;9107:7;9096:9;9053:62;:::i;:::-;9043:72;;9166:3;9155:9;9151:19;9138:33;-1:-1:-1;;;;;9186:6:1;9183:30;9180:50;;;9226:1;9223;9216:12;9180:50;9265:58;9315:7;9306:6;9295:9;9291:22;9265:58;:::i;:::-;8813:622;;9342:8;;-1:-1:-1;9239:84:1;;9424:3;9409:19;9396:33;;8813:622;-1:-1:-1;;;;8813:622:1:o;9440:315::-;9508:6;9516;9569:2;9557:9;9548:7;9544:23;9540:32;9537:52;;;9585:1;9582;9575:12;9537:52;9621:9;9608:23;9598:33;;9681:2;9670:9;9666:18;9653:32;9694:31;9719:5;9694:31;:::i;:::-;9744:5;9734:15;;;9440:315;;;;;:::o;9760:816::-;9899:6;9907;9915;9923;9931;9939;9992:3;9980:9;9971:7;9967:23;9963:33;9960:53;;;10009:1;10006;9999:12;9960:53;10032;10077:7;10066:9;10032:53;:::i;:::-;10022:63;;10136:3;10125:9;10121:19;10108:33;-1:-1:-1;;;;;10156:6:1;10153:30;10150:50;;;10196:1;10193;10186:12;10150:50;10235:58;10285:7;10276:6;10265:9;10261:22;10235:58;:::i;:::-;10312:8;;-1:-1:-1;10209:84:1;-1:-1:-1;;10397:3:1;10382:19;;10369:33;10411:31;10369:33;10411:31;:::i;:::-;9760:816;;;;-1:-1:-1;9760:816:1;;10513:3;10498:19;;10485:33;;10565:3;10550:19;;;10537:33;;-1:-1:-1;9760:816:1;-1:-1:-1;;9760:816:1:o;10581:388::-;10649:6;10657;10710:2;10698:9;10689:7;10685:23;10681:32;10678:52;;;10726:1;10723;10716:12;10678:52;10765:9;10752:23;10784:31;10809:5;10784:31;:::i;:::-;10834:5;-1:-1:-1;10891:2:1;10876:18;;10863:32;10904:33;10863:32;10904:33;:::i;11156:898::-;11233:6;11241;11294:2;11282:9;11273:7;11269:23;11265:32;11262:52;;;11310:1;11307;11300:12;11262:52;11349:9;11336:23;11368:31;11393:5;11368:31;:::i;:::-;11418:5;-1:-1:-1;11442:2:1;11480:18;;;11467:32;-1:-1:-1;;;;;11548:14:1;;;11545:34;;;11575:1;11572;11565:12;11545:34;11613:6;11602:9;11598:22;11588:32;;11658:7;11651:4;11647:2;11643:13;11639:27;11629:55;;11680:1;11677;11670:12;11629:55;11716:2;11703:16;11738:2;11734;11731:10;11728:36;;;11744:18;;:::i;:::-;11786:53;11829:2;11810:13;;-1:-1:-1;;11806:27:1;11802:36;;11786:53;:::i;:::-;11773:66;;11862:2;11855:5;11848:17;11902:7;11897:2;11892;11888;11884:11;11880:20;11877:33;11874:53;;;11923:1;11920;11913:12;11874:53;11978:2;11973;11969;11965:11;11960:2;11953:5;11949:14;11936:45;12022:1;12017:2;12012;12005:5;12001:14;11997:23;11990:34;;12043:5;12033:15;;;;;11156:898;;;;;:::o;12059:1036::-;12206:6;12214;12222;12230;12238;12246;12254;12307:3;12295:9;12286:7;12282:23;12278:33;12275:53;;;12324:1;12321;12314:12;12275:53;12347:62;12401:7;12390:9;12347:62;:::i;:::-;12337:72;;12460:3;12449:9;12445:19;12432:33;-1:-1:-1;;;;;12480:6:1;12477:30;12474:50;;;12520:1;12517;12510:12;12474:50;12559:58;12609:7;12600:6;12589:9;12585:22;12559:58;:::i;:::-;12636:8;;-1:-1:-1;12533:84:1;-1:-1:-1;;12721:3:1;12706:19;;12693:33;12735:31;12693:33;12735:31;:::i;:::-;12785:5;-1:-1:-1;12842:3:1;12827:19;;12814:33;12856;12814;12856;:::i;:::-;12908:7;-1:-1:-1;12962:3:1;12947:19;;12934:33;;-1:-1:-1;13019:3:1;13004:19;;12991:33;13033:30;12991:33;13033:30;:::i;:::-;13082:7;13072:17;;;12059:1036;;;;;;;;;;:::o;13100:952::-;13245:6;13253;13261;13269;13277;13285;13293;13346:3;13334:9;13325:7;13321:23;13317:33;13314:53;;;13363:1;13360;13353:12;13314:53;13386;13431:7;13420:9;13386:53;:::i;:::-;13376:63;;13490:3;13479:9;13475:19;13462:33;-1:-1:-1;;;;;13510:6:1;13507:30;13504:50;;;13550:1;13547;13540:12;13504:50;13589:58;13639:7;13630:6;13619:9;13615:22;13589:58;:::i;:::-;13666:8;;-1:-1:-1;13563:84:1;-1:-1:-1;;13748:3:1;13733:19;;13720:33;;-1:-1:-1;13803:3:1;13788:19;;13775:33;13817:31;13775:33;13817:31;:::i;:::-;13867:5;-1:-1:-1;13924:3:1;13909:19;;13896:33;13938:30;13896:33;13938:30;:::i;:::-;13987:7;13977:17;;;14041:3;14030:9;14026:19;14013:33;14003:43;;13100:952;;;;;;;;;;:::o;14281:1305::-;14453:6;14461;14469;14477;14485;14493;14501;14509;14517;14525;14578:3;14566:9;14557:7;14553:23;14549:33;14546:53;;;14595:1;14592;14585:12;14546:53;14618;14663:7;14652:9;14618:53;:::i;:::-;14608:63;;14722:3;14711:9;14707:19;14694:33;-1:-1:-1;;;;;14742:6:1;14739:30;14736:50;;;14782:1;14779;14772:12;14736:50;14821:58;14871:7;14862:6;14851:9;14847:22;14821:58;:::i;:::-;14898:8;;-1:-1:-1;14795:84:1;-1:-1:-1;;14983:3:1;14968:19;;14955:33;14997:31;14955:33;14997:31;:::i;:::-;15047:5;-1:-1:-1;15104:3:1;15089:19;;15076:33;15118;15076;15118;:::i;:::-;15170:7;-1:-1:-1;15229:3:1;15214:19;;15201:33;15243;15201;15243;:::i;:::-;15295:7;-1:-1:-1;15349:3:1;15334:19;;15321:33;;-1:-1:-1;15401:3:1;15386:19;;15373:33;;-1:-1:-1;15453:3:1;15438:19;;15425:33;;-1:-1:-1;15510:3:1;15495:19;;15482:33;15524:30;15482:33;15524:30;:::i;:::-;15573:7;15563:17;;;14281:1305;;;;;;;;;;;;;:::o;15851:244::-;15943:6;15996:3;15984:9;15975:7;15971:23;15967:33;15964:53;;;16013:1;16010;16003:12;15964:53;16036;16081:7;16070:9;16036:53;:::i;16100:127::-;16161:10;16156:3;16152:20;16149:1;16142:31;16192:4;16189:1;16182:15;16216:4;16213:1;16206:15;16232:127;16293:10;16288:3;16284:20;16281:1;16274:31;16324:4;16321:1;16314:15;16348:4;16345:1;16338:15;16364:135;16403:3;-1:-1:-1;;16424:17:1;;16421:43;;;16444:18;;:::i;:::-;-1:-1:-1;16491:1:1;16480:13;;16364:135::o;17413:590::-;-1:-1:-1;;;17771:3:1;17764:31;17746:3;17824:6;17818:13;17840:62;17895:6;17890:2;17885:3;17881:12;17874:4;17866:6;17862:17;17840:62;:::i;:::-;-1:-1:-1;;;17961:2:1;17921:16;;;;17953:11;;;17946:24;-1:-1:-1;17994:2:1;17986:11;;17413:590;-1:-1:-1;17413:590:1:o;18623:408::-;18825:2;18807:21;;;18864:2;18844:18;;;18837:30;18903:34;18898:2;18883:18;;18876:62;-1:-1:-1;;;18969:2:1;18954:18;;18947:42;19021:3;19006:19;;18623:408::o;19036:::-;19238:2;19220:21;;;19277:2;19257:18;;;19250:30;19316:34;19311:2;19296:18;;19289:62;-1:-1:-1;;;19382:2:1;19367:18;;19360:42;19434:3;19419:19;;19036:408::o;19874:127::-;19935:10;19930:3;19926:20;19923:1;19916:31;19966:4;19963:1;19956:15;19990:4;19987:1;19980:15;20006:234;20084:1;20077:5;20074:12;20064:143;;20129:10;20124:3;20120:20;20117:1;20110:31;20164:4;20161:1;20154:15;20192:4;20189:1;20182:15;20064:143;20216:18;;20006:234::o;20245:508::-;20501:25;;;20557:2;20542:18;;20535:34;;;20612:14;;20605:22;20600:2;20585:18;;20578:50;20671:14;;20664:22;20659:2;20644:18;;20637:50;20488:3;20473:19;;20696:51;20742:3;20727:19;;20719:6;20696:51;:::i;20758:125::-;20798:4;20826:1;20823;20820:8;20817:34;;;20831:18;;:::i;:::-;-1:-1:-1;20868:9:1;;20758:125::o;20888:128::-;20928:3;20959:1;20955:6;20952:1;20949:13;20946:39;;;20965:18;;:::i;:::-;-1:-1:-1;21001:9:1;;20888:128::o;21021:506::-;21291:25;;;21347:2;21332:18;;21325:34;;;21390:2;21375:18;;21368:34;;;21445:14;;21438:22;21433:2;21418:18;;21411:50;21278:3;21263:19;;21470:51;21516:3;21501:19;;21493:6;21470:51;:::i;22829:392::-;-1:-1:-1;;;23087:27:1;;23139:1;23130:11;;23123:27;;;;23175:2;23166:12;;23159:28;23212:2;23203:12;;22829:392::o;23226:845::-;23353:6;23361;23369;23377;23385;23393;23401;23454:3;23442:9;23433:7;23429:23;23425:33;23422:53;;;23471:1;23468;23461:12;23422:53;23510:9;23497:23;23529:31;23554:5;23529:31;:::i;:::-;23579:5;-1:-1:-1;23636:2:1;23621:18;;23608:32;23649:33;23608:32;23649:33;:::i;:::-;23701:7;-1:-1:-1;23755:2:1;23740:18;;23727:32;;-1:-1:-1;23806:2:1;23791:18;;23778:32;;-1:-1:-1;23862:3:1;23847:19;;23834:33;23911:4;23898:18;;23886:31;;23876:59;;23931:1;23928;23921:12;23876:59;23226:845;;;;-1:-1:-1;23226:845:1;;;;23954:7;24008:3;23993:19;;23980:33;;-1:-1:-1;24060:3:1;24045:19;;;24032:33;;23226:845;-1:-1:-1;;23226:845:1:o;25131:407::-;25333:2;25315:21;;;25372:2;25352:18;;;25345:30;25411:34;25406:2;25391:18;;25384:62;-1:-1:-1;;;25477:2:1;25462:18;;25455:41;25528:3;25513:19;;25131:407::o;25543:184::-;25613:6;25666:2;25654:9;25645:7;25641:23;25637:32;25634:52;;;25682:1;25679;25672:12;25634:52;-1:-1:-1;25705:16:1;;25543:184;-1:-1:-1;25543:184:1:o;26765:786::-;27176:25;27171:3;27164:38;27146:3;27231:6;27225:13;27247:62;27302:6;27297:2;27292:3;27288:12;27281:4;27273:6;27269:17;27247:62;:::i;:::-;-1:-1:-1;;;27368:2:1;27328:16;;;27360:11;;;27353:40;27418:13;;27440:63;27418:13;27489:2;27481:11;;27474:4;27462:17;;27440:63;:::i;:::-;27523:17;27542:2;27519:26;;26765:786;-1:-1:-1;;;;26765:786:1:o;27556:245::-;27623:6;27676:2;27664:9;27655:7;27651:23;27647:32;27644:52;;;27692:1;27689;27682:12;27644:52;27724:9;27718:16;27743:28;27765:5;27743:28;:::i;30254:168::-;30294:7;30360:1;30356;30352:6;30348:14;30345:1;30342:21;30337:1;30330:9;30323:17;30319:45;30316:71;;;30367:18;;:::i;:::-;-1:-1:-1;30407:9:1;;30254:168::o;30427:136::-;30466:3;30494:5;30484:39;;30503:18;;:::i;:::-;-1:-1:-1;;;30539:18:1;;30427:136::o;32855:274::-;32984:3;33022:6;33016:13;33038:53;33084:6;33079:3;33072:4;33064:6;33060:17;33038:53;:::i;:::-;33107:16;;;;;32855:274;-1:-1:-1;;32855:274:1:o
Swarm Source
ipfs://2d78e5422ea3c3c932670ba3d3dcf978d41425e71c7fa8cb8fc01b479b1cfec1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.