Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VoterUpgradeable
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-29 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @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 Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 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 in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._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 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._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() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @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 { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } pragma solidity ^0.8.20; /** * @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; } } pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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); } 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); } 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); } } } 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)); } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @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; } pragma solidity 0.8.27; interface IMeme { /** * @notice Lock tokens for voting * @param amount Amount of tokens to lock * @param user Address of the user whose tokens are being locked */ function lockTokens(uint256 amount, address user) external; /** * @notice Get the balance of tokens for a user * @param account Address of the user to check balance for * @return The token balance of the given account */ function balanceOf(address account) external view returns (uint256); /** * @notice Check if tokens are currently locked for a user * @param user Address of the user to check locks for * @return Boolean indicating if user has locked tokens */ function isLocked(address user) external view returns (bool); /** * @notice Transfer tokens from one address to another * @param from Address to transfer from * @param to Address to transfer to * @param amount Amount of tokens to transfer * @return Boolean indicating if the transfer was successful */ function transferFrom(address from, address to, uint256 amount) external returns (bool); /** * @notice Transfer tokens to another address * @param to Address to transfer to * @param amount Amount of tokens to transfer * @return Boolean indicating if the transfer was successful */ function transfer(address to, uint256 amount) external returns (bool); function isLockExpired(address user) external view returns (bool); } pragma solidity ^0.8.4; interface IOnlyMemesERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } pragma solidity ^0.8.4; interface IVoter { function isBribeWhitelisted(address token) external view returns (bool); function setWhitelistedBribe(address token, bool status) external; function bribe(uint256 pid, address reward, uint256 amount) external; function _lastEpoch() external view returns (uint256); function _epochLength() external view returns(uint256); function _unlockTokens(address owner) external; } pragma solidity ^0.8.4; interface IOnlyMemesPair is IOnlyMemesERC20 { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn( address to ) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; function setPID(uint256 pid) external; function setFeeAddresses(IVoter, address, address) external; } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } pragma solidity ^0.8.20; pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC 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); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 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 SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @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(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (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(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, 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. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @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. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @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 silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity 0.8.27; interface IChef { /** * @notice Get the total number of pools in the chef contract * @return Number of pools */ function poolLength() external view returns (uint256); /** * @notice Set the allocation points for a pool * @param pid Pool ID to modify * @param allocPoint New allocation points for the pool */ function set(uint256 pid, uint256 allocPoint) external; function getPID(address lp) external returns (uint256 pid); function readPoolList() external view returns (IERC20[] memory ); } pragma solidity 0.8.27; contract VoterUpgradeable is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; struct votes { uint256 pid; uint256 amount; bool claimed; } struct bribeInfo { address reward; uint256 epoch; uint256 amount; uint256 claimed; } // Constants uint256 public constant MAX_BRIBES_PER_POOL = 10; uint256 private constant MAX_ALLOC_POINTS = 4000; uint256 public constant MINIMUM_BRIBE_AMOUNT = 1e18; uint256 public constant VOTE_BUFFER_TIME = 1 hours; uint256 public constant MAX_BUFFER_TIME = 4 hours; uint256 public constant MAXIMUM_VOTE_AMOUNT = 42e24; uint56 [50] _gap; // Storage variables address public masterChef; address public votingToken; uint256 public lastEpoch; uint256 public epochLength; uint256 public totalWeight; uint256 public Epoch; uint256 public bufferStart; IMeme public meme; IChef public chef; mapping(address => bool) public isBribeWhitelisted; mapping(address => uint256) public userLocks; mapping(uint256 => uint256) public voterTurnouts; mapping(address => uint256) public lastClaim; mapping(uint256 => mapping(uint256 => uint256)) public voteResults; mapping(uint256 => mapping(uint256 => bribeInfo[])) public bribeRewards; mapping(address => mapping(uint256 => votes[])) public userVotes; mapping(uint256 => bool) public isEpochSealed; mapping(uint256 => bool) public isEpochFinalized; // Events remain the same event BribeWhitelistUpdated(address indexed token, bool status); event BribeClaimed(address indexed user, uint256 indexed epoch, uint256 indexed pid, address reward, uint256 amount); event VoteCast(address indexed user, uint256 indexed pid, uint256 amount); event EpochFlipped(uint256 indexed newEpoch, uint256 timestamp); event BribeAdded(address indexed token, uint256 indexed pid, uint256 indexed epoch, uint256 amount); event ClaimSkipped(uint256 indexed epoch); event BufferPeriodStarted(uint256 indexed epoch, uint256 startTime); event EpochFinalized(uint256 indexed epoch, uint256 timestamp); // Errors remain the same error InsufficientVotes(); error BribeNotWhitelisted(); error EpochNotEnded(); error BribesAlreadyClaimed(); error ZeroVotes(); error DivisionByZero(); error InvalidEpoch(); error InvalidToken(); error NotAuthorized(); error ClaimTooEarly(); error InvalidPid(); error DuplicatePid(); error Overflow(); error TooManyBribes(); error BribeTooSmall(); error VoteAmountTooLarge(); error BufferPeriodTooEarly(); error BufferPeriodExpired(); error EpochSealed(); error BufferNotStarted(); error NoLocksToUnlock(); error NoClaimableEpochs(); error EpochAlreadyFinalized(); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize( address _masterChef, uint256 epochLength_, address _token ) public initializer { require(_masterChef != address(0), "Zero address chef"); require(_token != address(0), "Zero address token"); require(epochLength_ > VOTE_BUFFER_TIME * 2 + 1 hours, "Epoch too short"); __Ownable_init(msg.sender); __ReentrancyGuard_init(); masterChef = _masterChef; epochLength = epochLength_; votingToken = _token; meme = IMeme(_token); chef = IChef(_masterChef); } function vote(uint256 pid, uint256 amount) public { if (pid >= chef.poolLength()) revert InvalidPid(); if (votesLeft(msg.sender) < amount) revert InsufficientVotes(); if (amount > MAXIMUM_VOTE_AMOUNT) revert VoteAmountTooLarge(); if (isEpochSealed[Epoch]) revert EpochSealed(); if (block.timestamp >= lastEpoch + epochLength - VOTE_BUFFER_TIME) revert BufferPeriodTooEarly(); if (meme.isLockExpired(msg.sender) && userLocks[msg.sender] != 0) { _unlockTokens(msg.sender);} _lockTokens(amount, msg.sender); (bool voted, uint256 voteId) = _hasVotedForEpoch(msg.sender, pid, Epoch); if (!voted) { userVotes[msg.sender][Epoch].push(votes(pid, amount, false)); } else { uint256 newTotal = userVotes[msg.sender][Epoch][voteId].amount + amount; if (newTotal > MAXIMUM_VOTE_AMOUNT) revert VoteAmountTooLarge(); userVotes[msg.sender][Epoch][voteId].amount = newTotal; } voteResults[Epoch][pid] += amount; voterTurnouts[Epoch] += amount; totalWeight += amount; emit VoteCast(msg.sender, pid, amount); } function multiVote(votes[] calldata Votes) external { uint256 length = Votes.length; uint256 poolLength = chef.poolLength(); bool[] memory seenPids = new bool[](poolLength); for (uint256 i; i < length; ++i) { uint256 pid = Votes[i].pid; if (pid >= poolLength) revert InvalidPid(); if (seenPids[pid]) revert DuplicatePid(); seenPids[pid] = true; vote(pid, Votes[i].amount); } } function bribe(uint256 pid, address reward, uint256 amount) external { if (!isBribeWhitelisted[reward] || _isLP(IERC20(reward))) revert BribeNotWhitelisted(); if (pid >= chef.poolLength()) revert InvalidPid(); if (amount < MINIMUM_BRIBE_AMOUNT) revert BribeTooSmall(); if (isEpochSealed[Epoch]) revert EpochSealed(); (bool isBribe, uint256 farmId) = _isBribe(reward, pid, Epoch); if (!isBribe && bribeRewards[Epoch][pid].length >= MAX_BRIBES_PER_POOL) { revert TooManyBribes(); } IERC20Upgradeable(reward).safeTransferFrom(msg.sender, address(this), amount); if (isBribe) { bribeRewards[Epoch][pid][farmId].amount += amount; } else { bribeRewards[Epoch][pid].push(bribeInfo(reward, Epoch, amount, 0)); } emit BribeAdded(reward, pid, Epoch, amount); } function startBuffer() external { if (block.timestamp < lastEpoch + epochLength - (VOTE_BUFFER_TIME * 2)) revert BufferPeriodTooEarly(); if (block.timestamp > lastEpoch + epochLength) revert BufferPeriodExpired(); if (isEpochSealed[Epoch]) revert EpochSealed(); isEpochSealed[Epoch] = true; bufferStart = block.timestamp; emit BufferPeriodStarted(Epoch, block.timestamp); } function flip() external { if (!isEpochSealed[Epoch]) revert EpochNotEnded(); if (isEpochFinalized[Epoch]) revert EpochAlreadyFinalized(); if (block.timestamp < bufferStart + VOTE_BUFFER_TIME) revert BufferPeriodTooEarly(); if (block.timestamp > bufferStart + MAX_BUFFER_TIME) revert BufferPeriodExpired(); if (bufferStart == 0) revert BufferNotStarted(); uint256 length = chef.poolLength(); if (length == 0) revert InvalidPid(); uint256 totalVotes = voterTurnouts[Epoch]; if (totalVotes == 0) revert ZeroVotes(); // Safe math for allocation points for (uint256 i; i < length; ++i) { uint256 votesForEpoch = voteResults[Epoch][i]; uint256 allocPoint; if (votesForEpoch > 0) { allocPoint = (votesForEpoch * MAX_ALLOC_POINTS) / totalVotes; if (allocPoint > MAX_ALLOC_POINTS) { allocPoint = MAX_ALLOC_POINTS; } } chef.set(i, allocPoint); } isEpochFinalized[Epoch] = true; emit EpochFinalized(Epoch, block.timestamp); uint256 newEpoch = Epoch + 1; Epoch = newEpoch; totalWeight = 0; lastEpoch = block.timestamp; bufferStart = 0; emit EpochFlipped(newEpoch, block.timestamp); } function claimEverything() external nonReentrant { uint256 latestClaim = lastClaim[msg.sender]; if (latestClaim >= Epoch) revert ClaimTooEarly(); uint256 claimStart = latestClaim + 1; uint256 claimEnd = Epoch; if (claimStart >= claimEnd) revert NoClaimableEpochs(); for (uint256 epochToClaim = claimStart; epochToClaim < claimEnd; epochToClaim++) { if (!isEpochFinalized[epochToClaim]) { emit ClaimSkipped(epochToClaim); continue; } uint256 length = userVotes[msg.sender][epochToClaim].length; bool hasUnclaimedVotes = false; for (uint256 i = 0; i < length; i++) { if (!userVotes[msg.sender][epochToClaim][i].claimed) { hasUnclaimedVotes = true; break; } } if (hasUnclaimedVotes) { _claimBribesForEpoch(epochToClaim); } else { emit ClaimSkipped(epochToClaim); } } lastClaim[msg.sender] = claimEnd - 1; } function claimBribes(uint256 epoch) public nonReentrant { if (epoch >= Epoch) revert EpochNotEnded(); if (!isEpochFinalized[epoch]) revert EpochNotEnded(); _claimBribesForEpoch(epoch); } function setWhitelistedBribe(address token, bool status) external onlyWhitelister { if (token == address(0)) revert InvalidEpoch(); isBribeWhitelisted[token] = status; emit BribeWhitelistUpdated(token, status); } function votesLeft(address user) public view returns(uint256) { return IERC20Upgradeable(votingToken).balanceOf(user) - votesUsed(user); } function votesUsed(address user) public view returns(uint256) { return userLocks[user]; } function pendingRewards(address user, uint256 pid, uint256 epoch) public view returns(bribeInfo[] memory) { uint256 bribeLength = bribeRewards[epoch][pid].length; bribeInfo[] memory bribes = new bribeInfo[](bribeLength); uint256 totalVotes = voteResults[epoch][pid]; if (totalVotes == 0) return bribes; uint256 amountVoted; (bool voted, uint256 voteId) = _hasVotedForEpoch(user, pid, epoch); if (voted) { amountVoted = userVotes[user][epoch][voteId].amount; } for (uint256 i; i < bribeLength; ++i) { bribeInfo storage _bribe = bribeRewards[epoch][pid][i]; uint256 unclaimedBribes = _bribe.amount - _bribe.claimed; if (unclaimedBribes > 0) { // Check for overflow in multiplication uint256 numerator = amountVoted * unclaimedBribes; if (numerator / amountVoted != unclaimedBribes) revert Overflow(); uint256 amountOwed = numerator / totalVotes; bribes[i] = bribeInfo(_bribe.reward, epoch, amountOwed, 0); } } return bribes; } function _claimBribesForEpoch(uint256 epoch) internal { uint256 length = userVotes[msg.sender][epoch].length; for (uint256 j; j < length; ++j) { if (userVotes[msg.sender][epoch][j].claimed) revert BribesAlreadyClaimed(); uint256 _pid = userVotes[msg.sender][epoch][j].pid; bribeInfo[] memory bribes = pendingRewards(msg.sender, _pid, epoch); // Mark as claimed before external calls userVotes[msg.sender][epoch][j].claimed = true; uint256 bribeLength = bribes.length; for (uint256 k; k < bribeLength; ++k) { if (bribes[k].amount > 0) { // Update claimed amount in storage bribeRewards[epoch][_pid][k].claimed += bribes[k].amount; // Transfer rewards IERC20Upgradeable(bribes[k].reward).safeTransfer(msg.sender, bribes[k].amount); emit BribeClaimed(msg.sender, epoch, _pid, bribes[k].reward, bribes[k].amount); } } } lastClaim[msg.sender] = epoch; } function _hasVotedForEpoch(address user, uint256 pid, uint256 epoch) internal view returns (bool voted, uint256 voteId) { uint256 length = userVotes[user][epoch].length; for (uint256 j; j < length; ++j) { if (pid == userVotes[user][epoch][j].pid) { return (true, j); } } return (false, 0); } function _lockTokens(uint256 amount, address user) internal { userLocks[user] += amount; meme.lockTokens(amount, user); } function _isBribe(address reward, uint256 pid, uint256 epoch) internal view returns (bool isBribe, uint256 farmId) { uint256 length = bribeRewards[epoch][pid].length; for (uint256 i; i < length; ++i) { if (bribeRewards[epoch][pid][i].reward == reward) { return (true, i); } } return (false, 0); } function unlockTokens(address user) external { if (msg.sender != votingToken) revert NotAuthorized(); uint256 currentLocks = userLocks[user]; if (currentLocks == 0) revert NoLocksToUnlock(); userLocks[user] = 0; } function _unlockTokens(address user) internal { uint256 currentLocks = userLocks[user]; if (currentLocks == 0) revert NoLocksToUnlock(); userLocks[user] = 0; } function getPID(address lp) public returns (uint256 _pid){ return chef.getPID(lp); } function _epochLength() external view returns(uint256) { return epochLength; } function _lastEpoch() external view returns (uint256){ return lastEpoch; } function _isLP(IERC20 _bribe) internal view returns (bool) { uint256 length = chef.poolLength(); IERC20[] memory lpList = chef.readPoolList(); for (uint256 i; i < length;) { if (_bribe == lpList[i]) { return true; } unchecked { ++i; } } return false; } modifier onlyWhitelister() { address _owner = owner(); require (msg.sender == _owner || msg.sender == masterChef , "Not Approved to Whitelist"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BribeNotWhitelisted","type":"error"},{"inputs":[],"name":"BribeTooSmall","type":"error"},{"inputs":[],"name":"BribesAlreadyClaimed","type":"error"},{"inputs":[],"name":"BufferNotStarted","type":"error"},{"inputs":[],"name":"BufferPeriodExpired","type":"error"},{"inputs":[],"name":"BufferPeriodTooEarly","type":"error"},{"inputs":[],"name":"ClaimTooEarly","type":"error"},{"inputs":[],"name":"DivisionByZero","type":"error"},{"inputs":[],"name":"DuplicatePid","type":"error"},{"inputs":[],"name":"EpochAlreadyFinalized","type":"error"},{"inputs":[],"name":"EpochNotEnded","type":"error"},{"inputs":[],"name":"EpochSealed","type":"error"},{"inputs":[],"name":"InsufficientVotes","type":"error"},{"inputs":[],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidPid","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"NoClaimableEpochs","type":"error"},{"inputs":[],"name":"NoLocksToUnlock","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TooManyBribes","type":"error"},{"inputs":[],"name":"VoteAmountTooLarge","type":"error"},{"inputs":[],"name":"ZeroVotes","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BribeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BribeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"BribeWhitelistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"BufferPeriodStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"ClaimSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EpochFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EpochFlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"Epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_VOTE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BRIBES_PER_POOL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUFFER_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_BRIBE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_BUFFER_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bribeRewards","outputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bufferStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"contract IChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEverything","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getPID","outputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"},{"internalType":"uint256","name":"epochLength_","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBribeWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isEpochFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isEpochSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meme","outputs":[{"internalType":"contract IMeme","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct VoterUpgradeable.votes[]","name":"Votes","type":"tuple[]"}],"name":"multiVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"pendingRewards","outputs":[{"components":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"internalType":"struct VoterUpgradeable.bribeInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelistedBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userVotes","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"voteResults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voterTurnouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"votesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"votesUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b610183565b5f61003261012160201b60201c565b9050805f0160089054906101000a900460ff161561007c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff161461011e5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051610115919061016a565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b61016481610148565b82525050565b5f60208201905061017d5f83018461015b565b92915050565b614b8e806101905f395ff3fe608060405234801561000f575f5ffd5b506004361061025c575f3560e01c8063744b3b0411610144578063b384abef116100c1578063cb67f94811610085578063cb67f9481461072f578063cc6698511461074b578063cde4efa91461077b578063e402ecb714610785578063e476f635146107a1578063f2fde38b146107bf5761025c565b8063b384abef14610679578063b683450a14610695578063bf812ff2146106c5578063c14164d8146106e3578063c350a1b5146107135761025c565b80638cab882d116101085780638cab882d146105d15780638da5cb5b146105ef57806396c82e571461060d57806397ec67ee1461062b578063b03401231461065b5761025c565b8063744b3b0414610500578063746047931461051e5780637e0adc93146105515780638049e17b1461058157806387244735146105b35761025c565b80633b6f064b116101dd57806362e33bed116101a157806362e33bed146104785780636747bea1146104945780636c256980146104b25780636f9874a4146104ce578063715018a6146104ec57806372a66b69146104f65761025c565b80633b6f064b146103be57806344097c48146103ee578063575a86b21461040c57806357d775f81461042a5780635c16e15e146104485761025c565b80631c244b5b116102245780631c244b5b146103185780631fc8bc5d14610336578063290d24941461035457806331ee02af1461035e578063363cbae01461038e5761025c565b8063018f561f146102605780630259ef581461027c57806306a4c983146102ac5780630e74689b146102ca57806310e94895146102fa575b5f5ffd5b61027a60048036038101906102759190613c48565b6107db565b005b61029660048036038101906102919190613ced565b6109d4565b6040516102a39190613d30565b60405180910390f35b6102b46109e9565b6040516102c19190613d30565b60405180910390f35b6102e460048036038101906102df9190613d73565b6109ef565b6040516102f19190613edc565b60405180910390f35b610302610c93565b60405161030f9190613d30565b60405180910390f35b610320610c9c565b60405161032d9190613d30565b60405180910390f35b61033e610ca5565b60405161034b9190613f57565b60405180910390f35b61035c610cca565b005b61037860048036038101906103739190613f70565b610e3a565b6040516103859190613fb5565b60405180910390f35b6103a860048036038101906103a39190613ced565b610e57565b6040516103b59190613fb5565b60405180910390f35b6103d860048036038101906103d39190613fce565b610e74565b6040516103e59190613d30565b60405180910390f35b6103f6610e94565b604051610403919061402c565b60405180910390f35b610414610eb9565b6040516104219190614054565b60405180910390f35b610432610ede565b60405161043f9190613d30565b60405180910390f35b610462600480360381019061045d9190613ced565b610ee4565b60405161046f9190613d30565b60405180910390f35b610492600480360381019061048d9190614097565b610ef9565b005b61049c6110d5565b6040516104a99190613d30565b60405180910390f35b6104cc60048036038101906104c79190613f70565b6110e4565b005b6104d661118f565b6040516104e39190613d30565b60405180910390f35b6104f4611195565b005b6104fe6111a8565b005b610508611483565b6040516105159190613d30565b60405180910390f35b610538600480360381019061053391906140d5565b611488565b6040516105489493929190614125565b60405180910390f35b61056b60048036038101906105669190613f70565b6114f8565b6040516105789190613d30565b60405180910390f35b61059b60048036038101906105969190613d73565b61150d565b6040516105aa93929190614168565b60405180910390f35b6105bb611564565b6040516105c89190613d30565b60405180910390f35b6105d961156a565b6040516105e69190613d30565b60405180910390f35b6105f7611576565b6040516106049190614054565b60405180910390f35b6106156115ab565b6040516106229190613d30565b60405180910390f35b61064560048036038101906106409190613f70565b6115b1565b6040516106529190613fb5565b60405180910390f35b6106636115ce565b6040516106709190614054565b60405180910390f35b610693600480360381019061068e9190613fce565b6115f3565b005b6106af60048036038101906106aa9190613ced565b611bcf565b6040516106bc9190613d30565b60405180910390f35b6106cd611c71565b6040516106da9190613d30565b60405180910390f35b6106fd60048036038101906106f89190613ced565b611c77565b60405161070a9190613d30565b60405180910390f35b61072d6004803603810190610728919061419d565b611cbd565b005b61074960048036038101906107449190613ced565b612088565b005b61076560048036038101906107609190613ced565b6121ce565b6040516107729190613d30565b60405180910390f35b610783612282565b005b61079f600480360381019061079a91906141ed565b6126e2565b005b6107a9612b21565b6040516107b69190613d30565b60405180910390f35b6107d960048036038101906107d49190613ced565b612b27565b005b5f8282905090505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108719190614251565b90505f8167ffffffffffffffff81111561088e5761088d61427c565b5b6040519080825280602002602001820160405280156108bc5781602001602082028036833780820191505090505b5090505f5b838110156109cc575f8686838181106108dd576108dc6142a9565b5b9050606002015f01359050838110610921576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828181518110610934576109336142a9565b5b602002602001015115610973576040517fae96cf7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838281518110610988576109876142a9565b5b6020026020010190151590811515815250506109c0818888858181106109b1576109b06142a9565b5b905060600201602001356115f3565b508060010190506108c1565b505050505050565b6049602052805f5260405f205f915090505481565b60415481565b60605f604d5f8481526020019081526020015f205f8581526020019081526020015f208054905090505f8167ffffffffffffffff811115610a3357610a3261427c565b5b604051908082528060200260200182016040528015610a6c57816020015b610a59613b9c565b815260200190600190039081610a515790505b5090505f604c5f8681526020019081526020015f205f8781526020019081526020015f205490505f8103610aa557819350505050610c8c565b5f5f5f610ab38a8a8a612bab565b915091508115610b2e57604e5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8981526020019081526020015f208181548110610b1b57610b1a6142a9565b5b905f5260205f2090600302016001015492505b5f5b86811015610c81575f604d5f8b81526020019081526020015f205f8c81526020019081526020015f208281548110610b6b57610b6a6142a9565b5b905f5260205f20906004020190505f81600301548260020154610b8e9190614303565b90505f811115610c74575f8187610ba59190614336565b9050818782610bb491906143a4565b14610beb576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8882610bf891906143a4565b90506040518060800160405280855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018281526020015f8152508a8681518110610c6657610c656142a9565b5b602002602001018190525050505b5050806001019050610b30565b508496505050505050505b9392505050565b5f604154905090565b5f604254905090565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002610e10610cd99190614336565b604254604154610ce991906143d4565b610cf39190614303565b421015610d2c576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604254604154610d3c91906143d4565b421115610d75576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615610dcc576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001604f5f60445481526020019081526020015f205f6101000a81548160ff021916908315150217905550426045819055506044547f38726a7c4990228ceea18e072f773791ed75a63e2ea835e78dd89df680e2aa8c42604051610e309190613d30565b60405180910390a2565b6050602052805f5260405f205f915054906101000a900460ff1681565b6048602052805f5260405f205f915054906101000a900460ff1681565b604c602052815f5260405f20602052805f5260405f205f91509150505481565b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60425481565b604b602052805f5260405f205f915090505481565b5f610f02611576565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f8a5750603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614461565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361102e576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160485f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fd793fd780e30a609bf1357c38ccaff5af874b132935bac8bc80317d3f8fc4e4e836040516110c89190613fb5565b60405180910390a2505050565b6a22bdd88fed9efc6a00000081565b6110ec612ca7565b6044548110611127576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f8281526020019081526020015f205f9054906101000a900460ff1661117b576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118481612cf4565b61118c613104565b50565b60445481565b61119d61310d565b6111a65f613194565b565b6111b0612ca7565b5f604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050604454811061122c576040517f1613b7eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60018261123a91906143d4565b90505f604454905080821061127b576040517fa697924200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290505b818110156114275760505f8281526020019081526020015f205f9054906101000a900460ff166112dc57807fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a261141a565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5f90505f5f90505b828110156113d457604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f20818154811061139e5761139d6142a9565b5b905f5260205f2090600302016002015f9054906101000a900460ff166113c757600191506113d4565b8080600101915050611338565b5080156113e9576113e483612cf4565b611417565b827fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a25b50505b8080600101915050611280565b506001816114359190614303565b604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050611481613104565b565b600a81565b604d602052825f5260405f20602052815f5260405f2081815481106114ab575f80fd5b905f5260205f2090600402015f925092505050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b604a602052805f5260405f205f915090505481565b604e602052825f5260405f20602052815f5260405f208181548110611530575f80fd5b905f5260205f2090600302015f925092505050805f015490806001015490806002015f9054906101000a900460ff16905083565b610e1081565b670de0b6b3a764000081565b5f5f611580613265565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60435481565b604f602052805f5260405f205f915054906101000a900460ff1681565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116819190614251565b82106116b9576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806116c3336121ce565b10156116fb576040517f60900ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6a22bdd88fed9efc6a000000811115611740576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615611797576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e106042546041546117aa91906143d4565b6117b49190614303565b42106117ec576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9d50832336040518263ffffffff1660e01b81526004016118469190614054565b602060405180830381865afa158015611861573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118859190614493565b80156118ce57505f60495f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414155b156118dd576118dc3361328c565b5b6118e7813361334c565b5f5f6118f63385604454612bab565b91509150816119c857604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f2060405180606001604052808681526020018581526020015f1515815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055505050611b01565b5f83604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611a2a57611a296142a9565b5b905f5260205f20906003020160010154611a4491906143d4565b90506a22bdd88fed9efc6a000000811115611a8b576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611aec57611aeb6142a9565b5b905f5260205f20906003020160010181905550505b82604c5f60445481526020019081526020015f205f8681526020019081526020015f205f828254611b3291906143d4565b9250508190555082604a5f60445481526020019081526020015f205f828254611b5b91906143d4565b925050819055508260435f828254611b7391906143d4565b92505081905550833373ffffffffffffffffffffffffffffffffffffffff167fb4cfecf70861b7b150d8337780d34fb4cbc2114b5fb1fe51a5c5fca1849f727485604051611bc19190613d30565b60405180910390a350505050565b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b683450a836040518263ffffffff1660e01b8152600401611c2a9190614054565b6020604051808303815f875af1158015611c46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6a9190614251565b9050919050565b61384081565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f611cc661342c565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff16148015611d0e5750825b90505f60018367ffffffffffffffff16148015611d4157505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611d4f575080155b15611d86576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611dd3576001855f0160086101000a81548160ff0219169083151502179055505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3890614508565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614570565b60405180910390fd5b610e106002610e10611ec19190614336565b611ecb91906143d4565b8711611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906145d8565b60405180910390fd5b611f1533613453565b611f1d613467565b87603f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866042819055508560405f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560465f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760475f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550831561207e575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516120759190614642565b60405180910390a15b5050505050505050565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210e576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103612188576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f6121d882611c77565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122329190614054565b602060405180830381865afa15801561224d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122719190614251565b61227b9190614303565b9050919050565b604f5f60445481526020019081526020015f205f9054906101000a900460ff166122d8576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f60445481526020019081526020015f205f9054906101000a900460ff161561232f576040517f3366263c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1060455461233f91906143d4565b421015612378576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61384060455461238891906143d4565b4211156123c1576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604554036123fc576040517fe1a6d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612467573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248b9190614251565b90505f81036124c6576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604a5f60445481526020019081526020015f205490505f8103612516576040517fcdad98fd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015612611575f604c5f60445481526020019081526020015f205f8381526020019081526020015f205490505f5f82111561257b5783610fa08361255e9190614336565b61256891906143a4565b9050610fa081111561257a57610fa090505b5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ab06ee584836040518363ffffffff1660e01b81526004016125d792919061465b565b5f604051808303815f87803b1580156125ee575f5ffd5b505af1158015612600573d5f5f3e3d5ffd5b505050505050806001019050612518565b50600160505f60445481526020019081526020015f205f6101000a81548160ff0219169083151502179055506044547f6debf9c0b8bd7ecda40db89a2641f61251d80a576b5c5e5f06de7f1c2a65850a4260405161266f9190613d30565b60405180910390a25f600160445461268791906143d4565b9050806044819055505f604381905550426041819055505f604581905550807f0339a014b2a3d6abc2fc06f1b5012e5d2f000c05e177344349717baaea6c4a6e426040516126d59190613d30565b60405180910390a2505050565b60485f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158061273d575061273c82613479565b5b15612774576040517ffb9b7df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127de573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128029190614251565b831061283a576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a764000081101561287c576040517fc978b25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff16156128d3576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f6128e28486604454613619565b915091508115801561291a5750600a604d5f60445481526020019081526020015f205f8781526020019081526020015f208054905010155b15612951576040517f86bd0d8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297e3330858773ffffffffffffffffffffffffffffffffffffffff16613708909392919063ffffffff16565b81156129e25782604d5f60445481526020019081526020015f205f8781526020019081526020015f2082815481106129b9576129b86142a9565b5b905f5260205f2090600402016002015f8282546129d691906143d4565b92505081905550612ac8565b604d5f60445481526020019081526020015f205f8681526020019081526020015f2060405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200160445481526020018581526020015f815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505b604454858573ffffffffffffffffffffffffffffffffffffffff167f53d7e12b48de8b91fcdb4f254d62b1a73b83ce93def79899dba9a49f630319d486604051612b129190613d30565b60405180910390a45050505050565b60455481565b612b2f61310d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b9f575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612b969190614054565b60405180910390fd5b612ba881613194565b50565b5f5f5f604e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208054905090505f5b81811015612c9657604e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f208181548110612c6857612c676142a9565b5b905f5260205f2090600302015f01548603612c8b57600181935093505050612c9f565b806001019050612c02565b505f5f92509250505b935093915050565b60025f5403612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce2906146cc565b60405180910390fd5b60025f81905550565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5b818110156130bd57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f208181548110612daf57612dae6142a9565b5b905f5260205f2090600302016002015f9054906101000a900460ff1615612e02576040517f23eb246c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208281548110612e6157612e606142a9565b5b905f5260205f2090600302015f015490505f612e7e3383876109ef565b90506001604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f208481548110612ee057612edf6142a9565b5b905f5260205f2090600302016002015f6101000a81548160ff0219169083151502179055505f815190505f5b818110156130ae575f838281518110612f2857612f276142a9565b5b60200260200101516040015111156130a357828181518110612f4d57612f4c6142a9565b5b602002602001015160400151604d5f8981526020019081526020015f205f8681526020019081526020015f208281548110612f8b57612f8a6142a9565b5b905f5260205f2090600402016003015f828254612fa891906143d4565b9250508190555061301533848381518110612fc657612fc56142a9565b5b602002602001015160400151858481518110612fe557612fe46142a9565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff166137919092919063ffffffff16565b83873373ffffffffffffffffffffffffffffffffffffffff167f8f62d91ae48a7294bb9327b1e922ff909fa07eed33dbf02378ab8b2e26c1a7a8868581518110613062576130616142a9565b5b60200260200101515f01518786815181106130805761307f6142a9565b5b60200260200101516040015160405161309a9291906146ea565b60405180910390a45b806001019050612f0c565b50505050806001019050612d49565b5081604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b60015f81905550565b613115613817565b73ffffffffffffffffffffffffffffffffffffffff16613133611576565b73ffffffffffffffffffffffffffffffffffffffff161461319257613156613817565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131899190614054565b60405180910390fd5b565b5f61319d613265565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103613306576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b8160495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461339891906143d4565b9250508190555060465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa68acde83836040518363ffffffff1660e01b81526004016133fb929190614711565b5f604051808303815f87803b158015613412575f5ffd5b505af1158015613424573d5f5f3e3d5ffd5b505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61345b61381e565b6134648161385e565b50565b61346f61381e565b6134776138e2565b565b5f5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135099190614251565b90505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351abdfe96040518163ffffffff1660e01b81526004015f60405180830381865afa158015613575573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061359d919061488e565b90505f5b8281101561360d578181815181106135bc576135bb6142a9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036136025760019350505050613614565b8060010190506135a1565b505f925050505b919050565b5f5f5f604d5f8581526020019081526020015f205f8681526020019081526020015f208054905090505f5b818110156136f7578673ffffffffffffffffffffffffffffffffffffffff16604d5f8781526020019081526020015f205f8881526020019081526020015f208281548110613695576136946142a9565b5b905f5260205f2090600402015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036136ec57600181935093505050613700565b806001019050613644565b505f5f92509250505b935093915050565b61378b846323b872dd60e01b858585604051602401613729939291906148d5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506138f3565b50505050565b6138128363a9059cbb60e01b84846040516024016137b09291906146ea565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506138f3565b505050565b5f33905090565b6138266139b9565b61385c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61386661381e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138d6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016138cd9190614054565b60405180910390fd5b6138df81613194565b50565b6138ea61381e565b60015f81905550565b5f613954826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139d79092919063ffffffff16565b90505f815114806139755750808060200190518101906139749190614493565b5b6139b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ab9061497a565b60405180910390fd5b505050565b5f6139c261342c565b5f0160089054906101000a900460ff16905090565b60606139e584845f856139ee565b90509392505050565b606082471015613a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2a90614a08565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051613a5b9190614a78565b5f6040518083038185875af1925050503d805f8114613a95576040519150601f19603f3d011682016040523d82523d5f602084013e613a9a565b606091505b5091509150613aab87838387613ab7565b92505050949350505050565b60608315613b18575f835103613b1057613ad085613b2b565b613b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0690614ad8565b60405180910390fd5b5b829050613b23565b613b228383613b4d565b5b949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115613b5f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b939190614b38565b60405180910390fd5b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112613c0857613c07613be7565b5b8235905067ffffffffffffffff811115613c2557613c24613beb565b5b602083019150836060820283011115613c4157613c40613bef565b5b9250929050565b5f5f60208385031215613c5e57613c5d613bdf565b5b5f83013567ffffffffffffffff811115613c7b57613c7a613be3565b5b613c8785828601613bf3565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbc82613c93565b9050919050565b613ccc81613cb2565b8114613cd6575f5ffd5b50565b5f81359050613ce781613cc3565b92915050565b5f60208284031215613d0257613d01613bdf565b5b5f613d0f84828501613cd9565b91505092915050565b5f819050919050565b613d2a81613d18565b82525050565b5f602082019050613d435f830184613d21565b92915050565b613d5281613d18565b8114613d5c575f5ffd5b50565b5f81359050613d6d81613d49565b92915050565b5f5f5f60608486031215613d8a57613d89613bdf565b5b5f613d9786828701613cd9565b9350506020613da886828701613d5f565b9250506040613db986828701613d5f565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613df581613cb2565b82525050565b613e0481613d18565b82525050565b608082015f820151613e1e5f850182613dec565b506020820151613e316020850182613dfb565b506040820151613e446040850182613dfb565b506060820151613e576060850182613dfb565b50505050565b5f613e688383613e0a565b60808301905092915050565b5f602082019050919050565b5f613e8a82613dc3565b613e948185613dcd565b9350613e9f83613ddd565b805f5b83811015613ecf578151613eb68882613e5d565b9750613ec183613e74565b925050600181019050613ea2565b5085935050505092915050565b5f6020820190508181035f830152613ef48184613e80565b905092915050565b5f819050919050565b5f613f1f613f1a613f1584613c93565b613efc565b613c93565b9050919050565b5f613f3082613f05565b9050919050565b5f613f4182613f26565b9050919050565b613f5181613f37565b82525050565b5f602082019050613f6a5f830184613f48565b92915050565b5f60208284031215613f8557613f84613bdf565b5b5f613f9284828501613d5f565b91505092915050565b5f8115159050919050565b613faf81613f9b565b82525050565b5f602082019050613fc85f830184613fa6565b92915050565b5f5f60408385031215613fe457613fe3613bdf565b5b5f613ff185828601613d5f565b925050602061400285828601613d5f565b9150509250929050565b5f61401682613f26565b9050919050565b6140268161400c565b82525050565b5f60208201905061403f5f83018461401d565b92915050565b61404e81613cb2565b82525050565b5f6020820190506140675f830184614045565b92915050565b61407681613f9b565b8114614080575f5ffd5b50565b5f813590506140918161406d565b92915050565b5f5f604083850312156140ad576140ac613bdf565b5b5f6140ba85828601613cd9565b92505060206140cb85828601614083565b9150509250929050565b5f5f5f606084860312156140ec576140eb613bdf565b5b5f6140f986828701613d5f565b935050602061410a86828701613d5f565b925050604061411b86828701613d5f565b9150509250925092565b5f6080820190506141385f830187614045565b6141456020830186613d21565b6141526040830185613d21565b61415f6060830184613d21565b95945050505050565b5f60608201905061417b5f830186613d21565b6141886020830185613d21565b6141956040830184613fa6565b949350505050565b5f5f5f606084860312156141b4576141b3613bdf565b5b5f6141c186828701613cd9565b93505060206141d286828701613d5f565b92505060406141e386828701613cd9565b9150509250925092565b5f5f5f6060848603121561420457614203613bdf565b5b5f61421186828701613d5f565b935050602061422286828701613cd9565b925050604061423386828701613d5f565b9150509250925092565b5f8151905061424b81613d49565b92915050565b5f6020828403121561426657614265613bdf565b5b5f6142738482850161423d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430d82613d18565b915061431883613d18565b92508282039050818111156143305761432f6142d6565b5b92915050565b5f61434082613d18565b915061434b83613d18565b925082820261435981613d18565b915082820484148315176143705761436f6142d6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143ae82613d18565b91506143b983613d18565b9250826143c9576143c8614377565b5b828204905092915050565b5f6143de82613d18565b91506143e983613d18565b9250828201905080821115614401576144006142d6565b5b92915050565b5f82825260208201905092915050565b7f4e6f7420417070726f76656420746f2057686974656c697374000000000000005f82015250565b5f61444b601983614407565b915061445682614417565b602082019050919050565b5f6020820190508181035f8301526144788161443f565b9050919050565b5f8151905061448d8161406d565b92915050565b5f602082840312156144a8576144a7613bdf565b5b5f6144b58482850161447f565b91505092915050565b7f5a65726f206164647265737320636865660000000000000000000000000000005f82015250565b5f6144f2601183614407565b91506144fd826144be565b602082019050919050565b5f6020820190508181035f83015261451f816144e6565b9050919050565b7f5a65726f206164647265737320746f6b656e00000000000000000000000000005f82015250565b5f61455a601283614407565b915061456582614526565b602082019050919050565b5f6020820190508181035f8301526145878161454e565b9050919050565b7f45706f636820746f6f2073686f727400000000000000000000000000000000005f82015250565b5f6145c2600f83614407565b91506145cd8261458e565b602082019050919050565b5f6020820190508181035f8301526145ef816145b6565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61462c614627614622846145f6565b613efc565b6145ff565b9050919050565b61463c81614612565b82525050565b5f6020820190506146555f830184614633565b92915050565b5f60408201905061466e5f830185613d21565b61467b6020830184613d21565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6146b6601f83614407565b91506146c182614682565b602082019050919050565b5f6020820190508181035f8301526146e3816146aa565b9050919050565b5f6040820190506146fd5f830185614045565b61470a6020830184613d21565b9392505050565b5f6040820190506147245f830185613d21565b6147316020830184614045565b9392505050565b5f601f19601f8301169050919050565b61475182614738565b810181811067ffffffffffffffff821117156147705761476f61427c565b5b80604052505050565b5f614782613bd6565b905061478e8282614748565b919050565b5f67ffffffffffffffff8211156147ad576147ac61427c565b5b602082029050602081019050919050565b5f6147c882613cb2565b9050919050565b6147d8816147be565b81146147e2575f5ffd5b50565b5f815190506147f3816147cf565b92915050565b5f61480b61480684614793565b614779565b9050808382526020820190506020840283018581111561482e5761482d613bef565b5b835b81811015614857578061484388826147e5565b845260208401935050602081019050614830565b5050509392505050565b5f82601f83011261487557614874613be7565b5b81516148858482602086016147f9565b91505092915050565b5f602082840312156148a3576148a2613bdf565b5b5f82015167ffffffffffffffff8111156148c0576148bf613be3565b5b6148cc84828501614861565b91505092915050565b5f6060820190506148e85f830186614045565b6148f56020830185614045565b6149026040830184613d21565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614964602a83614407565b915061496f8261490a565b604082019050919050565b5f6020820190508181035f83015261499181614958565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6149f2602683614407565b91506149fd82614998565b604082019050919050565b5f6020820190508181035f830152614a1f816149e6565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f614a5282614a26565b614a5c8185614a30565b9350614a6c818560208601614a3a565b80840191505092915050565b5f614a838284614a48565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614ac2601d83614407565b9150614acd82614a8e565b602082019050919050565b5f6020820190508181035f830152614aef81614ab6565b9050919050565b5f81519050919050565b5f614b0a82614af6565b614b148185614407565b9350614b24818560208601614a3a565b614b2d81614738565b840191505092915050565b5f6020820190508181035f830152614b508184614b00565b90509291505056fea2646970667358221220193dfee2f14e224d77e72193cfe4a8ddb3eed8121088b3dca97ad77a84ad3a5264736f6c634300081b0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b506004361061025c575f3560e01c8063744b3b0411610144578063b384abef116100c1578063cb67f94811610085578063cb67f9481461072f578063cc6698511461074b578063cde4efa91461077b578063e402ecb714610785578063e476f635146107a1578063f2fde38b146107bf5761025c565b8063b384abef14610679578063b683450a14610695578063bf812ff2146106c5578063c14164d8146106e3578063c350a1b5146107135761025c565b80638cab882d116101085780638cab882d146105d15780638da5cb5b146105ef57806396c82e571461060d57806397ec67ee1461062b578063b03401231461065b5761025c565b8063744b3b0414610500578063746047931461051e5780637e0adc93146105515780638049e17b1461058157806387244735146105b35761025c565b80633b6f064b116101dd57806362e33bed116101a157806362e33bed146104785780636747bea1146104945780636c256980146104b25780636f9874a4146104ce578063715018a6146104ec57806372a66b69146104f65761025c565b80633b6f064b146103be57806344097c48146103ee578063575a86b21461040c57806357d775f81461042a5780635c16e15e146104485761025c565b80631c244b5b116102245780631c244b5b146103185780631fc8bc5d14610336578063290d24941461035457806331ee02af1461035e578063363cbae01461038e5761025c565b8063018f561f146102605780630259ef581461027c57806306a4c983146102ac5780630e74689b146102ca57806310e94895146102fa575b5f5ffd5b61027a60048036038101906102759190613c48565b6107db565b005b61029660048036038101906102919190613ced565b6109d4565b6040516102a39190613d30565b60405180910390f35b6102b46109e9565b6040516102c19190613d30565b60405180910390f35b6102e460048036038101906102df9190613d73565b6109ef565b6040516102f19190613edc565b60405180910390f35b610302610c93565b60405161030f9190613d30565b60405180910390f35b610320610c9c565b60405161032d9190613d30565b60405180910390f35b61033e610ca5565b60405161034b9190613f57565b60405180910390f35b61035c610cca565b005b61037860048036038101906103739190613f70565b610e3a565b6040516103859190613fb5565b60405180910390f35b6103a860048036038101906103a39190613ced565b610e57565b6040516103b59190613fb5565b60405180910390f35b6103d860048036038101906103d39190613fce565b610e74565b6040516103e59190613d30565b60405180910390f35b6103f6610e94565b604051610403919061402c565b60405180910390f35b610414610eb9565b6040516104219190614054565b60405180910390f35b610432610ede565b60405161043f9190613d30565b60405180910390f35b610462600480360381019061045d9190613ced565b610ee4565b60405161046f9190613d30565b60405180910390f35b610492600480360381019061048d9190614097565b610ef9565b005b61049c6110d5565b6040516104a99190613d30565b60405180910390f35b6104cc60048036038101906104c79190613f70565b6110e4565b005b6104d661118f565b6040516104e39190613d30565b60405180910390f35b6104f4611195565b005b6104fe6111a8565b005b610508611483565b6040516105159190613d30565b60405180910390f35b610538600480360381019061053391906140d5565b611488565b6040516105489493929190614125565b60405180910390f35b61056b60048036038101906105669190613f70565b6114f8565b6040516105789190613d30565b60405180910390f35b61059b60048036038101906105969190613d73565b61150d565b6040516105aa93929190614168565b60405180910390f35b6105bb611564565b6040516105c89190613d30565b60405180910390f35b6105d961156a565b6040516105e69190613d30565b60405180910390f35b6105f7611576565b6040516106049190614054565b60405180910390f35b6106156115ab565b6040516106229190613d30565b60405180910390f35b61064560048036038101906106409190613f70565b6115b1565b6040516106529190613fb5565b60405180910390f35b6106636115ce565b6040516106709190614054565b60405180910390f35b610693600480360381019061068e9190613fce565b6115f3565b005b6106af60048036038101906106aa9190613ced565b611bcf565b6040516106bc9190613d30565b60405180910390f35b6106cd611c71565b6040516106da9190613d30565b60405180910390f35b6106fd60048036038101906106f89190613ced565b611c77565b60405161070a9190613d30565b60405180910390f35b61072d6004803603810190610728919061419d565b611cbd565b005b61074960048036038101906107449190613ced565b612088565b005b61076560048036038101906107609190613ced565b6121ce565b6040516107729190613d30565b60405180910390f35b610783612282565b005b61079f600480360381019061079a91906141ed565b6126e2565b005b6107a9612b21565b6040516107b69190613d30565b60405180910390f35b6107d960048036038101906107d49190613ced565b612b27565b005b5f8282905090505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108719190614251565b90505f8167ffffffffffffffff81111561088e5761088d61427c565b5b6040519080825280602002602001820160405280156108bc5781602001602082028036833780820191505090505b5090505f5b838110156109cc575f8686838181106108dd576108dc6142a9565b5b9050606002015f01359050838110610921576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828181518110610934576109336142a9565b5b602002602001015115610973576040517fae96cf7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838281518110610988576109876142a9565b5b6020026020010190151590811515815250506109c0818888858181106109b1576109b06142a9565b5b905060600201602001356115f3565b508060010190506108c1565b505050505050565b6049602052805f5260405f205f915090505481565b60415481565b60605f604d5f8481526020019081526020015f205f8581526020019081526020015f208054905090505f8167ffffffffffffffff811115610a3357610a3261427c565b5b604051908082528060200260200182016040528015610a6c57816020015b610a59613b9c565b815260200190600190039081610a515790505b5090505f604c5f8681526020019081526020015f205f8781526020019081526020015f205490505f8103610aa557819350505050610c8c565b5f5f5f610ab38a8a8a612bab565b915091508115610b2e57604e5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8981526020019081526020015f208181548110610b1b57610b1a6142a9565b5b905f5260205f2090600302016001015492505b5f5b86811015610c81575f604d5f8b81526020019081526020015f205f8c81526020019081526020015f208281548110610b6b57610b6a6142a9565b5b905f5260205f20906004020190505f81600301548260020154610b8e9190614303565b90505f811115610c74575f8187610ba59190614336565b9050818782610bb491906143a4565b14610beb576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8882610bf891906143a4565b90506040518060800160405280855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018281526020015f8152508a8681518110610c6657610c656142a9565b5b602002602001018190525050505b5050806001019050610b30565b508496505050505050505b9392505050565b5f604154905090565b5f604254905090565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002610e10610cd99190614336565b604254604154610ce991906143d4565b610cf39190614303565b421015610d2c576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604254604154610d3c91906143d4565b421115610d75576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615610dcc576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001604f5f60445481526020019081526020015f205f6101000a81548160ff021916908315150217905550426045819055506044547f38726a7c4990228ceea18e072f773791ed75a63e2ea835e78dd89df680e2aa8c42604051610e309190613d30565b60405180910390a2565b6050602052805f5260405f205f915054906101000a900460ff1681565b6048602052805f5260405f205f915054906101000a900460ff1681565b604c602052815f5260405f20602052805f5260405f205f91509150505481565b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60425481565b604b602052805f5260405f205f915090505481565b5f610f02611576565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f8a5750603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614461565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361102e576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160485f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fd793fd780e30a609bf1357c38ccaff5af874b132935bac8bc80317d3f8fc4e4e836040516110c89190613fb5565b60405180910390a2505050565b6a22bdd88fed9efc6a00000081565b6110ec612ca7565b6044548110611127576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f8281526020019081526020015f205f9054906101000a900460ff1661117b576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118481612cf4565b61118c613104565b50565b60445481565b61119d61310d565b6111a65f613194565b565b6111b0612ca7565b5f604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050604454811061122c576040517f1613b7eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60018261123a91906143d4565b90505f604454905080821061127b576040517fa697924200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290505b818110156114275760505f8281526020019081526020015f205f9054906101000a900460ff166112dc57807fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a261141a565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5f90505f5f90505b828110156113d457604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f20818154811061139e5761139d6142a9565b5b905f5260205f2090600302016002015f9054906101000a900460ff166113c757600191506113d4565b8080600101915050611338565b5080156113e9576113e483612cf4565b611417565b827fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a25b50505b8080600101915050611280565b506001816114359190614303565b604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050611481613104565b565b600a81565b604d602052825f5260405f20602052815f5260405f2081815481106114ab575f80fd5b905f5260205f2090600402015f925092505050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b604a602052805f5260405f205f915090505481565b604e602052825f5260405f20602052815f5260405f208181548110611530575f80fd5b905f5260205f2090600302015f925092505050805f015490806001015490806002015f9054906101000a900460ff16905083565b610e1081565b670de0b6b3a764000081565b5f5f611580613265565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60435481565b604f602052805f5260405f205f915054906101000a900460ff1681565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116819190614251565b82106116b9576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806116c3336121ce565b10156116fb576040517f60900ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6a22bdd88fed9efc6a000000811115611740576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615611797576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e106042546041546117aa91906143d4565b6117b49190614303565b42106117ec576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9d50832336040518263ffffffff1660e01b81526004016118469190614054565b602060405180830381865afa158015611861573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118859190614493565b80156118ce57505f60495f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414155b156118dd576118dc3361328c565b5b6118e7813361334c565b5f5f6118f63385604454612bab565b91509150816119c857604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f2060405180606001604052808681526020018581526020015f1515815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055505050611b01565b5f83604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611a2a57611a296142a9565b5b905f5260205f20906003020160010154611a4491906143d4565b90506a22bdd88fed9efc6a000000811115611a8b576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611aec57611aeb6142a9565b5b905f5260205f20906003020160010181905550505b82604c5f60445481526020019081526020015f205f8681526020019081526020015f205f828254611b3291906143d4565b9250508190555082604a5f60445481526020019081526020015f205f828254611b5b91906143d4565b925050819055508260435f828254611b7391906143d4565b92505081905550833373ffffffffffffffffffffffffffffffffffffffff167fb4cfecf70861b7b150d8337780d34fb4cbc2114b5fb1fe51a5c5fca1849f727485604051611bc19190613d30565b60405180910390a350505050565b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b683450a836040518263ffffffff1660e01b8152600401611c2a9190614054565b6020604051808303815f875af1158015611c46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6a9190614251565b9050919050565b61384081565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f611cc661342c565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff16148015611d0e5750825b90505f60018367ffffffffffffffff16148015611d4157505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611d4f575080155b15611d86576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611dd3576001855f0160086101000a81548160ff0219169083151502179055505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3890614508565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614570565b60405180910390fd5b610e106002610e10611ec19190614336565b611ecb91906143d4565b8711611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906145d8565b60405180910390fd5b611f1533613453565b611f1d613467565b87603f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866042819055508560405f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560465f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760475f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550831561207e575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516120759190614642565b60405180910390a15b5050505050505050565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210e576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103612188576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f6121d882611c77565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122329190614054565b602060405180830381865afa15801561224d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122719190614251565b61227b9190614303565b9050919050565b604f5f60445481526020019081526020015f205f9054906101000a900460ff166122d8576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f60445481526020019081526020015f205f9054906101000a900460ff161561232f576040517f3366263c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1060455461233f91906143d4565b421015612378576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61384060455461238891906143d4565b4211156123c1576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604554036123fc576040517fe1a6d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612467573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248b9190614251565b90505f81036124c6576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604a5f60445481526020019081526020015f205490505f8103612516576040517fcdad98fd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015612611575f604c5f60445481526020019081526020015f205f8381526020019081526020015f205490505f5f82111561257b5783610fa08361255e9190614336565b61256891906143a4565b9050610fa081111561257a57610fa090505b5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ab06ee584836040518363ffffffff1660e01b81526004016125d792919061465b565b5f604051808303815f87803b1580156125ee575f5ffd5b505af1158015612600573d5f5f3e3d5ffd5b505050505050806001019050612518565b50600160505f60445481526020019081526020015f205f6101000a81548160ff0219169083151502179055506044547f6debf9c0b8bd7ecda40db89a2641f61251d80a576b5c5e5f06de7f1c2a65850a4260405161266f9190613d30565b60405180910390a25f600160445461268791906143d4565b9050806044819055505f604381905550426041819055505f604581905550807f0339a014b2a3d6abc2fc06f1b5012e5d2f000c05e177344349717baaea6c4a6e426040516126d59190613d30565b60405180910390a2505050565b60485f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158061273d575061273c82613479565b5b15612774576040517ffb9b7df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127de573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128029190614251565b831061283a576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a764000081101561287c576040517fc978b25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff16156128d3576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f6128e28486604454613619565b915091508115801561291a5750600a604d5f60445481526020019081526020015f205f8781526020019081526020015f208054905010155b15612951576040517f86bd0d8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297e3330858773ffffffffffffffffffffffffffffffffffffffff16613708909392919063ffffffff16565b81156129e25782604d5f60445481526020019081526020015f205f8781526020019081526020015f2082815481106129b9576129b86142a9565b5b905f5260205f2090600402016002015f8282546129d691906143d4565b92505081905550612ac8565b604d5f60445481526020019081526020015f205f8681526020019081526020015f2060405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200160445481526020018581526020015f815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505b604454858573ffffffffffffffffffffffffffffffffffffffff167f53d7e12b48de8b91fcdb4f254d62b1a73b83ce93def79899dba9a49f630319d486604051612b129190613d30565b60405180910390a45050505050565b60455481565b612b2f61310d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b9f575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612b969190614054565b60405180910390fd5b612ba881613194565b50565b5f5f5f604e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208054905090505f5b81811015612c9657604e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f208181548110612c6857612c676142a9565b5b905f5260205f2090600302015f01548603612c8b57600181935093505050612c9f565b806001019050612c02565b505f5f92509250505b935093915050565b60025f5403612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce2906146cc565b60405180910390fd5b60025f81905550565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5b818110156130bd57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f208181548110612daf57612dae6142a9565b5b905f5260205f2090600302016002015f9054906101000a900460ff1615612e02576040517f23eb246c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208281548110612e6157612e606142a9565b5b905f5260205f2090600302015f015490505f612e7e3383876109ef565b90506001604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f208481548110612ee057612edf6142a9565b5b905f5260205f2090600302016002015f6101000a81548160ff0219169083151502179055505f815190505f5b818110156130ae575f838281518110612f2857612f276142a9565b5b60200260200101516040015111156130a357828181518110612f4d57612f4c6142a9565b5b602002602001015160400151604d5f8981526020019081526020015f205f8681526020019081526020015f208281548110612f8b57612f8a6142a9565b5b905f5260205f2090600402016003015f828254612fa891906143d4565b9250508190555061301533848381518110612fc657612fc56142a9565b5b602002602001015160400151858481518110612fe557612fe46142a9565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff166137919092919063ffffffff16565b83873373ffffffffffffffffffffffffffffffffffffffff167f8f62d91ae48a7294bb9327b1e922ff909fa07eed33dbf02378ab8b2e26c1a7a8868581518110613062576130616142a9565b5b60200260200101515f01518786815181106130805761307f6142a9565b5b60200260200101516040015160405161309a9291906146ea565b60405180910390a45b806001019050612f0c565b50505050806001019050612d49565b5081604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b60015f81905550565b613115613817565b73ffffffffffffffffffffffffffffffffffffffff16613133611576565b73ffffffffffffffffffffffffffffffffffffffff161461319257613156613817565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131899190614054565b60405180910390fd5b565b5f61319d613265565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103613306576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b8160495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461339891906143d4565b9250508190555060465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa68acde83836040518363ffffffff1660e01b81526004016133fb929190614711565b5f604051808303815f87803b158015613412575f5ffd5b505af1158015613424573d5f5f3e3d5ffd5b505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61345b61381e565b6134648161385e565b50565b61346f61381e565b6134776138e2565b565b5f5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135099190614251565b90505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351abdfe96040518163ffffffff1660e01b81526004015f60405180830381865afa158015613575573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061359d919061488e565b90505f5b8281101561360d578181815181106135bc576135bb6142a9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036136025760019350505050613614565b8060010190506135a1565b505f925050505b919050565b5f5f5f604d5f8581526020019081526020015f205f8681526020019081526020015f208054905090505f5b818110156136f7578673ffffffffffffffffffffffffffffffffffffffff16604d5f8781526020019081526020015f205f8881526020019081526020015f208281548110613695576136946142a9565b5b905f5260205f2090600402015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036136ec57600181935093505050613700565b806001019050613644565b505f5f92509250505b935093915050565b61378b846323b872dd60e01b858585604051602401613729939291906148d5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506138f3565b50505050565b6138128363a9059cbb60e01b84846040516024016137b09291906146ea565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506138f3565b505050565b5f33905090565b6138266139b9565b61385c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61386661381e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138d6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016138cd9190614054565b60405180910390fd5b6138df81613194565b50565b6138ea61381e565b60015f81905550565b5f613954826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139d79092919063ffffffff16565b90505f815114806139755750808060200190518101906139749190614493565b5b6139b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ab9061497a565b60405180910390fd5b505050565b5f6139c261342c565b5f0160089054906101000a900460ff16905090565b60606139e584845f856139ee565b90509392505050565b606082471015613a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2a90614a08565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051613a5b9190614a78565b5f6040518083038185875af1925050503d805f8114613a95576040519150601f19603f3d011682016040523d82523d5f602084013e613a9a565b606091505b5091509150613aab87838387613ab7565b92505050949350505050565b60608315613b18575f835103613b1057613ad085613b2b565b613b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0690614ad8565b60405180910390fd5b5b829050613b23565b613b228383613b4d565b5b949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115613b5f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b939190614b38565b60405180910390fd5b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112613c0857613c07613be7565b5b8235905067ffffffffffffffff811115613c2557613c24613beb565b5b602083019150836060820283011115613c4157613c40613bef565b5b9250929050565b5f5f60208385031215613c5e57613c5d613bdf565b5b5f83013567ffffffffffffffff811115613c7b57613c7a613be3565b5b613c8785828601613bf3565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbc82613c93565b9050919050565b613ccc81613cb2565b8114613cd6575f5ffd5b50565b5f81359050613ce781613cc3565b92915050565b5f60208284031215613d0257613d01613bdf565b5b5f613d0f84828501613cd9565b91505092915050565b5f819050919050565b613d2a81613d18565b82525050565b5f602082019050613d435f830184613d21565b92915050565b613d5281613d18565b8114613d5c575f5ffd5b50565b5f81359050613d6d81613d49565b92915050565b5f5f5f60608486031215613d8a57613d89613bdf565b5b5f613d9786828701613cd9565b9350506020613da886828701613d5f565b9250506040613db986828701613d5f565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613df581613cb2565b82525050565b613e0481613d18565b82525050565b608082015f820151613e1e5f850182613dec565b506020820151613e316020850182613dfb565b506040820151613e446040850182613dfb565b506060820151613e576060850182613dfb565b50505050565b5f613e688383613e0a565b60808301905092915050565b5f602082019050919050565b5f613e8a82613dc3565b613e948185613dcd565b9350613e9f83613ddd565b805f5b83811015613ecf578151613eb68882613e5d565b9750613ec183613e74565b925050600181019050613ea2565b5085935050505092915050565b5f6020820190508181035f830152613ef48184613e80565b905092915050565b5f819050919050565b5f613f1f613f1a613f1584613c93565b613efc565b613c93565b9050919050565b5f613f3082613f05565b9050919050565b5f613f4182613f26565b9050919050565b613f5181613f37565b82525050565b5f602082019050613f6a5f830184613f48565b92915050565b5f60208284031215613f8557613f84613bdf565b5b5f613f9284828501613d5f565b91505092915050565b5f8115159050919050565b613faf81613f9b565b82525050565b5f602082019050613fc85f830184613fa6565b92915050565b5f5f60408385031215613fe457613fe3613bdf565b5b5f613ff185828601613d5f565b925050602061400285828601613d5f565b9150509250929050565b5f61401682613f26565b9050919050565b6140268161400c565b82525050565b5f60208201905061403f5f83018461401d565b92915050565b61404e81613cb2565b82525050565b5f6020820190506140675f830184614045565b92915050565b61407681613f9b565b8114614080575f5ffd5b50565b5f813590506140918161406d565b92915050565b5f5f604083850312156140ad576140ac613bdf565b5b5f6140ba85828601613cd9565b92505060206140cb85828601614083565b9150509250929050565b5f5f5f606084860312156140ec576140eb613bdf565b5b5f6140f986828701613d5f565b935050602061410a86828701613d5f565b925050604061411b86828701613d5f565b9150509250925092565b5f6080820190506141385f830187614045565b6141456020830186613d21565b6141526040830185613d21565b61415f6060830184613d21565b95945050505050565b5f60608201905061417b5f830186613d21565b6141886020830185613d21565b6141956040830184613fa6565b949350505050565b5f5f5f606084860312156141b4576141b3613bdf565b5b5f6141c186828701613cd9565b93505060206141d286828701613d5f565b92505060406141e386828701613cd9565b9150509250925092565b5f5f5f6060848603121561420457614203613bdf565b5b5f61421186828701613d5f565b935050602061422286828701613cd9565b925050604061423386828701613d5f565b9150509250925092565b5f8151905061424b81613d49565b92915050565b5f6020828403121561426657614265613bdf565b5b5f6142738482850161423d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430d82613d18565b915061431883613d18565b92508282039050818111156143305761432f6142d6565b5b92915050565b5f61434082613d18565b915061434b83613d18565b925082820261435981613d18565b915082820484148315176143705761436f6142d6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143ae82613d18565b91506143b983613d18565b9250826143c9576143c8614377565b5b828204905092915050565b5f6143de82613d18565b91506143e983613d18565b9250828201905080821115614401576144006142d6565b5b92915050565b5f82825260208201905092915050565b7f4e6f7420417070726f76656420746f2057686974656c697374000000000000005f82015250565b5f61444b601983614407565b915061445682614417565b602082019050919050565b5f6020820190508181035f8301526144788161443f565b9050919050565b5f8151905061448d8161406d565b92915050565b5f602082840312156144a8576144a7613bdf565b5b5f6144b58482850161447f565b91505092915050565b7f5a65726f206164647265737320636865660000000000000000000000000000005f82015250565b5f6144f2601183614407565b91506144fd826144be565b602082019050919050565b5f6020820190508181035f83015261451f816144e6565b9050919050565b7f5a65726f206164647265737320746f6b656e00000000000000000000000000005f82015250565b5f61455a601283614407565b915061456582614526565b602082019050919050565b5f6020820190508181035f8301526145878161454e565b9050919050565b7f45706f636820746f6f2073686f727400000000000000000000000000000000005f82015250565b5f6145c2600f83614407565b91506145cd8261458e565b602082019050919050565b5f6020820190508181035f8301526145ef816145b6565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61462c614627614622846145f6565b613efc565b6145ff565b9050919050565b61463c81614612565b82525050565b5f6020820190506146555f830184614633565b92915050565b5f60408201905061466e5f830185613d21565b61467b6020830184613d21565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6146b6601f83614407565b91506146c182614682565b602082019050919050565b5f6020820190508181035f8301526146e3816146aa565b9050919050565b5f6040820190506146fd5f830185614045565b61470a6020830184613d21565b9392505050565b5f6040820190506147245f830185613d21565b6147316020830184614045565b9392505050565b5f601f19601f8301169050919050565b61475182614738565b810181811067ffffffffffffffff821117156147705761476f61427c565b5b80604052505050565b5f614782613bd6565b905061478e8282614748565b919050565b5f67ffffffffffffffff8211156147ad576147ac61427c565b5b602082029050602081019050919050565b5f6147c882613cb2565b9050919050565b6147d8816147be565b81146147e2575f5ffd5b50565b5f815190506147f3816147cf565b92915050565b5f61480b61480684614793565b614779565b9050808382526020820190506020840283018581111561482e5761482d613bef565b5b835b81811015614857578061484388826147e5565b845260208401935050602081019050614830565b5050509392505050565b5f82601f83011261487557614874613be7565b5b81516148858482602086016147f9565b91505092915050565b5f602082840312156148a3576148a2613bdf565b5b5f82015167ffffffffffffffff8111156148c0576148bf613be3565b5b6148cc84828501614861565b91505092915050565b5f6060820190506148e85f830186614045565b6148f56020830185614045565b6149026040830184613d21565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614964602a83614407565b915061496f8261490a565b604082019050919050565b5f6020820190508181035f83015261499181614958565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6149f2602683614407565b91506149fd82614998565b604082019050919050565b5f6020820190508181035f830152614a1f816149e6565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f614a5282614a26565b614a5c8185614a30565b9350614a6c818560208601614a3a565b80840191505092915050565b5f614a838284614a48565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614ac2601d83614407565b9150614acd82614a8e565b602082019050919050565b5f6020820190508181035f830152614aef81614ab6565b9050919050565b5f81519050919050565b5f614b0a82614af6565b614b148185614407565b9350614b24818560208601614a3a565b614b2d81614738565b840191505092915050565b5f6020820190508181035f830152614b508184614b00565b90509291505056fea2646970667358221220193dfee2f14e224d77e72193cfe4a8ddb3eed8121088b3dca97ad77a84ad3a5264736f6c634300081b0033
Deployed Bytecode Sourcemap
63790:15022:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68814:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64934:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64670:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74122:1236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78158:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78058:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64851:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70255:445;;;:::i;:::-;;65365:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64877:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65091:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64827:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64604:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64701:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65040:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73599:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64495:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73373:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64767:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13151:103;;;:::i;:::-;;72162:1203;;;:::i;:::-;;64214:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65164:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;64985:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65242:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;64382:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64324:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12416:147;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64734:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65313:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64637:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67559:1247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77950:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64439:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74011:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66926:626;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77481:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73851:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70708:1446;;;:::i;:::-;;69323:924;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64794:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13409:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68814:501;68877:14;68894:5;;:12;;68877:29;;68917:18;68938:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68917:38;;68966:22;69002:10;68991:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68966:47;;69039:9;69034:274;69054:6;69050:1;:10;69034:274;;;69082:11;69096:5;;69102:1;69096:8;;;;;;;:::i;:::-;;;;;;;:12;;;69082:26;;69134:10;69127:3;:17;69123:42;;69153:12;;;;;;;;;;;;;;69123:42;69184:8;69193:3;69184:13;;;;;;;;:::i;:::-;;;;;;;;69180:40;;;69206:14;;;;;;;;;;;;;;69180:40;69251:4;69235:8;69244:3;69235:13;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;;;;69270:26;69275:3;69280:5;;69286:1;69280:8;;;;;;;:::i;:::-;;;;;;;:15;;;69270:4;:26::i;:::-;69067:241;69062:3;;;;;69034:274;;;;68866:449;;;68814:501;;:::o;64934:44::-;;;;;;;;;;;;;;;;;:::o;64670:24::-;;;;:::o;74122:1236::-;74208:18;74239:19;74261:12;:19;74274:5;74261:19;;;;;;;;;;;:24;74281:3;74261:24;;;;;;;;;;;:31;;;;74239:53;;74303:25;74347:11;74331:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74303:56;;74380:18;74401:11;:18;74413:5;74401:18;;;;;;;;;;;:23;74420:3;74401:23;;;;;;;;;;;;74380:44;;74453:1;74439:10;:15;74435:34;;74463:6;74456:13;;;;;;;74435:34;74490:19;74521:10;74533:14;74551:35;74569:4;74575:3;74580:5;74551:17;:35::i;:::-;74520:66;;;;74601:5;74597:89;;;74637:9;:15;74647:4;74637:15;;;;;;;;;;;;;;;:22;74653:5;74637:22;;;;;;;;;;;74660:6;74637:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;74623:51;;74597:89;74711:9;74706:611;74726:11;74722:1;:15;74706:611;;;74759:24;74786:12;:19;74799:5;74786:19;;;;;;;;;;;:24;74806:3;74786:24;;;;;;;;;;;74811:1;74786:27;;;;;;;;:::i;:::-;;;;;;;;;;;;74759:54;;74828:23;74870:6;:14;;;74854:6;:13;;;:30;;;;:::i;:::-;74828:56;;74921:1;74903:15;:19;74899:407;;;75000:17;75034:15;75020:11;:29;;;;:::i;:::-;75000:49;;75099:15;75084:11;75072:9;:23;;;;:::i;:::-;:42;75068:65;;75123:10;;;;;;;;;;;;;;75068:65;75170:18;75203:10;75191:9;:22;;;;:::i;:::-;75170:43;;75244:46;;;;;;;;75254:6;:13;;;;;;;;;;;;75244:46;;;;;;75269:5;75244:46;;;;75276:10;75244:46;;;;75288:1;75244:46;;;75232:6;75239:1;75232:9;;;;;;;;:::i;:::-;;;;;;;:58;;;;74924:382;;74899:407;74744:573;;74739:3;;;;;74706:611;;;;75344:6;75337:13;;;;;;;;74122:1236;;;;;;:::o;78158:88::-;78203:7;78229:9;;78222:16;;78158:88;:::o;78058:92::-;78104:7;78131:11;;78124:18;;78058:92;:::o;64851:17::-;;;;;;;;;;;;;:::o;70255:445::-;70366:1;64425:7;70347:20;;;;:::i;:::-;70332:11;;70320:9;;:23;;;;:::i;:::-;:48;;;;:::i;:::-;70302:15;:66;70298:101;;;70377:22;;;;;;;;;;;;;;70298:101;70444:11;;70432:9;;:23;;;;:::i;:::-;70414:15;:41;70410:75;;;70464:21;;;;;;;;;;;;;;70410:75;70500:13;:20;70514:5;;70500:20;;;;;;;;;;;;;;;;;;;;;70496:46;;;70529:13;;;;;;;;;;;;;;70496:46;70579:4;70556:13;:20;70570:5;;70556:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;70608:15;70594:11;:29;;;;70669:5;;70649:43;70676:15;70649:43;;;;;;:::i;:::-;;;;;;;;70255:445::o;65365:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;64877:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;65091:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64827:17::-;;;;;;;;;;;;;:::o;64604:25::-;;;;;;;;;;;;;:::o;64701:26::-;;;;:::o;65040:44::-;;;;;;;;;;;;;;;;;:::o;73599:244::-;78666:14;78683:7;:5;:7::i;:::-;78666:24;;78724:6;78710:20;;:10;:20;;;:48;;;;78748:10;;;;;;;;;;;78734:24;;:10;:24;;;78710:48;78701:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;73713:1:::1;73696:19;;:5;:19;;::::0;73692:46:::1;;73724:14;;;;;;;;;;;;;;73692:46;73777:6;73749:18;:25;73768:5;73749:25;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;73821:5;73799:36;;;73828:6;73799:36;;;;;;:::i;:::-;;;;;;;;78655:154:::0;73599:244;;:::o;64495:51::-;64541:5;64495:51;:::o;73373:218::-;39487:21;:19;:21::i;:::-;73453:5:::1;;73444;:14;73440:42;;73467:15;;;;;;;;;;;;;;73440:42;73498:16;:23;73515:5;73498:23;;;;;;;;;;;;;;;;;;;;;73493:52;;73530:15;;;;;;;;;;;;;;73493:52;73556:27;73577:5;73556:20;:27::i;:::-;39531:20:::0;:18;:20::i;:::-;73373:218;:::o;64767:20::-;;;;:::o;13151:103::-;12302:13;:11;:13::i;:::-;13216:30:::1;13243:1;13216:18;:30::i;:::-;13151:103::o:0;72162:1203::-;39487:21;:19;:21::i;:::-;72222:19:::1;72244:9;:21;72254:10;72244:21;;;;;;;;;;;;;;;;72222:43;;72295:5;;72280:11;:20;72276:48;;72309:15;;;;;;;;;;;;;;72276:48;72345:18;72380:1;72366:11;:15;;;;:::i;:::-;72345:36;;72392:16;72411:5;;72392:24;;72455:8;72441:10;:22;72437:54;;72472:19;;;;;;;;;;;;;;72437:54;72509:20;72532:10;72509:33;;72504:797;72559:8;72544:12;:23;72504:797;;;72605:16;:30;72622:12;72605:30;;;;;;;;;;;;;;;;;;;;;72600:130;;72674:12;72661:26;;;;;;;;;;72706:8;;72600:130;72746:14;72763:9;:21;72773:10;72763:21;;;;;;;;;;;;;;;:35;72785:12;72763:35;;;;;;;;;;;:42;;;;72746:59;;72820:22;72845:5;72820:30;;72884:9;72896:1;72884:13;;72879:219;72903:6;72899:1;:10;72879:219;;;72940:9;:21;72950:10;72940:21;;;;;;;;;;;;;;;:35;72962:12;72940:35;;;;;;;;;;;72976:1;72940:38;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;;;;;;;;;;72935:148;;73031:4;73011:24;;73058:5;;72935:148;72911:3;;;;;;;72879:219;;;;73130:17;73126:164;;;73168:34;73189:12;73168:20;:34::i;:::-;73126:164;;;73261:12;73248:26;;;;;;;;;;73126:164;72585:716;;72504:797;72569:14;;;;;;;72504:797;;;;73356:1;73345:8;:12;;;;:::i;:::-;73321:9;:21;73331:10;73321:21;;;;;;;;;;;;;;;:36;;;;72211:1154;;;39531:20:::0;:18;:20::i;:::-;72162:1203::o;64214:48::-;64260:2;64214:48;:::o;65164:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64985:48::-;;;;;;;;;;;;;;;;;:::o;65242:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64382:50::-;64425:7;64382:50;:::o;64324:51::-;64371:4;64324:51;:::o;12416:147::-;12462:7;12482:24;12509:20;:18;:20::i;:::-;12482:47;;12547:1;:8;;;;;;;;;;;;12540:15;;;12416:147;:::o;64734:26::-;;;;:::o;65313:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;64637:26::-;;;;;;;;;;;;;:::o;67559:1247::-;67631:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67624:3;:24;67620:49;;67657:12;;;;;;;;;;;;;;67620:49;67708:6;67684:21;67694:10;67684:9;:21::i;:::-;:30;67680:62;;;67723:19;;;;;;;;;;;;;;67680:62;64541:5;67757:6;:28;67753:61;;;67794:20;;;;;;;;;;;;;;67753:61;67829:13;:20;67843:5;;67829:20;;;;;;;;;;;;;;;;;;;;;67825:46;;;67858:13;;;;;;;;;;;;;;67825:46;64425:7;67917:11;;67905:9;;:23;;;;:::i;:::-;:42;;;;:::i;:::-;67886:15;:61;67882:96;;67956:22;;;;;;;;;;;;;;67882:96;67993:4;;;;;;;;;;;:18;;;68012:10;67993:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;;68052:1;68027:9;:21;68037:10;68027:21;;;;;;;;;;;;;;;;:26;;67993:60;67989:123;;;68085:25;68099:10;68085:13;:25::i;:::-;67989:123;68133:31;68145:6;68153:10;68133:11;:31::i;:::-;68179:10;68191:14;68209:41;68227:10;68239:3;68244:5;;68209:17;:41::i;:::-;68178:72;;;;68276:5;68271:350;;68298:9;:21;68308:10;68298:21;;;;;;;;;;;;;;;:28;68320:5;;68298:28;;;;;;;;;;;68332:25;;;;;;;;68338:3;68332:25;;;;68343:6;68332:25;;;;68351:5;68332:25;;;;;68298:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68271:350;;;68391:16;68456:6;68410:9;:21;68420:10;68410:21;;;;;;;;;;;;;;;:28;68432:5;;68410:28;;;;;;;;;;;68439:6;68410:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;:52;;;;:::i;:::-;68391:71;;64541:5;68481:8;:30;68477:63;;;68520:20;;;;;;;;;;;;;;68477:63;68601:8;68555:9;:21;68565:10;68555:21;;;;;;;;;;;;;;;:28;68577:5;;68555:28;;;;;;;;;;;68584:6;68555:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;:54;;;;68376:245;68271:350;68668:6;68641:11;:18;68653:5;;68641:18;;;;;;;;;;;:23;68660:3;68641:23;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;68709:6;68685:13;:20;68699:5;;68685:20;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;68741:6;68726:11;;:21;;;;;;;:::i;:::-;;;;;;;;68786:3;68774:10;68765:33;;;68791:6;68765:33;;;;;;:::i;:::-;;;;;;;;67609:1197;;67559:1247;;:::o;77950:99::-;77994:12;78026:4;;;;;;;;;;;:11;;;78038:2;78026:15;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78019:22;;77950:99;;;:::o;64439:49::-;64481:7;64439:49;:::o;74011:103::-;74064:7;74091:9;:15;74101:4;74091:15;;;;;;;;;;;;;;;;74084:22;;74011:103;;;:::o;66926:626::-;4184:30;4217:26;:24;:26::i;:::-;4184:59;;4308:19;4331:1;:15;;;;;;;;;;;;4330:16;4308:38;;4357:18;4378:1;:14;;;;;;;;;;;;4357:35;;4743:17;4778:1;4763:11;:16;;;:34;;;;;4783:14;4763:34;4743:54;;4808:17;4843:1;4828:11;:16;;;:50;;;;;4877:1;4856:4;4848:25;;;:30;4828:50;4808:70;;4896:12;4895:13;:30;;;;;4913:12;4912:13;4895:30;4891:93;;;4949:23;;;;;;;;;;;;;;4891:93;5011:1;4994;:14;;;:18;;;;;;;;;;;;;;;;;;5027:14;5023:69;;;5076:4;5058:1;:15;;;:22;;;;;;;;;;;;;;;;;;5023:69;67100:1:::1;67077:25;;:11;:25;;::::0;67069:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;67161:1;67143:20;;:6;:20;;::::0;67135:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;67243:7;67239:1;64425:7;67220:20;;;;:::i;:::-;:30;;;;:::i;:::-;67205:12;:45;67197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67291:26;67306:10;67291:14;:26::i;:::-;67329:24;:22;:24::i;:::-;67387:11;67374:10;;:24;;;;;;;;;;;;;;;;;;67423:12;67409:11;:26;;;;67461:6;67447:11;;:20;;;;;;;;;;;;;;;;;;67491:6;67478:4;;:20;;;;;;;;;;;;;;;;;;67522:11;67509:4;;:25;;;;;;;;;;;;;;;;;;5118:14:::0;5114:104;;;5167:5;5149:1;:15;;;:23;;;;;;;;;;;;;;;;;;5192:14;5204:1;5192:14;;;;;;:::i;:::-;;;;;;;;5114:104;4116:1109;;;;;66926:626;;;:::o;77481:254::-;77555:11;;;;;;;;;;;77541:25;;:10;:25;;;77537:53;;77575:15;;;;;;;;;;;;;;77537:53;77601:20;77624:9;:15;77634:4;77624:15;;;;;;;;;;;;;;;;77601:38;;77670:1;77654:12;:17;77650:47;;77680:17;;;;;;;;;;;;;;77650:47;77726:1;77708:9;:15;77718:4;77708:15;;;;;;;;;;;;;;;:19;;;;77526:209;77481:254;:::o;73851:152::-;73904:7;73980:15;73990:4;73980:9;:15::i;:::-;73949:11;;;;;;;;;;;73931:40;;;73972:4;73931:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;73924:71;;73851:152;;;:::o;70708:1446::-;70749:13;:20;70763:5;;70749:20;;;;;;;;;;;;;;;;;;;;;70744:49;;70778:15;;;;;;;;;;;;;;70744:49;70808:16;:23;70825:5;;70808:23;;;;;;;;;;;;;;;;;;;;;70804:59;;;70840:23;;;;;;;;;;;;;;70804:59;64425:7;70896:11;;:30;;;;:::i;:::-;70878:15;:48;70874:83;;;70935:22;;;;;;;;;;;;;;70874:83;64481:7;70990:11;;:29;;;;:::i;:::-;70972:15;:47;70968:81;;;71028:21;;;;;;;;;;;;;;70968:81;71079:1;71064:11;;:16;71060:47;;71089:18;;;;;;;;;;;;;;71060:47;71128:14;71145:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71128:34;;71187:1;71177:6;:11;71173:36;;71197:12;;;;;;;;;;;;;;71173:36;71230:18;71251:13;:20;71265:5;;71251:20;;;;;;;;;;;;71230:41;;71300:1;71286:10;:15;71282:39;;71310:11;;;;;;;;;;;;;;71282:39;71391:9;71386:433;71406:6;71402:1;:10;71386:433;;;71434:21;71458:11;:18;71470:5;;71458:18;;;;;;;;;;;:21;71477:1;71458:21;;;;;;;;;;;;71434:45;;71494:18;71547:1;71531:13;:17;71527:243;;;71619:10;64313:4;71583:13;:32;;;;:::i;:::-;71582:47;;;;:::i;:::-;71569:60;;64313:4;71652:10;:29;71648:107;;;64313:4;71706:29;;71648:107;71527:243;71784:4;;;;;;;;;;;:8;;;71793:1;71796:10;71784:23;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71419:400;;71414:3;;;;;71386:433;;;;71865:4;71839:16;:23;71856:5;;71839:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;71900:5;;71885:38;71907:15;71885:38;;;;;;:::i;:::-;;;;;;;;71944:16;71971:1;71963:5;;:9;;;;:::i;:::-;71944:28;;71991:8;71983:5;:16;;;;72024:1;72010:11;:15;;;;72048;72036:9;:27;;;;72088:1;72074:11;:15;;;;72120:8;72107:39;72130:15;72107:39;;;;;;:::i;:::-;;;;;;;;70733:1421;;;70708:1446::o;69323:924::-;69408:18;:26;69427:6;69408:26;;;;;;;;;;;;;;;;;;;;;;;;;69407:27;:52;;;;69438:21;69451:6;69438:5;:21::i;:::-;69407:52;69403:86;;;69468:21;;;;;;;;;;;;;;69403:86;69511:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69504:3;:24;69500:49;;69537:12;;;;;;;;;;;;;;69500:49;64371:4;69564:6;:29;69560:57;;;69602:15;;;;;;;;;;;;;;69560:57;69632:13;:20;69646:5;;69632:20;;;;;;;;;;;;;;;;;;;;;69628:46;;;69661:13;;;;;;;;;;;;;;69628:46;69686:12;69700:14;69718:28;69727:6;69735:3;69740:5;;69718:8;:28::i;:::-;69685:61;;;;69762:7;69761:8;:66;;;;;64260:2;69773:12;:19;69786:5;;69773:19;;;;;;;;;;;:24;69793:3;69773:24;;;;;;;;;;;:31;;;;:54;;69761:66;69757:121;;;69851:15;;;;;;;;;;;;;;69757:121;69898:77;69941:10;69961:4;69968:6;69916;69898:42;;;;:77;;;;;;:::i;:::-;70000:7;69996:188;;;70067:6;70024:12;:19;70037:5;;70024:19;;;;;;;;;;;:24;70044:3;70024:24;;;;;;;;;;;70049:6;70024:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;:49;;;;;;;:::i;:::-;;;;;;;;69996:188;;;70106:12;:19;70119:5;;70106:19;;;;;;;;;;;:24;70126:3;70106:24;;;;;;;;;;;70136:35;;;;;;;;70146:6;70136:35;;;;;;70154:5;;70136:35;;;;70161:6;70136:35;;;;70169:1;70136:35;;;70106:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69996:188;70225:5;;70220:3;70212:6;70201:38;;;70232:6;70201:38;;;;;;:::i;:::-;;;;;;;;69392:855;;69323:924;;;:::o;64794:26::-;;;;:::o;13409:220::-;12302:13;:11;:13::i;:::-;13514:1:::1;13494:22;;:8;:22;;::::0;13490:93:::1;;13568:1;13540:31;;;;;;;;;;;:::i;:::-;;;;;;;;13490:93;13593:28;13612:8;13593:18;:28::i;:::-;13409:220:::0;:::o;76558:375::-;76650:10;76662:14;76689;76706:9;:15;76716:4;76706:15;;;;;;;;;;;;;;;:22;76722:5;76706:22;;;;;;;;;;;:29;;;;76689:46;;76751:9;76746:152;76766:6;76762:1;:10;76746:152;;;76805:9;:15;76815:4;76805:15;;;;;;;;;;;;;;;:22;76821:5;76805:22;;;;;;;;;;;76828:1;76805:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;76798:3;:36;76794:93;;76863:4;76869:1;76855:16;;;;;;;;76794:93;76774:3;;;;;76746:152;;;;76916:5;76923:1;76908:17;;;;;76558:375;;;;;;;:::o;39567:293::-;38792:1;39701:7;;:19;39693:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38792:1;39834:7;:18;;;;39567:293::o;75366:1184::-;75431:14;75448:9;:21;75458:10;75448:21;;;;;;;;;;;;;;;:28;75470:5;75448:28;;;;;;;;;;;:35;;;;75431:52;;75499:9;75494:999;75514:6;75510:1;:10;75494:999;;;75546:9;:21;75556:10;75546:21;;;;;;;;;;;;;;;:28;75568:5;75546:28;;;;;;;;;;;75575:1;75546:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;;;;;;;;;;75542:74;;;75594:22;;;;;;;;;;;;;;75542:74;75645:12;75660:9;:21;75670:10;75660:21;;;;;;;;;;;;;;;:28;75682:5;75660:28;;;;;;;;;;;75689:1;75660:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;75645:50;;75710:25;75738:39;75753:10;75765:4;75771:5;75738:14;:39::i;:::-;75710:67;;75902:4;75860:9;:21;75870:10;75860:21;;;;;;;;;;;;;;;:28;75882:5;75860:28;;;;;;;;;;;75889:1;75860:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;:46;;;;;;;;;;;;;;;;;;75935:19;75957:6;:13;75935:35;;75990:9;75985:497;76005:11;76001:1;:15;75985:497;;;76065:1;76046:6;76053:1;76046:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;:20;76042:425;;;76188:6;76195:1;76188:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;76148:12;:19;76161:5;76148:19;;;;;;;;;;;:25;76168:4;76148:25;;;;;;;;;;;76174:1;76148:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:56;;;;;;;:::i;:::-;;;;;;;;76268:78;76317:10;76329:6;76336:1;76329:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;76286:6;76293:1;76286:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;76268:48;;;;:78;;;;;:::i;:::-;76406:4;76399:5;76387:10;76374:73;;;76412:6;76419:1;76412:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;76430:6;76437:1;76430:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;76374:73;;;;;;;:::i;:::-;;;;;;;;76042:425;76018:3;;;;;75985:497;;;;75527:966;;;75522:3;;;;;75494:999;;;;76537:5;76513:9;:21;76523:10;76513:21;;;;;;;;;;;;;;;:29;;;;75420:1130;75366:1184;:::o;39868:213::-;38748:1;40051:7;:22;;;;39868:213::o;12641:166::-;12712:12;:10;:12::i;:::-;12701:23;;:7;:5;:7::i;:::-;:23;;;12697:103;;12775:12;:10;:12::i;:::-;12748:40;;;;;;;;;;;:::i;:::-;;;;;;;;12697:103;12641:166::o;13789:253::-;13863:24;13890:20;:18;:20::i;:::-;13863:47;;13921:16;13940:1;:8;;;;;;;;;;;;13921:27;;13970:8;13959:1;:8;;;:19;;;;;;;;;;;;;;;;;;14025:8;13994:40;;14015:8;13994:40;;;;;;;;;;;;13852:190;;13789:253;:::o;11124:163::-;11176:24;11247:22;11237:32;;11124:163;:::o;77747:191::-;77804:20;77827:9;:15;77837:4;77827:15;;;;;;;;;;;;;;;;77804:38;;77873:1;77857:12;:17;77853:47;;77883:17;;;;;;;;;;;;;;77853:47;77929:1;77911:9;:15;77921:4;77911:15;;;;;;;;;;;;;;;:19;;;;77793:145;77747:191;:::o;76941:144::-;77031:6;77012:9;:15;77022:4;77012:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;77048:4;;;;;;;;;;;:15;;;77064:6;77072:4;77048:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76941:144;;:::o;8880:174::-;8938:30;9015:21;9005:31;;8880:174;:::o;11800:129::-;7022:20;:18;:20::i;:::-;11883:38:::1;11908:12;11883:24;:38::i;:::-;11800:129:::0;:::o;38834:113::-;7022:20;:18;:20::i;:::-;38905:34:::1;:32;:34::i;:::-;38834:113::o:0;78253:363::-;78306:4;78323:14;78340:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78323:34;;78368:22;78393:4;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78368:44;;78430:9;78425:161;78445:6;78441:1;:10;78425:161;;;78486:6;78493:1;78486:9;;;;;;;;:::i;:::-;;;;;;;;78476:19;;:6;:19;;;78472:71;;78523:4;78516:11;;;;;;;78472:71;78569:3;;;;;78425:161;;;;78603:5;78596:12;;;;78253:363;;;;:::o;77093:380::-;77178:12;77192:14;77219;77236:12;:19;77249:5;77236:19;;;;;;;;;;;:24;77256:3;77236:24;;;;;;;;;;;:31;;;;77219:48;;77283:9;77278:160;77298:6;77294:1;:10;77278:160;;;77368:6;77330:44;;:12;:19;77343:5;77330:19;;;;;;;;;;;:24;77350:3;77330:24;;;;;;;;;;;77355:1;77330:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;;;;;;;;;;:44;;;77326:101;;77403:4;77409:1;77395:16;;;;;;;;77326:101;77306:3;;;;;77278:160;;;;77456:5;77463:1;77448:17;;;;;77093:380;;;;;;;:::o;31288:216::-;31400:96;31420:5;31450:27;;;31479:4;31485:2;31489:5;31427:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31400:19;:96::i;:::-;31288:216;;;;:::o;30855:188::-;30949:86;30969:5;30999:23;;;31024:2;31028:5;30976:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30949:19;:86::i;:::-;30855:188;;;:::o;9809:98::-;9862:7;9889:10;9882:17;;9809:98;:::o;7182:145::-;7250:17;:15;:17::i;:::-;7245:75;;7291:17;;;;;;;;;;;;;;7245:75;7182:145::o;11937:240::-;7022:20;:18;:20::i;:::-;12058:1:::1;12034:26;;:12;:26;;::::0;12030:97:::1;;12112:1;12084:31;;;;;;;;;;;:::i;:::-;;;;;;;;12030:97;12137:32;12156:12;12137:18;:32::i;:::-;11937:240:::0;:::o;38955:111::-;7022:20;:18;:20::i;:::-;38748:1:::1;39036:7;:22;;;;38955:111::o:0;35278:660::-;35713:23;35739:69;35767:4;35739:69;;;;;;;;;;;;;;;;;35747:5;35739:27;;;;:69;;;;;:::i;:::-;35713:95;;35848:1;35827:10;:17;:22;:56;;;;35864:10;35853:30;;;;;;;;;;;;:::i;:::-;35827:56;35819:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35359:579;35278:660;;:::o;8622:122::-;8672:4;8696:26;:24;:26::i;:::-;:40;;;;;;;;;;;;8689:47;;8622:122;:::o;24672:229::-;24809:12;24841:52;24863:6;24871:4;24877:1;24880:12;24841:21;:52::i;:::-;24834:59;;24672:229;;;;;:::o;25758:455::-;25928:12;25986:5;25961:21;:30;;25953:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26046:12;26060:23;26087:6;:11;;26106:5;26113:4;26087:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26045:73;;;;26136:69;26163:6;26171:7;26180:10;26192:12;26136:26;:69::i;:::-;26129:76;;;;25758:455;;;;;;:::o;28331:644::-;28516:12;28545:7;28541:427;;;28594:1;28573:10;:17;:22;28569:290;;28791:18;28802:6;28791:10;:18::i;:::-;28783:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28569:290;28880:10;28873:17;;;;28541:427;28923:33;28931:10;28943:12;28923:7;:33::i;:::-;28331:644;;;;;;;:::o;21917:326::-;21977:4;22234:1;22212:7;:19;;;:23;22205:30;;21917:326;;;:::o;29517:552::-;29698:1;29678:10;:17;:21;29674:388;;;29910:10;29904:17;29967:15;29954:10;29950:2;29946:19;29939:44;29674:388;30037:12;30030:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;742:593;840:8;850:6;900:3;893:4;885:6;881:17;877:27;867:122;;908:79;;:::i;:::-;867:122;1021:6;1008:20;998:30;;1051:18;1043:6;1040:30;1037:117;;;1073:79;;:::i;:::-;1037:117;1187:4;1179:6;1175:17;1163:29;;1241:3;1233:4;1225:6;1221:17;1211:8;1207:32;1204:41;1201:128;;;1248:79;;:::i;:::-;1201:128;742:593;;;;;:::o;1341:609::-;1452:6;1460;1509:2;1497:9;1488:7;1484:23;1480:32;1477:119;;;1515:79;;:::i;:::-;1477:119;1663:1;1652:9;1648:17;1635:31;1693:18;1685:6;1682:30;1679:117;;;1715:79;;:::i;:::-;1679:117;1828:105;1925:7;1916:6;1905:9;1901:22;1828:105;:::i;:::-;1810:123;;;;1606:337;1341:609;;;;;:::o;1956:126::-;1993:7;2033:42;2026:5;2022:54;2011:65;;1956:126;;;:::o;2088:96::-;2125:7;2154:24;2172:5;2154:24;:::i;:::-;2143:35;;2088:96;;;:::o;2190:122::-;2263:24;2281:5;2263:24;:::i;:::-;2256:5;2253:35;2243:63;;2302:1;2299;2292:12;2243:63;2190:122;:::o;2318:139::-;2364:5;2402:6;2389:20;2380:29;;2418:33;2445:5;2418:33;:::i;:::-;2318:139;;;;:::o;2463:329::-;2522:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:119;;;2577:79;;:::i;:::-;2539:119;2697:1;2722:53;2767:7;2758:6;2747:9;2743:22;2722:53;:::i;:::-;2712:63;;2668:117;2463:329;;;;:::o;2798:77::-;2835:7;2864:5;2853:16;;2798:77;;;:::o;2881:118::-;2968:24;2986:5;2968:24;:::i;:::-;2963:3;2956:37;2881:118;;:::o;3005:222::-;3098:4;3136:2;3125:9;3121:18;3113:26;;3149:71;3217:1;3206:9;3202:17;3193:6;3149:71;:::i;:::-;3005:222;;;;:::o;3233:122::-;3306:24;3324:5;3306:24;:::i;:::-;3299:5;3296:35;3286:63;;3345:1;3342;3335:12;3286:63;3233:122;:::o;3361:139::-;3407:5;3445:6;3432:20;3423:29;;3461:33;3488:5;3461:33;:::i;:::-;3361:139;;;;:::o;3506:619::-;3583:6;3591;3599;3648:2;3636:9;3627:7;3623:23;3619:32;3616:119;;;3654:79;;:::i;:::-;3616:119;3774:1;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3745:117;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;4029:2;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;:::i;:::-;4045:63;;4000:118;3506:619;;;;;:::o;4131:141::-;4225:6;4259:5;4253:12;4243:22;;4131:141;;;:::o;4278:211::-;4404:11;4438:6;4433:3;4426:19;4478:4;4473:3;4469:14;4454:29;;4278:211;;;;:::o;4495:159::-;4589:4;4612:3;4604:11;;4642:4;4637:3;4633:14;4625:22;;4495:159;;;:::o;4660:108::-;4737:24;4755:5;4737:24;:::i;:::-;4732:3;4725:37;4660:108;;:::o;4774:::-;4851:24;4869:5;4851:24;:::i;:::-;4846:3;4839:37;4774:108;;:::o;4966:857::-;5107:4;5102:3;5098:14;5196:4;5189:5;5185:16;5179:23;5215:63;5272:4;5267:3;5263:14;5249:12;5215:63;:::i;:::-;5122:166;5371:4;5364:5;5360:16;5354:23;5390:63;5447:4;5442:3;5438:14;5424:12;5390:63;:::i;:::-;5298:165;5547:4;5540:5;5536:16;5530:23;5566:63;5623:4;5618:3;5614:14;5600:12;5566:63;:::i;:::-;5473:166;5724:4;5717:5;5713:16;5707:23;5743:63;5800:4;5795:3;5791:14;5777:12;5743:63;:::i;:::-;5649:167;5076:747;4966:857;;:::o;5829:287::-;5952:10;5973:100;6069:3;6061:6;5973:100;:::i;:::-;6105:4;6100:3;6096:14;6082:28;;5829:287;;;;:::o;6122:140::-;6219:4;6251;6246:3;6242:14;6234:22;;6122:140;;;:::o;6350:948::-;6523:3;6552:81;6627:5;6552:81;:::i;:::-;6649:113;6755:6;6750:3;6649:113;:::i;:::-;6642:120;;6786:83;6863:5;6786:83;:::i;:::-;6892:7;6923:1;6908:365;6933:6;6930:1;6927:13;6908:365;;;7009:6;7003:13;7036:117;7149:3;7134:13;7036:117;:::i;:::-;7029:124;;7176:87;7256:6;7176:87;:::i;:::-;7166:97;;6968:305;6955:1;6952;6948:9;6943:14;;6908:365;;;6912:14;7289:3;7282:10;;6528:770;;;6350:948;;;;:::o;7304:481::-;7501:4;7539:2;7528:9;7524:18;7516:26;;7588:9;7582:4;7578:20;7574:1;7563:9;7559:17;7552:47;7616:162;7773:4;7764:6;7616:162;:::i;:::-;7608:170;;7304:481;;;;:::o;7791:60::-;7819:3;7840:5;7833:12;;7791:60;;;:::o;7857:142::-;7907:9;7940:53;7958:34;7967:24;7985:5;7967:24;:::i;:::-;7958:34;:::i;:::-;7940:53;:::i;:::-;7927:66;;7857:142;;;:::o;8005:126::-;8055:9;8088:37;8119:5;8088:37;:::i;:::-;8075:50;;8005:126;;;:::o;8137:140::-;8201:9;8234:37;8265:5;8234:37;:::i;:::-;8221:50;;8137:140;;;:::o;8283:159::-;8384:51;8429:5;8384:51;:::i;:::-;8379:3;8372:64;8283:159;;:::o;8448:250::-;8555:4;8593:2;8582:9;8578:18;8570:26;;8606:85;8688:1;8677:9;8673:17;8664:6;8606:85;:::i;:::-;8448:250;;;;:::o;8704:329::-;8763:6;8812:2;8800:9;8791:7;8787:23;8783:32;8780:119;;;8818:79;;:::i;:::-;8780:119;8938:1;8963:53;9008:7;8999:6;8988:9;8984:22;8963:53;:::i;:::-;8953:63;;8909:117;8704:329;;;;:::o;9039:90::-;9073:7;9116:5;9109:13;9102:21;9091:32;;9039:90;;;:::o;9135:109::-;9216:21;9231:5;9216:21;:::i;:::-;9211:3;9204:34;9135:109;;:::o;9250:210::-;9337:4;9375:2;9364:9;9360:18;9352:26;;9388:65;9450:1;9439:9;9435:17;9426:6;9388:65;:::i;:::-;9250:210;;;;:::o;9466:474::-;9534:6;9542;9591:2;9579:9;9570:7;9566:23;9562:32;9559:119;;;9597:79;;:::i;:::-;9559:119;9717:1;9742:53;9787:7;9778:6;9767:9;9763:22;9742:53;:::i;:::-;9732:63;;9688:117;9844:2;9870:53;9915:7;9906:6;9895:9;9891:22;9870:53;:::i;:::-;9860:63;;9815:118;9466:474;;;;;:::o;9946:140::-;10010:9;10043:37;10074:5;10043:37;:::i;:::-;10030:50;;9946:140;;;:::o;10092:159::-;10193:51;10238:5;10193:51;:::i;:::-;10188:3;10181:64;10092:159;;:::o;10257:250::-;10364:4;10402:2;10391:9;10387:18;10379:26;;10415:85;10497:1;10486:9;10482:17;10473:6;10415:85;:::i;:::-;10257:250;;;;:::o;10513:118::-;10600:24;10618:5;10600:24;:::i;:::-;10595:3;10588:37;10513:118;;:::o;10637:222::-;10730:4;10768:2;10757:9;10753:18;10745:26;;10781:71;10849:1;10838:9;10834:17;10825:6;10781:71;:::i;:::-;10637:222;;;;:::o;10865:116::-;10935:21;10950:5;10935:21;:::i;:::-;10928:5;10925:32;10915:60;;10971:1;10968;10961:12;10915:60;10865:116;:::o;10987:133::-;11030:5;11068:6;11055:20;11046:29;;11084:30;11108:5;11084:30;:::i;:::-;10987:133;;;;:::o;11126:468::-;11191:6;11199;11248:2;11236:9;11227:7;11223:23;11219:32;11216:119;;;11254:79;;:::i;:::-;11216:119;11374:1;11399:53;11444:7;11435:6;11424:9;11420:22;11399:53;:::i;:::-;11389:63;;11345:117;11501:2;11527:50;11569:7;11560:6;11549:9;11545:22;11527:50;:::i;:::-;11517:60;;11472:115;11126:468;;;;;:::o;11600:619::-;11677:6;11685;11693;11742:2;11730:9;11721:7;11717:23;11713:32;11710:119;;;11748:79;;:::i;:::-;11710:119;11868:1;11893:53;11938:7;11929:6;11918:9;11914:22;11893:53;:::i;:::-;11883:63;;11839:117;11995:2;12021:53;12066:7;12057:6;12046:9;12042:22;12021:53;:::i;:::-;12011:63;;11966:118;12123:2;12149:53;12194:7;12185:6;12174:9;12170:22;12149:53;:::i;:::-;12139:63;;12094:118;11600:619;;;;;:::o;12225:553::-;12402:4;12440:3;12429:9;12425:19;12417:27;;12454:71;12522:1;12511:9;12507:17;12498:6;12454:71;:::i;:::-;12535:72;12603:2;12592:9;12588:18;12579:6;12535:72;:::i;:::-;12617;12685:2;12674:9;12670:18;12661:6;12617:72;:::i;:::-;12699;12767:2;12756:9;12752:18;12743:6;12699:72;:::i;:::-;12225:553;;;;;;;:::o;12784:430::-;12927:4;12965:2;12954:9;12950:18;12942:26;;12978:71;13046:1;13035:9;13031:17;13022:6;12978:71;:::i;:::-;13059:72;13127:2;13116:9;13112:18;13103:6;13059:72;:::i;:::-;13141:66;13203:2;13192:9;13188:18;13179:6;13141:66;:::i;:::-;12784:430;;;;;;:::o;13220:619::-;13297:6;13305;13313;13362:2;13350:9;13341:7;13337:23;13333:32;13330:119;;;13368:79;;:::i;:::-;13330:119;13488:1;13513:53;13558:7;13549:6;13538:9;13534:22;13513:53;:::i;:::-;13503:63;;13459:117;13615:2;13641:53;13686:7;13677:6;13666:9;13662:22;13641:53;:::i;:::-;13631:63;;13586:118;13743:2;13769:53;13814:7;13805:6;13794:9;13790:22;13769:53;:::i;:::-;13759:63;;13714:118;13220:619;;;;;:::o;13845:::-;13922:6;13930;13938;13987:2;13975:9;13966:7;13962:23;13958:32;13955:119;;;13993:79;;:::i;:::-;13955:119;14113:1;14138:53;14183:7;14174:6;14163:9;14159:22;14138:53;:::i;:::-;14128:63;;14084:117;14240:2;14266:53;14311:7;14302:6;14291:9;14287:22;14266:53;:::i;:::-;14256:63;;14211:118;14368:2;14394:53;14439:7;14430:6;14419:9;14415:22;14394:53;:::i;:::-;14384:63;;14339:118;13845:619;;;;;:::o;14470:143::-;14527:5;14558:6;14552:13;14543:22;;14574:33;14601:5;14574:33;:::i;:::-;14470:143;;;;:::o;14619:351::-;14689:6;14738:2;14726:9;14717:7;14713:23;14709:32;14706:119;;;14744:79;;:::i;:::-;14706:119;14864:1;14889:64;14945:7;14936:6;14925:9;14921:22;14889:64;:::i;:::-;14879:74;;14835:128;14619:351;;;;:::o;14976:180::-;15024:77;15021:1;15014:88;15121:4;15118:1;15111:15;15145:4;15142:1;15135:15;15162:180;15210:77;15207:1;15200:88;15307:4;15304:1;15297:15;15331:4;15328:1;15321:15;15348:180;15396:77;15393:1;15386:88;15493:4;15490:1;15483:15;15517:4;15514:1;15507:15;15534:194;15574:4;15594:20;15612:1;15594:20;:::i;:::-;15589:25;;15628:20;15646:1;15628:20;:::i;:::-;15623:25;;15672:1;15669;15665:9;15657:17;;15696:1;15690:4;15687:11;15684:37;;;15701:18;;:::i;:::-;15684:37;15534:194;;;;:::o;15734:410::-;15774:7;15797:20;15815:1;15797:20;:::i;:::-;15792:25;;15831:20;15849:1;15831:20;:::i;:::-;15826:25;;15886:1;15883;15879:9;15908:30;15926:11;15908:30;:::i;:::-;15897:41;;16087:1;16078:7;16074:15;16071:1;16068:22;16048:1;16041:9;16021:83;15998:139;;16117:18;;:::i;:::-;15998:139;15782:362;15734:410;;;;:::o;16150:180::-;16198:77;16195:1;16188:88;16295:4;16292:1;16285:15;16319:4;16316:1;16309:15;16336:185;16376:1;16393:20;16411:1;16393:20;:::i;:::-;16388:25;;16427:20;16445:1;16427:20;:::i;:::-;16422:25;;16466:1;16456:35;;16471:18;;:::i;:::-;16456:35;16513:1;16510;16506:9;16501:14;;16336:185;;;;:::o;16527:191::-;16567:3;16586:20;16604:1;16586:20;:::i;:::-;16581:25;;16620:20;16638:1;16620:20;:::i;:::-;16615:25;;16663:1;16660;16656:9;16649:16;;16684:3;16681:1;16678:10;16675:36;;;16691:18;;:::i;:::-;16675:36;16527:191;;;;:::o;16724:169::-;16808:11;16842:6;16837:3;16830:19;16882:4;16877:3;16873:14;16858:29;;16724:169;;;;:::o;16899:175::-;17039:27;17035:1;17027:6;17023:14;17016:51;16899:175;:::o;17080:366::-;17222:3;17243:67;17307:2;17302:3;17243:67;:::i;:::-;17236:74;;17319:93;17408:3;17319:93;:::i;:::-;17437:2;17432:3;17428:12;17421:19;;17080:366;;;:::o;17452:419::-;17618:4;17656:2;17645:9;17641:18;17633:26;;17705:9;17699:4;17695:20;17691:1;17680:9;17676:17;17669:47;17733:131;17859:4;17733:131;:::i;:::-;17725:139;;17452:419;;;:::o;17877:137::-;17931:5;17962:6;17956:13;17947:22;;17978:30;18002:5;17978:30;:::i;:::-;17877:137;;;;:::o;18020:345::-;18087:6;18136:2;18124:9;18115:7;18111:23;18107:32;18104:119;;;18142:79;;:::i;:::-;18104:119;18262:1;18287:61;18340:7;18331:6;18320:9;18316:22;18287:61;:::i;:::-;18277:71;;18233:125;18020:345;;;;:::o;18371:167::-;18511:19;18507:1;18499:6;18495:14;18488:43;18371:167;:::o;18544:366::-;18686:3;18707:67;18771:2;18766:3;18707:67;:::i;:::-;18700:74;;18783:93;18872:3;18783:93;:::i;:::-;18901:2;18896:3;18892:12;18885:19;;18544:366;;;:::o;18916:419::-;19082:4;19120:2;19109:9;19105:18;19097:26;;19169:9;19163:4;19159:20;19155:1;19144:9;19140:17;19133:47;19197:131;19323:4;19197:131;:::i;:::-;19189:139;;18916:419;;;:::o;19341:168::-;19481:20;19477:1;19469:6;19465:14;19458:44;19341:168;:::o;19515:366::-;19657:3;19678:67;19742:2;19737:3;19678:67;:::i;:::-;19671:74;;19754:93;19843:3;19754:93;:::i;:::-;19872:2;19867:3;19863:12;19856:19;;19515:366;;;:::o;19887:419::-;20053:4;20091:2;20080:9;20076:18;20068:26;;20140:9;20134:4;20130:20;20126:1;20115:9;20111:17;20104:47;20168:131;20294:4;20168:131;:::i;:::-;20160:139;;19887:419;;;:::o;20312:165::-;20452:17;20448:1;20440:6;20436:14;20429:41;20312:165;:::o;20483:366::-;20625:3;20646:67;20710:2;20705:3;20646:67;:::i;:::-;20639:74;;20722:93;20811:3;20722:93;:::i;:::-;20840:2;20835:3;20831:12;20824:19;;20483:366;;;:::o;20855:419::-;21021:4;21059:2;21048:9;21044:18;21036:26;;21108:9;21102:4;21098:20;21094:1;21083:9;21079:17;21072:47;21136:131;21262:4;21136:131;:::i;:::-;21128:139;;20855:419;;;:::o;21280:85::-;21325:7;21354:5;21343:16;;21280:85;;;:::o;21371:101::-;21407:7;21447:18;21440:5;21436:30;21425:41;;21371:101;;;:::o;21478:156::-;21535:9;21568:60;21585:42;21594:32;21620:5;21594:32;:::i;:::-;21585:42;:::i;:::-;21568:60;:::i;:::-;21555:73;;21478:156;;;:::o;21640:145::-;21734:44;21772:5;21734:44;:::i;:::-;21729:3;21722:57;21640:145;;:::o;21791:236::-;21891:4;21929:2;21918:9;21914:18;21906:26;;21942:78;22017:1;22006:9;22002:17;21993:6;21942:78;:::i;:::-;21791:236;;;;:::o;22033:332::-;22154:4;22192:2;22181:9;22177:18;22169:26;;22205:71;22273:1;22262:9;22258:17;22249:6;22205:71;:::i;:::-;22286:72;22354:2;22343:9;22339:18;22330:6;22286:72;:::i;:::-;22033:332;;;;;:::o;22371:181::-;22511:33;22507:1;22499:6;22495:14;22488:57;22371:181;:::o;22558:366::-;22700:3;22721:67;22785:2;22780:3;22721:67;:::i;:::-;22714:74;;22797:93;22886:3;22797:93;:::i;:::-;22915:2;22910:3;22906:12;22899:19;;22558:366;;;:::o;22930:419::-;23096:4;23134:2;23123:9;23119:18;23111:26;;23183:9;23177:4;23173:20;23169:1;23158:9;23154:17;23147:47;23211:131;23337:4;23211:131;:::i;:::-;23203:139;;22930:419;;;:::o;23355:332::-;23476:4;23514:2;23503:9;23499:18;23491:26;;23527:71;23595:1;23584:9;23580:17;23571:6;23527:71;:::i;:::-;23608:72;23676:2;23665:9;23661:18;23652:6;23608:72;:::i;:::-;23355:332;;;;;:::o;23693:::-;23814:4;23852:2;23841:9;23837:18;23829:26;;23865:71;23933:1;23922:9;23918:17;23909:6;23865:71;:::i;:::-;23946:72;24014:2;24003:9;23999:18;23990:6;23946:72;:::i;:::-;23693:332;;;;;:::o;24031:102::-;24072:6;24123:2;24119:7;24114:2;24107:5;24103:14;24099:28;24089:38;;24031:102;;;:::o;24139:281::-;24222:27;24244:4;24222:27;:::i;:::-;24214:6;24210:40;24352:6;24340:10;24337:22;24316:18;24304:10;24301:34;24298:62;24295:88;;;24363:18;;:::i;:::-;24295:88;24403:10;24399:2;24392:22;24182:238;24139:281;;:::o;24426:129::-;24460:6;24487:20;;:::i;:::-;24477:30;;24516:33;24544:4;24536:6;24516:33;:::i;:::-;24426:129;;;:::o;24561:326::-;24653:4;24743:18;24735:6;24732:30;24729:56;;;24765:18;;:::i;:::-;24729:56;24815:4;24807:6;24803:17;24795:25;;24875:4;24869;24865:15;24857:23;;24561:326;;;:::o;24893:111::-;24945:7;24974:24;24992:5;24974:24;:::i;:::-;24963:35;;24893:111;;;:::o;25010:152::-;25098:39;25131:5;25098:39;:::i;:::-;25091:5;25088:50;25078:78;;25152:1;25149;25142:12;25078:78;25010:152;:::o;25168:173::-;25240:5;25271:6;25265:13;25256:22;;25287:48;25329:5;25287:48;:::i;:::-;25168:173;;;;:::o;25372:777::-;25494:5;25519:96;25535:79;25607:6;25535:79;:::i;:::-;25519:96;:::i;:::-;25510:105;;25635:5;25664:6;25657:5;25650:21;25698:4;25691:5;25687:16;25680:23;;25751:4;25743:6;25739:17;25731:6;25727:30;25780:3;25772:6;25769:15;25766:122;;;25799:79;;:::i;:::-;25766:122;25914:6;25897:246;25931:6;25926:3;25923:15;25897:246;;;26006:3;26035:63;26094:3;26082:10;26035:63;:::i;:::-;26030:3;26023:76;26128:4;26123:3;26119:14;26112:21;;25973:170;25957:4;25952:3;25948:14;25941:21;;25897:246;;;25901:21;25500:649;;25372:777;;;;;:::o;26180:415::-;26277:5;26326:3;26319:4;26311:6;26307:17;26303:27;26293:122;;26334:79;;:::i;:::-;26293:122;26444:6;26438:13;26469:120;26585:3;26577:6;26570:4;26562:6;26558:17;26469:120;:::i;:::-;26460:129;;26283:312;26180:415;;;;:::o;26601:584::-;26711:6;26760:2;26748:9;26739:7;26735:23;26731:32;26728:119;;;26766:79;;:::i;:::-;26728:119;26907:1;26896:9;26892:17;26886:24;26937:18;26929:6;26926:30;26923:117;;;26959:79;;:::i;:::-;26923:117;27064:104;27160:7;27151:6;27140:9;27136:22;27064:104;:::i;:::-;27054:114;;26857:321;26601:584;;;;:::o;27191:442::-;27340:4;27378:2;27367:9;27363:18;27355:26;;27391:71;27459:1;27448:9;27444:17;27435:6;27391:71;:::i;:::-;27472:72;27540:2;27529:9;27525:18;27516:6;27472:72;:::i;:::-;27554;27622:2;27611:9;27607:18;27598:6;27554:72;:::i;:::-;27191:442;;;;;;:::o;27639:229::-;27779:34;27775:1;27767:6;27763:14;27756:58;27848:12;27843:2;27835:6;27831:15;27824:37;27639:229;:::o;27874:366::-;28016:3;28037:67;28101:2;28096:3;28037:67;:::i;:::-;28030:74;;28113:93;28202:3;28113:93;:::i;:::-;28231:2;28226:3;28222:12;28215:19;;27874:366;;;:::o;28246:419::-;28412:4;28450:2;28439:9;28435:18;28427:26;;28499:9;28493:4;28489:20;28485:1;28474:9;28470:17;28463:47;28527:131;28653:4;28527:131;:::i;:::-;28519:139;;28246:419;;;:::o;28671:225::-;28811:34;28807:1;28799:6;28795:14;28788:58;28880:8;28875:2;28867:6;28863:15;28856:33;28671:225;:::o;28902:366::-;29044:3;29065:67;29129:2;29124:3;29065:67;:::i;:::-;29058:74;;29141:93;29230:3;29141:93;:::i;:::-;29259:2;29254:3;29250:12;29243:19;;28902:366;;;:::o;29274:419::-;29440:4;29478:2;29467:9;29463:18;29455:26;;29527:9;29521:4;29517:20;29513:1;29502:9;29498:17;29491:47;29555:131;29681:4;29555:131;:::i;:::-;29547:139;;29274:419;;;:::o;29699:98::-;29750:6;29784:5;29778:12;29768:22;;29699:98;;;:::o;29803:147::-;29904:11;29941:3;29926:18;;29803:147;;;;:::o;29956:139::-;30045:6;30040:3;30035;30029:23;30086:1;30077:6;30072:3;30068:16;30061:27;29956:139;;;:::o;30101:386::-;30205:3;30233:38;30265:5;30233:38;:::i;:::-;30287:88;30368:6;30363:3;30287:88;:::i;:::-;30280:95;;30384:65;30442:6;30437:3;30430:4;30423:5;30419:16;30384:65;:::i;:::-;30474:6;30469:3;30465:16;30458:23;;30209:278;30101:386;;;;:::o;30493:271::-;30623:3;30645:93;30734:3;30725:6;30645:93;:::i;:::-;30638:100;;30755:3;30748:10;;30493:271;;;;:::o;30770:179::-;30910:31;30906:1;30898:6;30894:14;30887:55;30770:179;:::o;30955:366::-;31097:3;31118:67;31182:2;31177:3;31118:67;:::i;:::-;31111:74;;31194:93;31283:3;31194:93;:::i;:::-;31312:2;31307:3;31303:12;31296:19;;30955:366;;;:::o;31327:419::-;31493:4;31531:2;31520:9;31516:18;31508:26;;31580:9;31574:4;31570:20;31566:1;31555:9;31551:17;31544:47;31608:131;31734:4;31608:131;:::i;:::-;31600:139;;31327:419;;;:::o;31752:99::-;31804:6;31838:5;31832:12;31822:22;;31752:99;;;:::o;31857:377::-;31945:3;31973:39;32006:5;31973:39;:::i;:::-;32028:71;32092:6;32087:3;32028:71;:::i;:::-;32021:78;;32108:65;32166:6;32161:3;32154:4;32147:5;32143:16;32108:65;:::i;:::-;32198:29;32220:6;32198:29;:::i;:::-;32193:3;32189:39;32182:46;;31949:285;31857:377;;;;:::o;32240:313::-;32353:4;32391:2;32380:9;32376:18;32368:26;;32440:9;32434:4;32430:20;32426:1;32415:9;32411:17;32404:47;32468:78;32541:4;32532:6;32468:78;:::i;:::-;32460:86;;32240:313;;;;:::o
Swarm Source
ipfs://193dfee2f14e224d77e72193cfe4a8ddb3eed8121088b3dca97ad77a84ad3a52
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.