More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,342 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20929365 | 55 days ago | IN | 0 ETH | 0.00454357 | ||||
Withdraw | 20496930 | 115 days ago | IN | 0 ETH | 0.00019519 | ||||
Withdraw | 19924307 | 195 days ago | IN | 0 ETH | 0.00047875 | ||||
Withdraw | 19421804 | 265 days ago | IN | 0 ETH | 0.00544455 | ||||
Withdraw | 19139121 | 305 days ago | IN | 0 ETH | 0.00167722 | ||||
Withdraw | 19139121 | 305 days ago | IN | 0 ETH | 0.00208491 | ||||
Withdraw | 19139104 | 305 days ago | IN | 0 ETH | 0.00180232 | ||||
Withdraw | 19139104 | 305 days ago | IN | 0 ETH | 0.00224041 | ||||
Withdraw | 19139095 | 305 days ago | IN | 0 ETH | 0.00141341 | ||||
Withdraw | 19139095 | 305 days ago | IN | 0 ETH | 0.00175697 | ||||
Withdraw | 19139084 | 305 days ago | IN | 0 ETH | 0.00132115 | ||||
Withdraw | 19139083 | 305 days ago | IN | 0 ETH | 0.00153931 | ||||
Withdraw | 18945864 | 332 days ago | IN | 0 ETH | 0.00122628 | ||||
Withdraw | 18775366 | 356 days ago | IN | 0 ETH | 0.00269322 | ||||
Withdraw | 18775361 | 356 days ago | IN | 0 ETH | 0.00362629 | ||||
Withdraw | 18775358 | 356 days ago | IN | 0 ETH | 0.0030719 | ||||
Withdraw | 18775358 | 356 days ago | IN | 0 ETH | 0.00381133 | ||||
Withdraw | 18775355 | 356 days ago | IN | 0 ETH | 0.00284094 | ||||
Withdraw | 18775355 | 356 days ago | IN | 0 ETH | 0.00352478 | ||||
Withdraw | 18775353 | 356 days ago | IN | 0 ETH | 0.00247844 | ||||
Withdraw | 18775353 | 356 days ago | IN | 0 ETH | 0.00307502 | ||||
Withdraw | 18771929 | 357 days ago | IN | 0 ETH | 0.00504136 | ||||
Withdraw | 18713725 | 365 days ago | IN | 0 ETH | 0.00502223 | ||||
Withdraw | 18644723 | 374 days ago | IN | 0 ETH | 0.00191751 | ||||
Withdraw | 18553944 | 387 days ago | IN | 0 ETH | 0.00182606 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StablzVesting
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense pragma solidity = 0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; /// @title Stablz vesting contract contract StablzVesting is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; IERC20 public stablz; uint constant private TGE_PERCENT_DENOMINATOR = 100; uint public vestingStartedAt; uint public totalAmount; uint public totalWithdrawn; struct Vestment { uint amount; uint withdrawn; uint period; /// @dev tgeAmount refers to the amount that the user is allowed to withdraw at TGE uint tgeAmount; bool isTGEAmountWithdrawn; } struct User { uint numberOfVestments; mapping(uint => Vestment) vestments; } mapping(address => User) private _users; event Withdrawn(address user, uint amount); event VestingPeriodStarted(); /// @param _user User address /// @param _vestmentId Vestment ID modifier onlyValidVestmentId(address _user, uint _vestmentId) { uint numberOfVestments = _users[_user].numberOfVestments; require(numberOfVestments > 0, "StablzVesting: No vestments found for user"); require(_vestmentId < numberOfVestments, "StablzVesting: Invalid vestment ID"); _; } /// @notice Import vesting data /// @param _addresses List of addresses /// @param _amounts List of amounts /// @param _tgePercent TGE percentage e.g. 20 is 20% /// @param _vestingPeriod Vesting period in seconds e.g. 2592000 is 30 days function importData(address[] calldata _addresses, uint[] calldata _amounts, uint _tgePercent, uint _vestingPeriod) external onlyOwner { require(!_hasVestingStarted(), "StablzVesting: Cannot import data after vesting has started"); require(_addresses.length == _amounts.length, "StablzVesting: _addresses and _amounts list lengths do not match"); require(_tgePercent < TGE_PERCENT_DENOMINATOR, "StablzVesting: _tgePercent must be less than 100"); uint total; for (uint i; i < _addresses.length; i++) { total += _amounts[i]; User storage user = _users[_addresses[i]]; uint tgeAmount; if (_tgePercent > 0) { tgeAmount = _amounts[i] * _tgePercent / TGE_PERCENT_DENOMINATOR; } uint vested = _amounts[i] - tgeAmount; user.vestments[user.numberOfVestments] = Vestment( vested, 0, _vestingPeriod, tgeAmount, false ); user.numberOfVestments++; } totalAmount += total; } /// @notice Start vesting period /// @param _stablz Stablz token address function startVestingPeriod(IERC20 _stablz) external onlyOwner { require(address(_stablz) != address(0), "StablzVesting: _stablz cannot be the zero address"); require(!_hasVestingStarted(), "StablzVesting: Vesting period has already started"); require(totalAmount > 0, "StablzVesting: No data has been configured"); stablz = _stablz; vestingStartedAt = block.timestamp; stablz.safeTransferFrom(_msgSender(), address(this), totalAmount); emit VestingPeriodStarted(); } /// @notice Withdraw Stablz tokens function withdraw(uint _vestmentId) external nonReentrant onlyValidVestmentId(_msgSender(), _vestmentId) { require(_hasVestingStarted(), "StablzVesting: Unlock period has not started"); User storage user = _users[_msgSender()]; Vestment storage vestment = user.vestments[_vestmentId]; bool unclaimedTGE = !vestment.isTGEAmountWithdrawn && vestment.tgeAmount > 0; bool unclaimedVestment = vestment.withdrawn < vestment.amount; require(unclaimedTGE || unclaimedVestment, "StablzVesting: You have already withdrawn the total amount"); uint amount; if (unclaimedTGE) { vestment.isTGEAmountWithdrawn = true; amount += vestment.tgeAmount; } uint available = _availableToWithdraw(vestment); vestment.withdrawn += available; amount += available; totalWithdrawn += amount; stablz.safeTransfer(_msgSender(), amount); emit Withdrawn(_msgSender(), amount); } /// @notice Get the number of vestments for a user /// @param _user User address /// @return uint The total number of user vestments function getNumberOfVestments(address _user) external view returns (uint) { return _users[_user].numberOfVestments; } /// @notice Get details about a vestment for a given user and vestment ID /// @param _user User address /// @param _vestmentId Vestment ID /// @return Vestment A user's vestment function getVestment(address _user, uint _vestmentId) external view onlyValidVestmentId(_user, _vestmentId) returns (Vestment memory) { return _users[_user].vestments[_vestmentId]; } /// @dev Calculate amount to withdraw based on the current time relative to the vesting period /// @param _vestment Vestment /// @return amount Available amount to withdraw for a given vestment function _availableToWithdraw(Vestment memory _vestment) internal view returns (uint amount) { uint endDate = vestingStartedAt + _vestment.period; if (block.timestamp >= endDate) { amount = _vestment.amount - _vestment.withdrawn; } else { uint timeDifference = block.timestamp - vestingStartedAt; amount = (_vestment.amount * timeDifference / _vestment.period) - _vestment.withdrawn; } } /// @dev Checks whether or not the vesting period has started /// @return bool true if vesting has started, false if not function _hasVestingStarted() internal view returns (bool) { return vestingStartedAt > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @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 SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 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( IERC20 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit 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(IERC20 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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @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]. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[],"name":"VestingPeriodStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNumberOfVestments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_vestmentId","type":"uint256"}],"name":"getVestment","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"tgeAmount","type":"uint256"},{"internalType":"bool","name":"isTGEAmountWithdrawn","type":"bool"}],"internalType":"struct StablzVesting.Vestment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_tgePercent","type":"uint256"},{"internalType":"uint256","name":"_vestingPeriod","type":"uint256"}],"name":"importData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablz","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stablz","type":"address"}],"name":"startVestingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawn","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":[],"name":"vestingStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestmentId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061002d61002261003960201b60201c565b61004160201b60201c565b60018081905550610105565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61243280620001156000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a61461017b5780638da5cb5b14610185578063976d24a2146101a3578063979c71b7146101d3578063ba4e8d55146101f1578063f2fde38b1461020d576100b4565b80631a39d8ef146100b957806322e2d004146100d75780632e1a7d4d146100f35780634b3197131461010f57806362f270a31461012d5780636a474b4a1461014b575b600080fd5b6100c1610229565b6040516100ce919061132a565b60405180910390f35b6100f160048036038101906100ec9190611436565b61022f565b005b61010d600480360381019061010891906114dd565b6104f3565b005b610117610875565b604051610124919061132a565b60405180910390f35b61013561087b565b6040516101429190611589565b60405180910390f35b610165600480360381019061016091906115e2565b6108a1565b60405161017291906116b4565b60405180910390f35b610183610a23565b005b61018d610a37565b60405161019a91906116de565b60405180910390f35b6101bd60048036038101906101b891906116f9565b610a60565b6040516101ca919061132a565b60405180910390f35b6101db610aac565b6040516101e8919061132a565b60405180910390f35b61020b60048036038101906102069190611764565b610ab2565b005b610227600480360381019061022291906116f9565b610c86565b005b60045481565b610237610d0a565b61023f610d88565b1561027f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027690611814565b60405180910390fd5b8383905086869050146102c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102be906118a6565b60405180910390fd5b6064821061030a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030190611938565b60405180910390fd5b6000805b878790508110156104d05785858281811061032c5761032b611958565b5b905060200201358261033e91906119b6565b91506000600660008a8a8581811061035957610358611958565b5b905060200201602081019061036e91906116f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000808611156103e8576064868989868181106103ca576103c9611958565b5b905060200201356103db9190611a0c565b6103e59190611a95565b90505b6000818989868181106103fe576103fd611958565b5b9050602002013561040f9190611ac6565b90506040518060a001604052808281526020016000815260200187815260200183815260200160001515815250836001016000856000015481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050508260000160008154809291906104b590611afa565b919050555050505080806104c890611afa565b91505061030e565b5080600460008282546104e391906119b6565b9250508190555050505050505050565b6104fb610d94565b610503610de4565b816000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811161058e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058590611bb5565b60405180910390fd5b8082106105d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c790611c47565b60405180910390fd5b6105d8610d88565b610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90611cd9565b60405180910390fd5b600060066000610625610de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816001016000878152602001908152602001600020905060008160040160009054906101000a900460ff1615801561069f575060008260030154115b905060008260000154836001015410905081806106b95750805b6106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90611d6b565b60405180910390fd5b600082156107305760018460040160006101000a81548160ff02191690831515021790555083600301548161072d91906119b6565b90505b6000610789856040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050610dec565b90508085600101600082825461079f91906119b6565b9250508190555080826107b291906119b6565b915081600560008282546107c691906119b6565b925050819055506108216107d8610de4565b83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e6f9092919063ffffffff16565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d561084a610de4565b83604051610859929190611d8b565b60405180910390a1505050505050505050610872610ef5565b50565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108a96112e0565b82826000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90611bb5565b60405180910390fd5b808210610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e90611c47565b60405180910390fd5b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050935050505092915050565b610a2b610d0a565b610a356000610efe565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60035481565b610aba610d0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190611e26565b60405180910390fd5b610b32610d88565b15610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990611eb8565b60405180910390fd5b600060045411610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90611f4a565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600381905550610c57610c0a610de4565b30600454600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fc2909392919063ffffffff16565b7f6616cd7aacc99e7ae25e28131b566bf125bf4b7d8adff6302f423d232c154d5660405160405180910390a150565b610c8e610d0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590611fdc565b60405180910390fd5b610d0781610efe565b50565b610d12610de4565b73ffffffffffffffffffffffffffffffffffffffff16610d30610a37565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612048565b60405180910390fd5b565b60008060035411905090565b60026001541415610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd1906120b4565b60405180910390fd5b6002600181905550565b600033905090565b6000808260400151600354610e0191906119b6565b9050804210610e255782602001518360000151610e1e9190611ac6565b9150610e69565b600060035442610e359190611ac6565b905083602001518460400151828660000151610e519190611a0c565b610e5b9190611a95565b610e659190611ac6565b9250505b50919050565b610ef08363a9059cbb60e01b8484604051602401610e8e929190611d8b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061104b565b505050565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611045846323b872dd60e01b858585604051602401610fe3939291906120d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061104b565b50505050565b60006110ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166111129092919063ffffffff16565b905060008151111561110d57808060200190518101906110cd9190612137565b61110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611103906121d6565b60405180910390fd5b5b505050565b6060611121848460008561112a565b90509392505050565b60608247101561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690612268565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516111989190612302565b60006040518083038185875af1925050503d80600081146111d5576040519150601f19603f3d011682016040523d82523d6000602084013e6111da565b606091505b50915091506111eb878383876111f7565b92505050949350505050565b6060831561125a57600083511415611252576112128561126d565b611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890612365565b60405180910390fd5b5b829050611265565b6112648383611290565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156112a35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d791906123da565b60405180910390fd5b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000819050919050565b61132481611311565b82525050565b600060208201905061133f600083018461131b565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126113745761137361134f565b5b8235905067ffffffffffffffff81111561139157611390611354565b5b6020830191508360208202830111156113ad576113ac611359565b5b9250929050565b60008083601f8401126113ca576113c961134f565b5b8235905067ffffffffffffffff8111156113e7576113e6611354565b5b60208301915083602082028301111561140357611402611359565b5b9250929050565b61141381611311565b811461141e57600080fd5b50565b6000813590506114308161140a565b92915050565b6000806000806000806080878903121561145357611452611345565b5b600087013567ffffffffffffffff8111156114715761147061134a565b5b61147d89828a0161135e565b9650965050602087013567ffffffffffffffff8111156114a05761149f61134a565b5b6114ac89828a016113b4565b945094505060406114bf89828a01611421565b92505060606114d089828a01611421565b9150509295509295509295565b6000602082840312156114f3576114f2611345565b5b600061150184828501611421565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061154f61154a6115458461150a565b61152a565b61150a565b9050919050565b600061156182611534565b9050919050565b600061157382611556565b9050919050565b61158381611568565b82525050565b600060208201905061159e600083018461157a565b92915050565b60006115af8261150a565b9050919050565b6115bf816115a4565b81146115ca57600080fd5b50565b6000813590506115dc816115b6565b92915050565b600080604083850312156115f9576115f8611345565b5b6000611607858286016115cd565b925050602061161885828601611421565b9150509250929050565b61162b81611311565b82525050565b60008115159050919050565b61164681611631565b82525050565b60a0820160008201516116626000850182611622565b5060208201516116756020850182611622565b5060408201516116886040850182611622565b50606082015161169b6060850182611622565b5060808201516116ae608085018261163d565b50505050565b600060a0820190506116c9600083018461164c565b92915050565b6116d8816115a4565b82525050565b60006020820190506116f360008301846116cf565b92915050565b60006020828403121561170f5761170e611345565b5b600061171d848285016115cd565b91505092915050565b6000611731826115a4565b9050919050565b61174181611726565b811461174c57600080fd5b50565b60008135905061175e81611738565b92915050565b60006020828403121561177a57611779611345565b5b60006117888482850161174f565b91505092915050565b600082825260208201905092915050565b7f537461626c7a56657374696e673a2043616e6e6f7420696d706f72742064617460008201527f612061667465722076657374696e672068617320737461727465640000000000602082015250565b60006117fe603b83611791565b9150611809826117a2565b604082019050919050565b6000602082019050818103600083015261182d816117f1565b9050919050565b7f537461626c7a56657374696e673a205f61646472657373657320616e64205f6160008201527f6d6f756e7473206c697374206c656e6774687320646f206e6f74206d61746368602082015250565b6000611890604083611791565b915061189b82611834565b604082019050919050565b600060208201905081810360008301526118bf81611883565b9050919050565b7f537461626c7a56657374696e673a205f74676550657263656e74206d7573742060008201527f6265206c657373207468616e2031303000000000000000000000000000000000602082015250565b6000611922603083611791565b915061192d826118c6565b604082019050919050565b6000602082019050818103600083015261195181611915565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119c182611311565b91506119cc83611311565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a0157611a00611987565b5b828201905092915050565b6000611a1782611311565b9150611a2283611311565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a5b57611a5a611987565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611aa082611311565b9150611aab83611311565b925082611abb57611aba611a66565b5b828204905092915050565b6000611ad182611311565b9150611adc83611311565b925082821015611aef57611aee611987565b5b828203905092915050565b6000611b0582611311565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611b3857611b37611987565b5b600182019050919050565b7f537461626c7a56657374696e673a204e6f20766573746d656e747320666f756e60008201527f6420666f72207573657200000000000000000000000000000000000000000000602082015250565b6000611b9f602a83611791565b9150611baa82611b43565b604082019050919050565b60006020820190508181036000830152611bce81611b92565b9050919050565b7f537461626c7a56657374696e673a20496e76616c696420766573746d656e742060008201527f4944000000000000000000000000000000000000000000000000000000000000602082015250565b6000611c31602283611791565b9150611c3c82611bd5565b604082019050919050565b60006020820190508181036000830152611c6081611c24565b9050919050565b7f537461626c7a56657374696e673a20556e6c6f636b20706572696f642068617360008201527f206e6f7420737461727465640000000000000000000000000000000000000000602082015250565b6000611cc3602c83611791565b9150611cce82611c67565b604082019050919050565b60006020820190508181036000830152611cf281611cb6565b9050919050565b7f537461626c7a56657374696e673a20596f75206861766520616c72656164792060008201527f77697468647261776e2074686520746f74616c20616d6f756e74000000000000602082015250565b6000611d55603a83611791565b9150611d6082611cf9565b604082019050919050565b60006020820190508181036000830152611d8481611d48565b9050919050565b6000604082019050611da060008301856116cf565b611dad602083018461131b565b9392505050565b7f537461626c7a56657374696e673a205f737461626c7a2063616e6e6f7420626560008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000611e10603183611791565b9150611e1b82611db4565b604082019050919050565b60006020820190508181036000830152611e3f81611e03565b9050919050565b7f537461626c7a56657374696e673a2056657374696e6720706572696f6420686160008201527f7320616c72656164792073746172746564000000000000000000000000000000602082015250565b6000611ea2603183611791565b9150611ead82611e46565b604082019050919050565b60006020820190508181036000830152611ed181611e95565b9050919050565b7f537461626c7a56657374696e673a204e6f206461746120686173206265656e2060008201527f636f6e6669677572656400000000000000000000000000000000000000000000602082015250565b6000611f34602a83611791565b9150611f3f82611ed8565b604082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fc6602683611791565b9150611fd182611f6a565b604082019050919050565b60006020820190508181036000830152611ff581611fb9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612032602083611791565b915061203d82611ffc565b602082019050919050565b6000602082019050818103600083015261206181612025565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061209e601f83611791565b91506120a982612068565b602082019050919050565b600060208201905081810360008301526120cd81612091565b9050919050565b60006060820190506120e960008301866116cf565b6120f660208301856116cf565b612103604083018461131b565b949350505050565b61211481611631565b811461211f57600080fd5b50565b6000815190506121318161210b565b92915050565b60006020828403121561214d5761214c611345565b5b600061215b84828501612122565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006121c0602a83611791565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612252602683611791565b915061225d826121f6565b604082019050919050565b6000602082019050818103600083015261228181612245565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156122bc5780820151818401526020810190506122a1565b838111156122cb576000848401525b50505050565b60006122dc82612288565b6122e68185612293565b93506122f681856020860161229e565b80840191505092915050565b600061230e82846122d1565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061234f601d83611791565b915061235a82612319565b602082019050919050565b6000602082019050818103600083015261237e81612342565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006123ac82612385565b6123b68185611791565b93506123c681856020860161229e565b6123cf81612390565b840191505092915050565b600060208201905081810360008301526123f481846123a1565b90509291505056fea264697066735822122045279fad08269b627c23542bb7d150e9c1b60470c6b3616b4b9d2f458476f4a264736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a61461017b5780638da5cb5b14610185578063976d24a2146101a3578063979c71b7146101d3578063ba4e8d55146101f1578063f2fde38b1461020d576100b4565b80631a39d8ef146100b957806322e2d004146100d75780632e1a7d4d146100f35780634b3197131461010f57806362f270a31461012d5780636a474b4a1461014b575b600080fd5b6100c1610229565b6040516100ce919061132a565b60405180910390f35b6100f160048036038101906100ec9190611436565b61022f565b005b61010d600480360381019061010891906114dd565b6104f3565b005b610117610875565b604051610124919061132a565b60405180910390f35b61013561087b565b6040516101429190611589565b60405180910390f35b610165600480360381019061016091906115e2565b6108a1565b60405161017291906116b4565b60405180910390f35b610183610a23565b005b61018d610a37565b60405161019a91906116de565b60405180910390f35b6101bd60048036038101906101b891906116f9565b610a60565b6040516101ca919061132a565b60405180910390f35b6101db610aac565b6040516101e8919061132a565b60405180910390f35b61020b60048036038101906102069190611764565b610ab2565b005b610227600480360381019061022291906116f9565b610c86565b005b60045481565b610237610d0a565b61023f610d88565b1561027f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027690611814565b60405180910390fd5b8383905086869050146102c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102be906118a6565b60405180910390fd5b6064821061030a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030190611938565b60405180910390fd5b6000805b878790508110156104d05785858281811061032c5761032b611958565b5b905060200201358261033e91906119b6565b91506000600660008a8a8581811061035957610358611958565b5b905060200201602081019061036e91906116f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000808611156103e8576064868989868181106103ca576103c9611958565b5b905060200201356103db9190611a0c565b6103e59190611a95565b90505b6000818989868181106103fe576103fd611958565b5b9050602002013561040f9190611ac6565b90506040518060a001604052808281526020016000815260200187815260200183815260200160001515815250836001016000856000015481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050508260000160008154809291906104b590611afa565b919050555050505080806104c890611afa565b91505061030e565b5080600460008282546104e391906119b6565b9250508190555050505050505050565b6104fb610d94565b610503610de4565b816000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811161058e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058590611bb5565b60405180910390fd5b8082106105d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c790611c47565b60405180910390fd5b6105d8610d88565b610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90611cd9565b60405180910390fd5b600060066000610625610de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816001016000878152602001908152602001600020905060008160040160009054906101000a900460ff1615801561069f575060008260030154115b905060008260000154836001015410905081806106b95750805b6106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90611d6b565b60405180910390fd5b600082156107305760018460040160006101000a81548160ff02191690831515021790555083600301548161072d91906119b6565b90505b6000610789856040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050610dec565b90508085600101600082825461079f91906119b6565b9250508190555080826107b291906119b6565b915081600560008282546107c691906119b6565b925050819055506108216107d8610de4565b83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e6f9092919063ffffffff16565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d561084a610de4565b83604051610859929190611d8b565b60405180910390a1505050505050505050610872610ef5565b50565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108a96112e0565b82826000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90611bb5565b60405180910390fd5b808210610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e90611c47565b60405180910390fd5b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050935050505092915050565b610a2b610d0a565b610a356000610efe565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60035481565b610aba610d0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190611e26565b60405180910390fd5b610b32610d88565b15610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990611eb8565b60405180910390fd5b600060045411610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90611f4a565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600381905550610c57610c0a610de4565b30600454600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fc2909392919063ffffffff16565b7f6616cd7aacc99e7ae25e28131b566bf125bf4b7d8adff6302f423d232c154d5660405160405180910390a150565b610c8e610d0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590611fdc565b60405180910390fd5b610d0781610efe565b50565b610d12610de4565b73ffffffffffffffffffffffffffffffffffffffff16610d30610a37565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612048565b60405180910390fd5b565b60008060035411905090565b60026001541415610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd1906120b4565b60405180910390fd5b6002600181905550565b600033905090565b6000808260400151600354610e0191906119b6565b9050804210610e255782602001518360000151610e1e9190611ac6565b9150610e69565b600060035442610e359190611ac6565b905083602001518460400151828660000151610e519190611a0c565b610e5b9190611a95565b610e659190611ac6565b9250505b50919050565b610ef08363a9059cbb60e01b8484604051602401610e8e929190611d8b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061104b565b505050565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611045846323b872dd60e01b858585604051602401610fe3939291906120d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061104b565b50505050565b60006110ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166111129092919063ffffffff16565b905060008151111561110d57808060200190518101906110cd9190612137565b61110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611103906121d6565b60405180910390fd5b5b505050565b6060611121848460008561112a565b90509392505050565b60608247101561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690612268565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516111989190612302565b60006040518083038185875af1925050503d80600081146111d5576040519150601f19603f3d011682016040523d82523d6000602084013e6111da565b606091505b50915091506111eb878383876111f7565b92505050949350505050565b6060831561125a57600083511415611252576112128561126d565b611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890612365565b60405180910390fd5b5b829050611265565b6112648383611290565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156112a35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d791906123da565b60405180910390fd5b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000819050919050565b61132481611311565b82525050565b600060208201905061133f600083018461131b565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126113745761137361134f565b5b8235905067ffffffffffffffff81111561139157611390611354565b5b6020830191508360208202830111156113ad576113ac611359565b5b9250929050565b60008083601f8401126113ca576113c961134f565b5b8235905067ffffffffffffffff8111156113e7576113e6611354565b5b60208301915083602082028301111561140357611402611359565b5b9250929050565b61141381611311565b811461141e57600080fd5b50565b6000813590506114308161140a565b92915050565b6000806000806000806080878903121561145357611452611345565b5b600087013567ffffffffffffffff8111156114715761147061134a565b5b61147d89828a0161135e565b9650965050602087013567ffffffffffffffff8111156114a05761149f61134a565b5b6114ac89828a016113b4565b945094505060406114bf89828a01611421565b92505060606114d089828a01611421565b9150509295509295509295565b6000602082840312156114f3576114f2611345565b5b600061150184828501611421565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061154f61154a6115458461150a565b61152a565b61150a565b9050919050565b600061156182611534565b9050919050565b600061157382611556565b9050919050565b61158381611568565b82525050565b600060208201905061159e600083018461157a565b92915050565b60006115af8261150a565b9050919050565b6115bf816115a4565b81146115ca57600080fd5b50565b6000813590506115dc816115b6565b92915050565b600080604083850312156115f9576115f8611345565b5b6000611607858286016115cd565b925050602061161885828601611421565b9150509250929050565b61162b81611311565b82525050565b60008115159050919050565b61164681611631565b82525050565b60a0820160008201516116626000850182611622565b5060208201516116756020850182611622565b5060408201516116886040850182611622565b50606082015161169b6060850182611622565b5060808201516116ae608085018261163d565b50505050565b600060a0820190506116c9600083018461164c565b92915050565b6116d8816115a4565b82525050565b60006020820190506116f360008301846116cf565b92915050565b60006020828403121561170f5761170e611345565b5b600061171d848285016115cd565b91505092915050565b6000611731826115a4565b9050919050565b61174181611726565b811461174c57600080fd5b50565b60008135905061175e81611738565b92915050565b60006020828403121561177a57611779611345565b5b60006117888482850161174f565b91505092915050565b600082825260208201905092915050565b7f537461626c7a56657374696e673a2043616e6e6f7420696d706f72742064617460008201527f612061667465722076657374696e672068617320737461727465640000000000602082015250565b60006117fe603b83611791565b9150611809826117a2565b604082019050919050565b6000602082019050818103600083015261182d816117f1565b9050919050565b7f537461626c7a56657374696e673a205f61646472657373657320616e64205f6160008201527f6d6f756e7473206c697374206c656e6774687320646f206e6f74206d61746368602082015250565b6000611890604083611791565b915061189b82611834565b604082019050919050565b600060208201905081810360008301526118bf81611883565b9050919050565b7f537461626c7a56657374696e673a205f74676550657263656e74206d7573742060008201527f6265206c657373207468616e2031303000000000000000000000000000000000602082015250565b6000611922603083611791565b915061192d826118c6565b604082019050919050565b6000602082019050818103600083015261195181611915565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119c182611311565b91506119cc83611311565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a0157611a00611987565b5b828201905092915050565b6000611a1782611311565b9150611a2283611311565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a5b57611a5a611987565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611aa082611311565b9150611aab83611311565b925082611abb57611aba611a66565b5b828204905092915050565b6000611ad182611311565b9150611adc83611311565b925082821015611aef57611aee611987565b5b828203905092915050565b6000611b0582611311565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611b3857611b37611987565b5b600182019050919050565b7f537461626c7a56657374696e673a204e6f20766573746d656e747320666f756e60008201527f6420666f72207573657200000000000000000000000000000000000000000000602082015250565b6000611b9f602a83611791565b9150611baa82611b43565b604082019050919050565b60006020820190508181036000830152611bce81611b92565b9050919050565b7f537461626c7a56657374696e673a20496e76616c696420766573746d656e742060008201527f4944000000000000000000000000000000000000000000000000000000000000602082015250565b6000611c31602283611791565b9150611c3c82611bd5565b604082019050919050565b60006020820190508181036000830152611c6081611c24565b9050919050565b7f537461626c7a56657374696e673a20556e6c6f636b20706572696f642068617360008201527f206e6f7420737461727465640000000000000000000000000000000000000000602082015250565b6000611cc3602c83611791565b9150611cce82611c67565b604082019050919050565b60006020820190508181036000830152611cf281611cb6565b9050919050565b7f537461626c7a56657374696e673a20596f75206861766520616c72656164792060008201527f77697468647261776e2074686520746f74616c20616d6f756e74000000000000602082015250565b6000611d55603a83611791565b9150611d6082611cf9565b604082019050919050565b60006020820190508181036000830152611d8481611d48565b9050919050565b6000604082019050611da060008301856116cf565b611dad602083018461131b565b9392505050565b7f537461626c7a56657374696e673a205f737461626c7a2063616e6e6f7420626560008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000611e10603183611791565b9150611e1b82611db4565b604082019050919050565b60006020820190508181036000830152611e3f81611e03565b9050919050565b7f537461626c7a56657374696e673a2056657374696e6720706572696f6420686160008201527f7320616c72656164792073746172746564000000000000000000000000000000602082015250565b6000611ea2603183611791565b9150611ead82611e46565b604082019050919050565b60006020820190508181036000830152611ed181611e95565b9050919050565b7f537461626c7a56657374696e673a204e6f206461746120686173206265656e2060008201527f636f6e6669677572656400000000000000000000000000000000000000000000602082015250565b6000611f34602a83611791565b9150611f3f82611ed8565b604082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fc6602683611791565b9150611fd182611f6a565b604082019050919050565b60006020820190508181036000830152611ff581611fb9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612032602083611791565b915061203d82611ffc565b602082019050919050565b6000602082019050818103600083015261206181612025565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061209e601f83611791565b91506120a982612068565b602082019050919050565b600060208201905081810360008301526120cd81612091565b9050919050565b60006060820190506120e960008301866116cf565b6120f660208301856116cf565b612103604083018461131b565b949350505050565b61211481611631565b811461211f57600080fd5b50565b6000815190506121318161210b565b92915050565b60006020828403121561214d5761214c611345565b5b600061215b84828501612122565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006121c0602a83611791565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612252602683611791565b915061225d826121f6565b604082019050919050565b6000602082019050818103600083015261228181612245565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156122bc5780820151818401526020810190506122a1565b838111156122cb576000848401525b50505050565b60006122dc82612288565b6122e68185612293565b93506122f681856020860161229e565b80840191505092915050565b600061230e82846122d1565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061234f601d83611791565b915061235a82612319565b602082019050919050565b6000602082019050818103600083015261237e81612342565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006123ac82612385565b6123b68185611791565b93506123c681856020860161229e565b6123cf81612390565b840191505092915050565b600060208201905081810360008301526123f481846123a1565b90509291505056fea264697066735822122045279fad08269b627c23542bb7d150e9c1b60470c6b3616b4b9d2f458476f4a264736f6c63430008090033
Deployed Bytecode Sourcemap
339:5770:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;550:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1745:1126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3530:994;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;579:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;430:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5004:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;:::i;:::-;;1201:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4675:129:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;515:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2958:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;550:23:7;;;;:::o;1745:1126::-;1094:13:0;:11;:13::i;:::-;1899:20:7::1;:18;:20::i;:::-;1898:21;1890:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;2022:8;;:15;;2001:10;;:17;;:36;1993:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;505:3;2124:11;:37;2116:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;2224:10;2249:6:::0;2244:591:::1;2261:10;;:17;;2257:1;:21;2244:591;;;2308:8;;2317:1;2308:11;;;;;;;:::i;:::-;;;;;;;;2299:20;;;;;:::i;:::-;;;2333:17;2353:6;:21;2360:10;;2371:1;2360:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2353:21;;;;;;;;;;;;;;;2333:41;;2389:14;2435:1:::0;2421:11:::1;:15;2417:117;;;505:3;2482:11;2468:8;;2477:1;2468:11;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;:51;;;;:::i;:::-;2456:63;;2417:117;2547:11;2575:9;2561:8;;2570:1;2561:11;;;;;;;:::i;:::-;;;;;;;;:23;;;;:::i;:::-;2547:37;;2639:147;;;;;;;;2665:6;2639:147;;;;2689:1;2639:147;;;;2708:14;2639:147;;;;2740:9;2639:147;;;;2767:5;2639:147;;;;::::0;2598:4:::1;:14;;:38;2613:4;:22;;;2598:38;;;;;;;;;;;:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2800:4;:22;;;:24;;;;;;;;;:::i;:::-;;;;;;2285:550;;;2280:3;;;;;:::i;:::-;;;;2244:591;;;;2859:5;2844:11;;:20;;;;;;;:::i;:::-;;;;;;;;1880:991;1745:1126:::0;;;;;;:::o;3530:994::-;2261:21:1;:19;:21::i;:::-;3608:12:7::1;:10;:12::i;:::-;3622:11;1234:22;1259:6;:13;1266:5;1259:13;;;;;;;;;;;;;;;:31;;;1234:56;;1328:1;1308:17;:21;1300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1408:17;1394:11;:31;1386:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3653:20:::2;:18;:20::i;:::-;3645:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3732:17;3752:6;:20;3759:12;:10;:12::i;:::-;3752:20;;;;;;;;;;;;;;;3732:40;;3782:25;3810:4;:14;;:27;3825:11;3810:27;;;;;;;;;;;3782:55;;3847:17;3868:8;:29;;;;;;;;;;;;3867:30;:56;;;;;3922:1;3901:8;:18;;;:22;3867:56;3847:76;;3933:22;3979:8;:15;;;3958:8;:18;;;:36;3933:61;;4012:12;:33;;;;4028:17;4012:33;4004:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;4118:11;4143:12;4139:121;;;4203:4;4171:8;:29;;;:36;;;;;;;;;;;;;;;;;;4231:8;:18;;;4221:28;;;;;:::i;:::-;;;4139:121;4269:14;4286:30;4307:8;4286:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:20;:30::i;:::-;4269:47;;4348:9;4326:8;:18;;;:31;;;;;;;:::i;:::-;;;;;;;;4377:9;4367:19;;;;;:::i;:::-;;;4414:6;4396:14;;:24;;;;;;;:::i;:::-;;;;;;;;4430:41;4450:12;:10;:12::i;:::-;4464:6;4430;;;;;;;;;;;:19;;;;:41;;;;;:::i;:::-;4486:31;4496:12;:10;:12::i;:::-;4510:6;4486:31;;;;;;;:::i;:::-;;;;;;;;3635:889;;;;;;1224:258:::1;2292:1:1;;2303:20:::0;:18;:20::i;:::-;3530:994:7;:::o;579:26::-;;;;:::o;430:20::-;;;;;;;;;;;;;:::o;5004:194::-;5121:15;;:::i;:::-;5092:5;5099:11;1234:22;1259:6;:13;1266:5;1259:13;;;;;;;;;;;;;;;:31;;;1234:56;;1328:1;1308:17;:21;1300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1408:17;1394:11;:31;1386:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5155:6:::1;:13;5162:5;5155:13;;;;;;;;;;;;;;;:23;;:36;5179:11;5155:36;;;;;;;;;;;5148:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;1224:258:::0;5004:194;;;;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;4675:129:7:-;4743:4;4766:6;:13;4773:5;4766:13;;;;;;;;;;;;;;;:31;;;4759:38;;4675:129;;;:::o;515:28::-;;;;:::o;2958:527::-;1094:13:0;:11;:13::i;:::-;3067:1:7::1;3039:30;;3047:7;3039:30;;;;3031:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;3142:20;:18;:20::i;:::-;3141:21;3133:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;3248:1;3234:11;;:15;3226:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3315:7;3306:6;;:16;;;;;;;;;;;;;;;;;;3351:15;3332:16;:34;;;;3376:65;3400:12;:10;:12::i;:::-;3422:4;3429:11;;3376:6;;;;;;;;;;;:23;;;;:65;;;;;;:::i;:::-;3456:22;;;;;;;;;;2958:527:::0;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;6004:103:7:-;6057:4;6099:1;6080:16;;:20;6073:27;;6004:103;:::o;2336:287:1:-;1759:1;2468:7;;:19;;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;5410:459:7:-;5490:11;5513:12;5547:9;:16;;;5528;;:35;;;;:::i;:::-;5513:50;;5596:7;5577:15;:26;5573:290;;5647:9;:19;;;5628:9;:16;;;:38;;;;:::i;:::-;5619:47;;5573:290;;;5697:19;5737:16;;5719:15;:34;;;;:::i;:::-;5697:56;;5833:9;:19;;;5813:9;:16;;;5796:14;5777:9;:16;;;:33;;;;:::i;:::-;:52;;;;:::i;:::-;5776:76;;;;:::i;:::-;5767:85;;5683:180;5573:290;5503:366;5410:459;;;:::o;763:205:4:-;875:86;895:5;925:23;;;950:2;954:5;902:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;:::-;763:205;;;:::o;2629:209:1:-;1716:1;2809:7;:22;;;;2629:209::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;974:241:4:-;1112:96;1132:5;1162:27;;;1191:4;1197:2;1201:5;1139:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;:::-;974:241;;;;:::o;3747:706::-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4166:95;;4295:1;4275:10;:17;:21;4271:176;;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4271:176;3817:636;3747:706;;:::o;3873:223:5:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;;3873:223;;;;;:::o;4960:446::-;5125:12;5182:5;5157:21;:30;;5149:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;;;;4960:446;;;;;;:::o;7466:628::-;7646:12;7674:7;7670:418;;;7722:1;7701:10;:17;:22;7697:286;;;7916:18;7927:6;7916:10;:18::i;:::-;7908:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7697:286;8003:10;7996:17;;;;7670:418;8044:33;8052:10;8064:12;8044:7;:33::i;:::-;7466:628;;;;;;;:::o;1175:320::-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;8616:540::-;8795:1;8775:10;:17;:21;8771:379;;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:8:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:117;878:1;875;868:12;892:117;1001:1;998;991:12;1015:117;1124:1;1121;1114:12;1155:568;1228:8;1238:6;1288:3;1281:4;1273:6;1269:17;1265:27;1255:122;;1296:79;;:::i;:::-;1255:122;1409:6;1396:20;1386:30;;1439:18;1431:6;1428:30;1425:117;;;1461:79;;:::i;:::-;1425:117;1575:4;1567:6;1563:17;1551:29;;1629:3;1621:4;1613:6;1609:17;1599:8;1595:32;1592:41;1589:128;;;1636:79;;:::i;:::-;1589:128;1155:568;;;;;:::o;1746:::-;1819:8;1829:6;1879:3;1872:4;1864:6;1860:17;1856:27;1846:122;;1887:79;;:::i;:::-;1846:122;2000:6;1987:20;1977:30;;2030:18;2022:6;2019:30;2016:117;;;2052:79;;:::i;:::-;2016:117;2166:4;2158:6;2154:17;2142:29;;2220:3;2212:4;2204:6;2200:17;2190:8;2186:32;2183:41;2180:128;;;2227:79;;:::i;:::-;2180:128;1746:568;;;;;:::o;2320:122::-;2393:24;2411:5;2393:24;:::i;:::-;2386:5;2383:35;2373:63;;2432:1;2429;2422:12;2373:63;2320:122;:::o;2448:139::-;2494:5;2532:6;2519:20;2510:29;;2548:33;2575:5;2548:33;:::i;:::-;2448:139;;;;:::o;2593:1225::-;2733:6;2741;2749;2757;2765;2773;2822:3;2810:9;2801:7;2797:23;2793:33;2790:120;;;2829:79;;:::i;:::-;2790:120;2977:1;2966:9;2962:17;2949:31;3007:18;2999:6;2996:30;2993:117;;;3029:79;;:::i;:::-;2993:117;3142:80;3214:7;3205:6;3194:9;3190:22;3142:80;:::i;:::-;3124:98;;;;2920:312;3299:2;3288:9;3284:18;3271:32;3330:18;3322:6;3319:30;3316:117;;;3352:79;;:::i;:::-;3316:117;3465:80;3537:7;3528:6;3517:9;3513:22;3465:80;:::i;:::-;3447:98;;;;3242:313;3594:2;3620:53;3665:7;3656:6;3645:9;3641:22;3620:53;:::i;:::-;3610:63;;3565:118;3722:2;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3693:118;2593:1225;;;;;;;;:::o;3824:329::-;3883:6;3932:2;3920:9;3911:7;3907:23;3903:32;3900:119;;;3938:79;;:::i;:::-;3900:119;4058:1;4083:53;4128:7;4119:6;4108:9;4104:22;4083:53;:::i;:::-;4073:63;;4029:117;3824:329;;;;:::o;4159:126::-;4196:7;4236:42;4229:5;4225:54;4214:65;;4159:126;;;:::o;4291:60::-;4319:3;4340:5;4333:12;;4291:60;;;:::o;4357:142::-;4407:9;4440:53;4458:34;4467:24;4485:5;4467:24;:::i;:::-;4458:34;:::i;:::-;4440:53;:::i;:::-;4427:66;;4357:142;;;:::o;4505:126::-;4555:9;4588:37;4619:5;4588:37;:::i;:::-;4575:50;;4505:126;;;:::o;4637:140::-;4701:9;4734:37;4765:5;4734:37;:::i;:::-;4721:50;;4637:140;;;:::o;4783:159::-;4884:51;4929:5;4884:51;:::i;:::-;4879:3;4872:64;4783:159;;:::o;4948:250::-;5055:4;5093:2;5082:9;5078:18;5070:26;;5106:85;5188:1;5177:9;5173:17;5164:6;5106:85;:::i;:::-;4948:250;;;;:::o;5204:96::-;5241:7;5270:24;5288:5;5270:24;:::i;:::-;5259:35;;5204:96;;;:::o;5306:122::-;5379:24;5397:5;5379:24;:::i;:::-;5372:5;5369:35;5359:63;;5418:1;5415;5408:12;5359:63;5306:122;:::o;5434:139::-;5480:5;5518:6;5505:20;5496:29;;5534:33;5561:5;5534:33;:::i;:::-;5434:139;;;;:::o;5579:474::-;5647:6;5655;5704:2;5692:9;5683:7;5679:23;5675:32;5672:119;;;5710:79;;:::i;:::-;5672:119;5830:1;5855:53;5900:7;5891:6;5880:9;5876:22;5855:53;:::i;:::-;5845:63;;5801:117;5957:2;5983:53;6028:7;6019:6;6008:9;6004:22;5983:53;:::i;:::-;5973:63;;5928:118;5579:474;;;;;:::o;6059:108::-;6136:24;6154:5;6136:24;:::i;:::-;6131:3;6124:37;6059:108;;:::o;6173:90::-;6207:7;6250:5;6243:13;6236:21;6225:32;;6173:90;;;:::o;6269:99::-;6340:21;6355:5;6340:21;:::i;:::-;6335:3;6328:34;6269:99;;:::o;6444:1053::-;6591:4;6586:3;6582:14;6680:4;6673:5;6669:16;6663:23;6699:63;6756:4;6751:3;6747:14;6733:12;6699:63;:::i;:::-;6606:166;6859:4;6852:5;6848:16;6842:23;6878:63;6935:4;6930:3;6926:14;6912:12;6878:63;:::i;:::-;6782:169;7035:4;7028:5;7024:16;7018:23;7054:63;7111:4;7106:3;7102:14;7088:12;7054:63;:::i;:::-;6961:166;7214:4;7207:5;7203:16;7197:23;7233:63;7290:4;7285:3;7281:14;7267:12;7233:63;:::i;:::-;7137:169;7404:4;7397:5;7393:16;7387:23;7423:57;7474:4;7469:3;7465:14;7451:12;7423:57;:::i;:::-;7316:174;6560:937;6444:1053;;:::o;7503:323::-;7646:4;7684:3;7673:9;7669:19;7661:27;;7698:121;7816:1;7805:9;7801:17;7792:6;7698:121;:::i;:::-;7503:323;;;;:::o;7832:118::-;7919:24;7937:5;7919:24;:::i;:::-;7914:3;7907:37;7832:118;;:::o;7956:222::-;8049:4;8087:2;8076:9;8072:18;8064:26;;8100:71;8168:1;8157:9;8153:17;8144:6;8100:71;:::i;:::-;7956:222;;;;:::o;8184:329::-;8243:6;8292:2;8280:9;8271:7;8267:23;8263:32;8260:119;;;8298:79;;:::i;:::-;8260:119;8418:1;8443:53;8488:7;8479:6;8468:9;8464:22;8443:53;:::i;:::-;8433:63;;8389:117;8184:329;;;;:::o;8519:110::-;8570:7;8599:24;8617:5;8599:24;:::i;:::-;8588:35;;8519:110;;;:::o;8635:150::-;8722:38;8754:5;8722:38;:::i;:::-;8715:5;8712:49;8702:77;;8775:1;8772;8765:12;8702:77;8635:150;:::o;8791:167::-;8851:5;8889:6;8876:20;8867:29;;8905:47;8946:5;8905:47;:::i;:::-;8791:167;;;;:::o;8964:357::-;9037:6;9086:2;9074:9;9065:7;9061:23;9057:32;9054:119;;;9092:79;;:::i;:::-;9054:119;9212:1;9237:67;9296:7;9287:6;9276:9;9272:22;9237:67;:::i;:::-;9227:77;;9183:131;8964:357;;;;:::o;9327:169::-;9411:11;9445:6;9440:3;9433:19;9485:4;9480:3;9476:14;9461:29;;9327:169;;;;:::o;9502:246::-;9642:34;9638:1;9630:6;9626:14;9619:58;9711:29;9706:2;9698:6;9694:15;9687:54;9502:246;:::o;9754:366::-;9896:3;9917:67;9981:2;9976:3;9917:67;:::i;:::-;9910:74;;9993:93;10082:3;9993:93;:::i;:::-;10111:2;10106:3;10102:12;10095:19;;9754:366;;;:::o;10126:419::-;10292:4;10330:2;10319:9;10315:18;10307:26;;10379:9;10373:4;10369:20;10365:1;10354:9;10350:17;10343:47;10407:131;10533:4;10407:131;:::i;:::-;10399:139;;10126:419;;;:::o;10551:251::-;10691:34;10687:1;10679:6;10675:14;10668:58;10760:34;10755:2;10747:6;10743:15;10736:59;10551:251;:::o;10808:366::-;10950:3;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11047:93;11136:3;11047:93;:::i;:::-;11165:2;11160:3;11156:12;11149:19;;10808:366;;;:::o;11180:419::-;11346:4;11384:2;11373:9;11369:18;11361:26;;11433:9;11427:4;11423:20;11419:1;11408:9;11404:17;11397:47;11461:131;11587:4;11461:131;:::i;:::-;11453:139;;11180:419;;;:::o;11605:235::-;11745:34;11741:1;11733:6;11729:14;11722:58;11814:18;11809:2;11801:6;11797:15;11790:43;11605:235;:::o;11846:366::-;11988:3;12009:67;12073:2;12068:3;12009:67;:::i;:::-;12002:74;;12085:93;12174:3;12085:93;:::i;:::-;12203:2;12198:3;12194:12;12187:19;;11846:366;;;:::o;12218:419::-;12384:4;12422:2;12411:9;12407:18;12399:26;;12471:9;12465:4;12461:20;12457:1;12446:9;12442:17;12435:47;12499:131;12625:4;12499:131;:::i;:::-;12491:139;;12218:419;;;:::o;12643:180::-;12691:77;12688:1;12681:88;12788:4;12785:1;12778:15;12812:4;12809:1;12802:15;12829:180;12877:77;12874:1;12867:88;12974:4;12971:1;12964:15;12998:4;12995:1;12988:15;13015:305;13055:3;13074:20;13092:1;13074:20;:::i;:::-;13069:25;;13108:20;13126:1;13108:20;:::i;:::-;13103:25;;13262:1;13194:66;13190:74;13187:1;13184:81;13181:107;;;13268:18;;:::i;:::-;13181:107;13312:1;13309;13305:9;13298:16;;13015:305;;;;:::o;13326:348::-;13366:7;13389:20;13407:1;13389:20;:::i;:::-;13384:25;;13423:20;13441:1;13423:20;:::i;:::-;13418:25;;13611:1;13543:66;13539:74;13536:1;13533:81;13528:1;13521:9;13514:17;13510:105;13507:131;;;13618:18;;:::i;:::-;13507:131;13666:1;13663;13659:9;13648:20;;13326:348;;;;:::o;13680:180::-;13728:77;13725:1;13718:88;13825:4;13822:1;13815:15;13849:4;13846:1;13839:15;13866:185;13906:1;13923:20;13941:1;13923:20;:::i;:::-;13918:25;;13957:20;13975:1;13957:20;:::i;:::-;13952:25;;13996:1;13986:35;;14001:18;;:::i;:::-;13986:35;14043:1;14040;14036:9;14031:14;;13866:185;;;;:::o;14057:191::-;14097:4;14117:20;14135:1;14117:20;:::i;:::-;14112:25;;14151:20;14169:1;14151:20;:::i;:::-;14146:25;;14190:1;14187;14184:8;14181:34;;;14195:18;;:::i;:::-;14181:34;14240:1;14237;14233:9;14225:17;;14057:191;;;;:::o;14254:233::-;14293:3;14316:24;14334:5;14316:24;:::i;:::-;14307:33;;14362:66;14355:5;14352:77;14349:103;;;14432:18;;:::i;:::-;14349:103;14479:1;14472:5;14468:13;14461:20;;14254:233;;;:::o;14493:229::-;14633:34;14629:1;14621:6;14617:14;14610:58;14702:12;14697:2;14689:6;14685:15;14678:37;14493:229;:::o;14728:366::-;14870:3;14891:67;14955:2;14950:3;14891:67;:::i;:::-;14884:74;;14967:93;15056:3;14967:93;:::i;:::-;15085:2;15080:3;15076:12;15069:19;;14728:366;;;:::o;15100:419::-;15266:4;15304:2;15293:9;15289:18;15281:26;;15353:9;15347:4;15343:20;15339:1;15328:9;15324:17;15317:47;15381:131;15507:4;15381:131;:::i;:::-;15373:139;;15100:419;;;:::o;15525:221::-;15665:34;15661:1;15653:6;15649:14;15642:58;15734:4;15729:2;15721:6;15717:15;15710:29;15525:221;:::o;15752:366::-;15894:3;15915:67;15979:2;15974:3;15915:67;:::i;:::-;15908:74;;15991:93;16080:3;15991:93;:::i;:::-;16109:2;16104:3;16100:12;16093:19;;15752:366;;;:::o;16124:419::-;16290:4;16328:2;16317:9;16313:18;16305:26;;16377:9;16371:4;16367:20;16363:1;16352:9;16348:17;16341:47;16405:131;16531:4;16405:131;:::i;:::-;16397:139;;16124:419;;;:::o;16549:231::-;16689:34;16685:1;16677:6;16673:14;16666:58;16758:14;16753:2;16745:6;16741:15;16734:39;16549:231;:::o;16786:366::-;16928:3;16949:67;17013:2;17008:3;16949:67;:::i;:::-;16942:74;;17025:93;17114:3;17025:93;:::i;:::-;17143:2;17138:3;17134:12;17127:19;;16786:366;;;:::o;17158:419::-;17324:4;17362:2;17351:9;17347:18;17339:26;;17411:9;17405:4;17401:20;17397:1;17386:9;17382:17;17375:47;17439:131;17565:4;17439:131;:::i;:::-;17431:139;;17158:419;;;:::o;17583:245::-;17723:34;17719:1;17711:6;17707:14;17700:58;17792:28;17787:2;17779:6;17775:15;17768:53;17583:245;:::o;17834:366::-;17976:3;17997:67;18061:2;18056:3;17997:67;:::i;:::-;17990:74;;18073:93;18162:3;18073:93;:::i;:::-;18191:2;18186:3;18182:12;18175:19;;17834:366;;;:::o;18206:419::-;18372:4;18410:2;18399:9;18395:18;18387:26;;18459:9;18453:4;18449:20;18445:1;18434:9;18430:17;18423:47;18487:131;18613:4;18487:131;:::i;:::-;18479:139;;18206:419;;;:::o;18631:332::-;18752:4;18790:2;18779:9;18775:18;18767:26;;18803:71;18871:1;18860:9;18856:17;18847:6;18803:71;:::i;:::-;18884:72;18952:2;18941:9;18937:18;18928:6;18884:72;:::i;:::-;18631:332;;;;;:::o;18969:236::-;19109:34;19105:1;19097:6;19093:14;19086:58;19178:19;19173:2;19165:6;19161:15;19154:44;18969:236;:::o;19211:366::-;19353:3;19374:67;19438:2;19433:3;19374:67;:::i;:::-;19367:74;;19450:93;19539:3;19450:93;:::i;:::-;19568:2;19563:3;19559:12;19552:19;;19211:366;;;:::o;19583:419::-;19749:4;19787:2;19776:9;19772:18;19764:26;;19836:9;19830:4;19826:20;19822:1;19811:9;19807:17;19800:47;19864:131;19990:4;19864:131;:::i;:::-;19856:139;;19583:419;;;:::o;20008:236::-;20148:34;20144:1;20136:6;20132:14;20125:58;20217:19;20212:2;20204:6;20200:15;20193:44;20008:236;:::o;20250:366::-;20392:3;20413:67;20477:2;20472:3;20413:67;:::i;:::-;20406:74;;20489:93;20578:3;20489:93;:::i;:::-;20607:2;20602:3;20598:12;20591:19;;20250:366;;;:::o;20622:419::-;20788:4;20826:2;20815:9;20811:18;20803:26;;20875:9;20869:4;20865:20;20861:1;20850:9;20846:17;20839:47;20903:131;21029:4;20903:131;:::i;:::-;20895:139;;20622:419;;;:::o;21047:229::-;21187:34;21183:1;21175:6;21171:14;21164:58;21256:12;21251:2;21243:6;21239:15;21232:37;21047:229;:::o;21282:366::-;21424:3;21445:67;21509:2;21504:3;21445:67;:::i;:::-;21438:74;;21521:93;21610:3;21521:93;:::i;:::-;21639:2;21634:3;21630:12;21623:19;;21282:366;;;:::o;21654:419::-;21820:4;21858:2;21847:9;21843:18;21835:26;;21907:9;21901:4;21897:20;21893:1;21882:9;21878:17;21871:47;21935:131;22061:4;21935:131;:::i;:::-;21927:139;;21654:419;;;:::o;22079:225::-;22219:34;22215:1;22207:6;22203:14;22196:58;22288:8;22283:2;22275:6;22271:15;22264:33;22079:225;:::o;22310:366::-;22452:3;22473:67;22537:2;22532:3;22473:67;:::i;:::-;22466:74;;22549:93;22638:3;22549:93;:::i;:::-;22667:2;22662:3;22658:12;22651:19;;22310:366;;;:::o;22682:419::-;22848:4;22886:2;22875:9;22871:18;22863:26;;22935:9;22929:4;22925:20;22921:1;22910:9;22906:17;22899:47;22963:131;23089:4;22963:131;:::i;:::-;22955:139;;22682:419;;;:::o;23107:182::-;23247:34;23243:1;23235:6;23231:14;23224:58;23107:182;:::o;23295:366::-;23437:3;23458:67;23522:2;23517:3;23458:67;:::i;:::-;23451:74;;23534:93;23623:3;23534:93;:::i;:::-;23652:2;23647:3;23643:12;23636:19;;23295:366;;;:::o;23667:419::-;23833:4;23871:2;23860:9;23856:18;23848:26;;23920:9;23914:4;23910:20;23906:1;23895:9;23891:17;23884:47;23948:131;24074:4;23948:131;:::i;:::-;23940:139;;23667:419;;;:::o;24092:181::-;24232:33;24228:1;24220:6;24216:14;24209:57;24092:181;:::o;24279:366::-;24421:3;24442:67;24506:2;24501:3;24442:67;:::i;:::-;24435:74;;24518:93;24607:3;24518:93;:::i;:::-;24636:2;24631:3;24627:12;24620:19;;24279:366;;;:::o;24651:419::-;24817:4;24855:2;24844:9;24840:18;24832:26;;24904:9;24898:4;24894:20;24890:1;24879:9;24875:17;24868:47;24932:131;25058:4;24932:131;:::i;:::-;24924:139;;24651:419;;;:::o;25076:442::-;25225:4;25263:2;25252:9;25248:18;25240:26;;25276:71;25344:1;25333:9;25329:17;25320:6;25276:71;:::i;:::-;25357:72;25425:2;25414:9;25410:18;25401:6;25357:72;:::i;:::-;25439;25507:2;25496:9;25492:18;25483:6;25439:72;:::i;:::-;25076:442;;;;;;:::o;25524:116::-;25594:21;25609:5;25594:21;:::i;:::-;25587:5;25584:32;25574:60;;25630:1;25627;25620:12;25574:60;25524:116;:::o;25646:137::-;25700:5;25731:6;25725:13;25716:22;;25747:30;25771:5;25747:30;:::i;:::-;25646:137;;;;:::o;25789:345::-;25856:6;25905:2;25893:9;25884:7;25880:23;25876:32;25873:119;;;25911:79;;:::i;:::-;25873:119;26031:1;26056:61;26109:7;26100:6;26089:9;26085:22;26056:61;:::i;:::-;26046:71;;26002:125;25789:345;;;;:::o;26140:229::-;26280:34;26276:1;26268:6;26264:14;26257:58;26349:12;26344:2;26336:6;26332:15;26325:37;26140:229;:::o;26375:366::-;26517:3;26538:67;26602:2;26597:3;26538:67;:::i;:::-;26531:74;;26614:93;26703:3;26614:93;:::i;:::-;26732:2;26727:3;26723:12;26716:19;;26375:366;;;:::o;26747:419::-;26913:4;26951:2;26940:9;26936:18;26928:26;;27000:9;26994:4;26990:20;26986:1;26975:9;26971:17;26964:47;27028:131;27154:4;27028:131;:::i;:::-;27020:139;;26747:419;;;:::o;27172:225::-;27312:34;27308:1;27300:6;27296:14;27289:58;27381:8;27376:2;27368:6;27364:15;27357:33;27172:225;:::o;27403:366::-;27545:3;27566:67;27630:2;27625:3;27566:67;:::i;:::-;27559:74;;27642:93;27731:3;27642:93;:::i;:::-;27760:2;27755:3;27751:12;27744:19;;27403:366;;;:::o;27775:419::-;27941:4;27979:2;27968:9;27964:18;27956:26;;28028:9;28022:4;28018:20;28014:1;28003:9;27999:17;27992:47;28056:131;28182:4;28056:131;:::i;:::-;28048:139;;27775:419;;;:::o;28200:98::-;28251:6;28285:5;28279:12;28269:22;;28200:98;;;:::o;28304:147::-;28405:11;28442:3;28427:18;;28304:147;;;;:::o;28457:307::-;28525:1;28535:113;28549:6;28546:1;28543:13;28535:113;;;28634:1;28629:3;28625:11;28619:18;28615:1;28610:3;28606:11;28599:39;28571:2;28568:1;28564:10;28559:15;;28535:113;;;28666:6;28663:1;28660:13;28657:101;;;28746:1;28737:6;28732:3;28728:16;28721:27;28657:101;28506:258;28457:307;;;:::o;28770:373::-;28874:3;28902:38;28934:5;28902:38;:::i;:::-;28956:88;29037:6;29032:3;28956:88;:::i;:::-;28949:95;;29053:52;29098:6;29093:3;29086:4;29079:5;29075:16;29053:52;:::i;:::-;29130:6;29125:3;29121:16;29114:23;;28878:265;28770:373;;;;:::o;29149:271::-;29279:3;29301:93;29390:3;29381:6;29301:93;:::i;:::-;29294:100;;29411:3;29404:10;;29149:271;;;;:::o;29426:179::-;29566:31;29562:1;29554:6;29550:14;29543:55;29426:179;:::o;29611:366::-;29753:3;29774:67;29838:2;29833:3;29774:67;:::i;:::-;29767:74;;29850:93;29939:3;29850:93;:::i;:::-;29968:2;29963:3;29959:12;29952:19;;29611:366;;;:::o;29983:419::-;30149:4;30187:2;30176:9;30172:18;30164:26;;30236:9;30230:4;30226:20;30222:1;30211:9;30207:17;30200:47;30264:131;30390:4;30264:131;:::i;:::-;30256:139;;29983:419;;;:::o;30408:99::-;30460:6;30494:5;30488:12;30478:22;;30408:99;;;:::o;30513:102::-;30554:6;30605:2;30601:7;30596:2;30589:5;30585:14;30581:28;30571:38;;30513:102;;;:::o;30621:364::-;30709:3;30737:39;30770:5;30737:39;:::i;:::-;30792:71;30856:6;30851:3;30792:71;:::i;:::-;30785:78;;30872:52;30917:6;30912:3;30905:4;30898:5;30894:16;30872:52;:::i;:::-;30949:29;30971:6;30949:29;:::i;:::-;30944:3;30940:39;30933:46;;30713:272;30621:364;;;;:::o;30991:313::-;31104:4;31142:2;31131:9;31127:18;31119:26;;31191:9;31185:4;31181:20;31177:1;31166:9;31162:17;31155:47;31219:78;31292:4;31283:6;31219:78;:::i;:::-;31211:86;;30991:313;;;;:::o
Swarm Source
ipfs://45279fad08269b627c23542bb7d150e9c1b60470c6b3616b4b9d2f458476f4a2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.055019 | 2,287,819.0113 | $125,874.29 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.