More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 205 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 14806511 | 816 days ago | IN | 0 ETH | 0.00323877 | ||||
Release | 14613615 | 847 days ago | IN | 0 ETH | 0.00341723 | ||||
Release | 14385052 | 883 days ago | IN | 0 ETH | 0.00253372 | ||||
Withdraw | 14140268 | 921 days ago | IN | 0 ETH | 0.00536645 | ||||
Revoke | 14131243 | 922 days ago | IN | 0 ETH | 0.00689528 | ||||
Revoke | 14131242 | 922 days ago | IN | 0 ETH | 0.00644309 | ||||
Revoke | 14131241 | 922 days ago | IN | 0 ETH | 0.00703413 | ||||
Revoke | 14131241 | 922 days ago | IN | 0 ETH | 0.00703413 | ||||
Revoke | 14131236 | 922 days ago | IN | 0 ETH | 0.00583463 | ||||
Revoke | 14131235 | 922 days ago | IN | 0 ETH | 0.00601225 | ||||
Revoke | 14131234 | 922 days ago | IN | 0 ETH | 0.00607148 | ||||
Revoke | 14131234 | 922 days ago | IN | 0 ETH | 0.00607148 | ||||
Revoke | 14131234 | 922 days ago | IN | 0 ETH | 0.00607148 | ||||
Revoke | 14131232 | 922 days ago | IN | 0 ETH | 0.00490174 | ||||
Revoke | 14131227 | 922 days ago | IN | 0 ETH | 0.00555238 | ||||
Revoke | 14131224 | 922 days ago | IN | 0 ETH | 0.00701552 | ||||
Revoke | 14131223 | 922 days ago | IN | 0 ETH | 0.00656153 | ||||
Revoke | 14131222 | 922 days ago | IN | 0 ETH | 0.00647995 | ||||
Revoke | 14131220 | 922 days ago | IN | 0 ETH | 0.00654276 | ||||
Revoke | 14131215 | 922 days ago | IN | 0 ETH | 0.00700544 | ||||
Revoke | 14131213 | 922 days ago | IN | 0 ETH | 0.00653387 | ||||
Revoke | 14131211 | 922 days ago | IN | 0 ETH | 0.00677466 | ||||
Revoke | 14131211 | 922 days ago | IN | 0 ETH | 0.00677466 | ||||
Revoke | 14131209 | 922 days ago | IN | 0 ETH | 0.00662371 | ||||
Revoke | 14131209 | 922 days ago | IN | 0 ETH | 0.00662371 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EarthFundVesting
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-16 */ // contracts/EarthFundVesting.sol // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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)); } } /** * @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"); } } } /** * @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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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; } } /** * @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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @title EarthFundVesting */ contract EarthFundVesting is Ownable, ReentrancyGuard{ using SafeMath for uint256; using SafeERC20 for IERC20; struct VestingSchedule{ bool initialized; // beneficiary of tokens after they are released address beneficiary; // cliff period in seconds uint256 cliff; // start time of the vesting period uint256 start; // duration of the vesting period in seconds uint256 duration; // duration of a slice period for the vesting in seconds uint256 slicePeriodSeconds; // whether or not the vesting is revocable bool revocable; // total amount of tokens to be released at the end of the vesting uint256 amountTotal; // amount of tokens released uint256 released; // whether or not the vesting has been revoked bool revoked; } event VestingScheduleCreated( address beneficiary, uint256 start, uint256 cliff, uint256 duration, uint256 slicePeriodSeconds, bool revocable, uint256 amount ); event Revoked(bytes32 vestingScheduleId); event Withdrawn(uint256 amount); event Released(bytes32 vestingScheduleId, uint256 amount); // address of the ERC20 token IERC20 immutable private _token; bytes32[] private vestingSchedulesIds; mapping(bytes32 => VestingSchedule) private vestingSchedules; uint256 private vestingSchedulesTotalAmount; mapping(address => uint256) private holdersVestingCount; /** * @dev Reverts if no vesting schedule matches the passed identifier. */ modifier onlyIfVestingScheduleExists(bytes32 vestingScheduleId) { require(vestingSchedules[vestingScheduleId].initialized == true); _; } /** * @dev Reverts if the vesting schedule does not exist or has been revoked. */ modifier onlyIfVestingScheduleNotRevoked(bytes32 vestingScheduleId) { require(vestingSchedules[vestingScheduleId].initialized == true); require(vestingSchedules[vestingScheduleId].revoked == false); _; } /** * @dev Creates a vesting contract. * @param token_ address of the ERC20 token contract */ constructor(address token_) { require(token_ != address(0x0)); _token = IERC20(token_); } receive() external payable {} fallback() external payable {} /** * @dev Returns the number of vesting schedules associated to a beneficiary. * @return the number of vesting schedules */ function getVestingSchedulesCountByBeneficiary(address _beneficiary) external view returns(uint256){ return holdersVestingCount[_beneficiary]; } /** * @dev Returns the vesting schedule id at the given index. * @return the vesting id */ function getVestingIdAtIndex(uint256 index) external view returns(bytes32){ require(index < getVestingSchedulesCount(), "EarthFundVesting: index out of bounds"); return vestingSchedulesIds[index]; } /** * @notice Returns the vesting schedule information for a given holder and index. * @return the vesting schedule structure information */ function getVestingScheduleByAddressAndIndex(address holder, uint256 index) external view returns(VestingSchedule memory){ return getVestingSchedule(computeVestingScheduleIdForAddressAndIndex(holder, index)); } /** * @notice Returns the total amount of vesting schedules. * @return the total amount of vesting schedules */ function getVestingSchedulesTotalAmount() external view returns(uint256){ return vestingSchedulesTotalAmount; } /** * @dev Returns the address of the ERC20 token managed by the vesting contract. */ function getToken() external view returns(address){ return address(_token); } /** * @notice Creates a new vesting schedule for a beneficiary. * @param _beneficiary address of the beneficiary to whom vested tokens are transferred * @param _start start time of the vesting period * @param _cliff duration in seconds of the cliff in which tokens will begin to vest * @param _duration duration in seconds of the period in which the tokens will vest * @param _slicePeriodSeconds duration of a slice period for the vesting in seconds * @param _revocable whether the vesting is revocable or not * @param _amount total amount of tokens to be released at the end of the vesting */ function createVestingSchedule( address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, uint256 _slicePeriodSeconds, bool _revocable, uint256 _amount ) public onlyOwner{ require( this.getWithdrawableAmount() >= _amount, "EarthFundVesting: cannot create vesting schedule because not sufficient tokens" ); require(_duration > 0, "EarthFundVesting: duration must be > 0"); require(_amount > 0, "EarthFundVesting: amount must be > 0"); require(_slicePeriodSeconds >= 1, "EarthFundVesting: slicePeriodSeconds must be >= 1"); bytes32 vestingScheduleId = this.computeNextVestingScheduleIdForHolder(_beneficiary); uint256 cliff = _start.add(_cliff); vestingSchedules[vestingScheduleId] = VestingSchedule( true, _beneficiary, cliff, _start, _duration, _slicePeriodSeconds, _revocable, _amount, 0, false ); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.add(_amount); vestingSchedulesIds.push(vestingScheduleId); uint256 currentVestingCount = holdersVestingCount[_beneficiary]; holdersVestingCount[_beneficiary] = currentVestingCount.add(1); emit VestingScheduleCreated( _beneficiary, _start, _cliff, _duration, _slicePeriodSeconds, _revocable, _amount ); } /** * @notice Revokes the vesting schedule for given identifier. * @param vestingScheduleId the vesting schedule identifier */ function revoke(bytes32 vestingScheduleId) public onlyOwner onlyIfVestingScheduleNotRevoked(vestingScheduleId){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; require(vestingSchedule.revocable == true, "EarthFundVesting: vesting is not revocable"); uint256 vestedAmount = _computeReleasableAmount(vestingSchedule); if(vestedAmount > 0){ release(vestingScheduleId, vestedAmount); } uint256 unreleased = vestingSchedule.amountTotal.sub(vestingSchedule.released); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.sub(unreleased); vestingSchedule.revoked = true; emit Revoked(vestingScheduleId); } /** * @notice Withdraw the specified amount if possible. * @param amount the amount to withdraw */ function withdraw(uint256 amount) public nonReentrant onlyOwner{ require(this.getWithdrawableAmount() >= amount, "EarthFundVesting: not enough withdrawable funds"); _token.safeTransfer(owner(), amount); emit Withdrawn(amount); } /** * @notice Release vested amount of tokens. * @param vestingScheduleId the vesting schedule identifier * @param amount the amount to release */ function release( bytes32 vestingScheduleId, uint256 amount ) public nonReentrant onlyIfVestingScheduleNotRevoked(vestingScheduleId){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; bool isBeneficiary = msg.sender == vestingSchedule.beneficiary; bool isOwner = msg.sender == owner(); require( isBeneficiary || isOwner, "EarthFundVesting: only beneficiary and owner can release vested tokens" ); uint256 vestedAmount = _computeReleasableAmount(vestingSchedule); require(vestedAmount >= amount, "EarthFundVesting: cannot release tokens, not enough vested tokens"); vestingSchedule.released = vestingSchedule.released.add(amount); address payable beneficiaryPayable = payable(vestingSchedule.beneficiary); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.sub(amount); _token.safeTransfer(beneficiaryPayable, amount); emit Released(vestingScheduleId, amount); } /** * @dev Returns the number of vesting schedules managed by this contract. * @return the number of vesting schedules */ function getVestingSchedulesCount() public view returns(uint256){ return vestingSchedulesIds.length; } /** * @notice Computes the vested amount of tokens for the given vesting schedule identifier. * @return the vested amount */ function computeReleasableAmount(bytes32 vestingScheduleId) public onlyIfVestingScheduleNotRevoked(vestingScheduleId) view returns(uint256){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; return _computeReleasableAmount(vestingSchedule); } /** * @notice Returns the vesting schedule information for a given identifier. * @return the vesting schedule structure information */ function getVestingSchedule(bytes32 vestingScheduleId) public view returns(VestingSchedule memory){ return vestingSchedules[vestingScheduleId]; } /** * @dev Returns the amount of tokens that can be withdrawn by the owner. * @return the amount of tokens */ function getWithdrawableAmount() public view returns(uint256){ return _token.balanceOf(address(this)).sub(vestingSchedulesTotalAmount); } /** * @dev Computes the next vesting schedule identifier for a given holder address. */ function computeNextVestingScheduleIdForHolder(address holder) public view returns(bytes32){ return computeVestingScheduleIdForAddressAndIndex(holder, holdersVestingCount[holder]); } /** * @dev Returns the last vesting schedule for a given holder address. */ function getLastVestingScheduleForHolder(address holder) public view returns(VestingSchedule memory){ return vestingSchedules[computeVestingScheduleIdForAddressAndIndex(holder, holdersVestingCount[holder] - 1)]; } /** * @dev Computes the vesting schedule identifier for an address and an index. */ function computeVestingScheduleIdForAddressAndIndex(address holder, uint256 index) public pure returns(bytes32){ return keccak256(abi.encodePacked(holder, index)); } /** * @dev Computes the releasable amount of tokens for a vesting schedule. * @return the amount of releasable tokens */ function _computeReleasableAmount(VestingSchedule memory vestingSchedule) internal view returns(uint256){ uint256 currentTime = getCurrentTime(); if ((currentTime < vestingSchedule.cliff) || vestingSchedule.revoked == true) { return 0; } else if (currentTime >= vestingSchedule.start.add(vestingSchedule.duration)) { return vestingSchedule.amountTotal.sub(vestingSchedule.released); } else { uint256 timeFromStart = currentTime.sub(vestingSchedule.start); uint256 secondsPerSlice = vestingSchedule.slicePeriodSeconds; uint256 vestedSlicePeriods = timeFromStart.div(secondsPerSlice); uint256 vestedSeconds = vestedSlicePeriods.mul(secondsPerSlice); uint256 vestedAmount = vestingSchedule.amountTotal.mul(vestedSeconds).div(vestingSchedule.duration); vestedAmount = vestedAmount.sub(vestingSchedule.released); return vestedAmount; } } function getCurrentTime() internal virtual view returns(uint256){ return block.timestamp; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"indexed":false,"internalType":"bool","name":"revocable","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestingScheduleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"computeNextVestingScheduleIdForHolder","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"computeReleasableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"computeVestingScheduleIdForAddressAndIndex","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_cliff","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getLastVestingScheduleForHolder","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct EarthFundVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getVestingIdAtIndex","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"getVestingSchedule","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct EarthFundVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getVestingScheduleByAddressAndIndex","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct EarthFundVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingSchedulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getVestingSchedulesCountByBeneficiary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingSchedulesTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200350c3803806200350c8339818101604052810190620000379190620001ba565b620000576200004b620000d760201b60201c565b620000df60201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200009957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050506200023f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001b48162000225565b92915050565b600060208284031215620001d357620001d262000220565b5b6000620001e384828501620001a3565b91505092915050565b6000620001f98262000200565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b6200023081620001ec565b81146200023c57600080fd5b50565b60805160601c6132996200027360003960008181610a0d01528181610bc901528181610ff101526112d201526132996000f3fe6080604052600436106101185760003560e01c80638af104da116100a0578063ea1bb3d511610064578063ea1bb3d5146103a7578063f2fde38b146103e4578063f51321d71461040d578063f7c469f01461044a578063f9079b37146104875761011f565b80638af104da146102ae5780638da5cb5b146102eb57806390be10cc146103165780639ef346b414610341578063b75c7dc61461037e5761011f565b806348deb471116100e757806348deb471146101c95780635a7bb69a146101f457806366afd8ef14610231578063715018a61461025a5780637e913dc6146102715761011f565b8063130836171461012157806317e289e91461014c57806321df0da7146101755780632e1a7d4d146101a05761011f565b3661011f57005b005b34801561012d57600080fd5b506101366104c4565b6040516101439190612aa1565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e91906121ac565b6104d1565b005b34801561018157600080fd5b5061018a610a09565b604051610197919061278c565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190612315565b610a31565b005b3480156101d557600080fd5b506101de610c4e565b6040516101eb9190612aa1565b60405180910390f35b34801561020057600080fd5b5061021b6004803603810190610216919061213f565b610c58565b6040516102289190612aa1565b60405180910390f35b34801561023d57600080fd5b50610258600480360381019061025391906122d5565b610ca1565b005b34801561026657600080fd5b5061026f61107f565b005b34801561027d57600080fd5b506102986004803603810190610293919061213f565b611107565b6040516102a59190612a85565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061216c565b61126c565b6040516102e2919061283f565b60405180910390f35b3480156102f757600080fd5b5061030061129f565b60405161030d919061278c565b60405180910390f35b34801561032257600080fd5b5061032b6112c8565b6040516103389190612aa1565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061227b565b61138c565b6040516103759190612a85565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a0919061227b565b61149d565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061227b565b611796565b6040516103db9190612aa1565b60405180910390f35b3480156103f057600080fd5b5061040b6004803603810190610406919061213f565b611919565b005b34801561041957600080fd5b50610434600480360381019061042f919061216c565b611a11565b6040516104419190612a85565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c919061213f565b611a33565b60405161047e919061283f565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612315565b611a85565b6040516104bb919061283f565b60405180910390f35b6000600280549050905090565b6104d9611af6565b73ffffffffffffffffffffffffffffffffffffffff166104f761129f565b73ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610544906129a5565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059457600080fd5b505afa1580156105a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cc9190612342565b101561060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906129e5565b60405180910390fd5b60008411610650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064790612965565b60405180910390fd5b60008111610693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068a90612a45565b60405180910390fd5b60018310156106d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ce90612985565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663f7c469f0896040518263ffffffff1660e01b8152600401610712919061278c565b60206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076291906122a8565b905060006107798789611afe90919063ffffffff16565b90506040518061014001604052806001151581526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001828152602001898152602001878152602001868152602001851515815260200184815260200160008152602001600015158152506003600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548160ff02191690831515021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff0219169083151502179055509050506108f083600454611afe90919063ffffffff16565b60048190555060028290806001815401808255809150506001900390600052602060002001600090919091909150556000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610977600182611afe90919063ffffffff16565b600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa2e4c9d32cfb4d2d0861e5134280231f9b7dadead6e7008a17555e074369beb18a8a8a8a8a8a8a6040516109f597969594939291906127d0565b60405180910390a150505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b60026001541415610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90612a25565b60405180910390fd5b6002600181905550610a87611af6565b73ffffffffffffffffffffffffffffffffffffffff16610aa561129f565b73ffffffffffffffffffffffffffffffffffffffff1614610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906129a5565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190612342565b1015610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290612905565b60405180910390fd5b610c0d610bc661129f565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b149092919063ffffffff16565b7f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b5681604051610c3c9190612aa1565b60405180910390a16001808190555050565b6000600454905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026001541415610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90612a25565b60405180910390fd5b600260018190555081600115156003600083815260200190815260200160002060000160009054906101000a900460ff16151514610d2457600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff16151514610d5857600080fd5b600060036000858152602001908152602001600020905060008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490506000610dd061129f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508180610e095750805b610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90612945565b60405180910390fd5b6000610f4284604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b905085811015610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906128e5565b60405180910390fd5b610f9e868560070154611afe90919063ffffffff16565b846007018190555060008460000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610fe487600454611cc290919063ffffffff16565b60048190555061103581887f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b149092919063ffffffff16565b7f22f206afbb58bbf5e729b2561506cabe613d001ea92899e227b3c2891cbcddc9888860405161106692919061285a565b60405180910390a1505050505050600180819055505050565b611087611af6565b73ffffffffffffffffffffffffffffffffffffffff166110a561129f565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f2906129a5565b60405180910390fd5b6111056000611cd8565b565b61110f61203d565b60036000611168846001600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111639190612bcf565b61126c565b8152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b60008282604051602001611281929190612749565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006113876004547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611329919061278c565b60206040518083038186803b15801561134157600080fd5b505afa158015611355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113799190612342565b611cc290919063ffffffff16565b905090565b61139461203d565b60036000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b6114a5611af6565b73ffffffffffffffffffffffffffffffffffffffff166114c361129f565b73ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906129a5565b60405180910390fd5b80600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461154e57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461158257600080fd5b6000600360008481526020019081526020016000209050600115158160050160009054906101000a900460ff161515146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890612a65565b60405180910390fd5b60006116eb82604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b90506000811115611701576117008482610ca1565b5b600061171e83600701548460060154611cc290919063ffffffff16565b905061173581600454611cc290919063ffffffff16565b60048190555060018360080160006101000a81548160ff0219169083151502179055507fe5af7daed5ab2a2dc5f98d53619f05089c0c14d11a6621f6b906a2366c9a7ab385604051611787919061283f565b60405180910390a15050505050565b600081600115156003600083815260200190815260200160002060000160009054906101000a900460ff161515146117cd57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461180157600080fd5b600060036000858152602001908152602001600020905061191081604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b92505050919050565b611921611af6565b73ffffffffffffffffffffffffffffffffffffffff1661193f61129f565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c906129a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc906128c5565b60405180910390fd5b611a0e81611cd8565b50565b611a1961203d565b611a2b611a26848461126c565b61138c565b905092915050565b6000611a7e82600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126c565b9050919050565b6000611a8f6104c4565b8210611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac7906128a5565b60405180910390fd5b60028281548110611ae457611ae3612d14565b5b90600052602060002001549050919050565b600033905090565b60008183611b0c9190612aee565b905092915050565b611b958363a9059cbb60e01b8484604051602401611b339291906127a7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d9c565b505050565b600080611ba5611e63565b90508260400151811080611bc25750600115158361012001511515145b15611bd1576000915050611cbd565b611bec83608001518460600151611afe90919063ffffffff16565b8110611c1657611c0e8361010001518460e00151611cc290919063ffffffff16565b915050611cbd565b6000611c2f846060015183611cc290919063ffffffff16565b905060008460a0015190506000611c4f8284611e6b90919063ffffffff16565b90506000611c668383611e8190919063ffffffff16565b90506000611c978860800151611c89848b60e00151611e8190919063ffffffff16565b611e6b90919063ffffffff16565b9050611cb188610100015182611cc290919063ffffffff16565b90508096505050505050505b919050565b60008183611cd09190612bcf565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611dfe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611e979092919063ffffffff16565b9050600081511115611e5e5780806020019051810190611e1e919061224e565b611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5490612a05565b60405180910390fd5b5b505050565b600042905090565b60008183611e799190612b44565b905092915050565b60008183611e8f9190612b75565b905092915050565b6060611ea68484600085611eaf565b90509392505050565b606082471015611ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eeb90612925565b60405180910390fd5b611efd85611fc3565b611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f33906129c5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611f659190612775565b60006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5091509150611fb7828286611fd6565b92505050949350505050565b600080823b905060008111915050919050565b60608315611fe657829050612036565b600083511115611ff95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d9190612883565b60405180910390fd5b9392505050565b604051806101400160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000151581525090565b6000813590506120bb81613207565b92915050565b6000813590506120d08161321e565b92915050565b6000815190506120e58161321e565b92915050565b6000813590506120fa81613235565b92915050565b60008151905061210f81613235565b92915050565b6000813590506121248161324c565b92915050565b6000815190506121398161324c565b92915050565b60006020828403121561215557612154612d43565b5b6000612163848285016120ac565b91505092915050565b6000806040838503121561218357612182612d43565b5b6000612191858286016120ac565b92505060206121a285828601612115565b9150509250929050565b600080600080600080600060e0888a0312156121cb576121ca612d43565b5b60006121d98a828b016120ac565b97505060206121ea8a828b01612115565b96505060406121fb8a828b01612115565b955050606061220c8a828b01612115565b945050608061221d8a828b01612115565b93505060a061222e8a828b016120c1565b92505060c061223f8a828b01612115565b91505092959891949750929550565b60006020828403121561226457612263612d43565b5b6000612272848285016120d6565b91505092915050565b60006020828403121561229157612290612d43565b5b600061229f848285016120eb565b91505092915050565b6000602082840312156122be576122bd612d43565b5b60006122cc84828501612100565b91505092915050565b600080604083850312156122ec576122eb612d43565b5b60006122fa858286016120eb565b925050602061230b85828601612115565b9150509250929050565b60006020828403121561232b5761232a612d43565b5b600061233984828501612115565b91505092915050565b60006020828403121561235857612357612d43565b5b60006123668482850161212a565b91505092915050565b61237881612c03565b82525050565b61238781612c03565b82525050565b61239e61239982612c03565b612c88565b82525050565b6123ad81612c15565b82525050565b6123bc81612c15565b82525050565b6123cb81612c21565b82525050565b60006123dc82612abc565b6123e68185612ad2565b93506123f6818560208601612c55565b80840191505092915050565b600061240d82612ac7565b6124178185612add565b9350612427818560208601612c55565b61243081612d48565b840191505092915050565b6000612448602583612add565b915061245382612d66565b604082019050919050565b600061246b602683612add565b915061247682612db5565b604082019050919050565b600061248e604183612add565b915061249982612e04565b606082019050919050565b60006124b1602f83612add565b91506124bc82612e79565b604082019050919050565b60006124d4602683612add565b91506124df82612ec8565b604082019050919050565b60006124f7604683612add565b915061250282612f17565b606082019050919050565b600061251a602683612add565b915061252582612f8c565b604082019050919050565b600061253d603183612add565b915061254882612fdb565b604082019050919050565b6000612560602083612add565b915061256b8261302a565b602082019050919050565b6000612583601d83612add565b915061258e82613053565b602082019050919050565b60006125a6604e83612add565b91506125b18261307c565b606082019050919050565b60006125c9602a83612add565b91506125d4826130f1565b604082019050919050565b60006125ec601f83612add565b91506125f782613140565b602082019050919050565b600061260f602483612add565b915061261a82613169565b604082019050919050565b6000612632602a83612add565b915061263d826131b8565b604082019050919050565b6101408201600082015161265f60008501826123a4565b506020820151612672602085018261236f565b5060408201516126856040850182612714565b5060608201516126986060850182612714565b5060808201516126ab6080850182612714565b5060a08201516126be60a0850182612714565b5060c08201516126d160c08501826123a4565b5060e08201516126e460e0850182612714565b506101008201516126f9610100850182612714565b5061012082015161270e6101208501826123a4565b50505050565b61271d81612c4b565b82525050565b61272c81612c4b565b82525050565b61274361273e82612c4b565b612cac565b82525050565b6000612755828561238d565b6014820191506127658284612732565b6020820191508190509392505050565b600061278182846123d1565b915081905092915050565b60006020820190506127a1600083018461237e565b92915050565b60006040820190506127bc600083018561237e565b6127c96020830184612723565b9392505050565b600060e0820190506127e5600083018a61237e565b6127f26020830189612723565b6127ff6040830188612723565b61280c6060830187612723565b6128196080830186612723565b61282660a08301856123b3565b61283360c0830184612723565b98975050505050505050565b600060208201905061285460008301846123c2565b92915050565b600060408201905061286f60008301856123c2565b61287c6020830184612723565b9392505050565b6000602082019050818103600083015261289d8184612402565b905092915050565b600060208201905081810360008301526128be8161243b565b9050919050565b600060208201905081810360008301526128de8161245e565b9050919050565b600060208201905081810360008301526128fe81612481565b9050919050565b6000602082019050818103600083015261291e816124a4565b9050919050565b6000602082019050818103600083015261293e816124c7565b9050919050565b6000602082019050818103600083015261295e816124ea565b9050919050565b6000602082019050818103600083015261297e8161250d565b9050919050565b6000602082019050818103600083015261299e81612530565b9050919050565b600060208201905081810360008301526129be81612553565b9050919050565b600060208201905081810360008301526129de81612576565b9050919050565b600060208201905081810360008301526129fe81612599565b9050919050565b60006020820190508181036000830152612a1e816125bc565b9050919050565b60006020820190508181036000830152612a3e816125df565b9050919050565b60006020820190508181036000830152612a5e81612602565b9050919050565b60006020820190508181036000830152612a7e81612625565b9050919050565b600061014082019050612a9b6000830184612648565b92915050565b6000602082019050612ab66000830184612723565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612af982612c4b565b9150612b0483612c4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3957612b38612cb6565b5b828201905092915050565b6000612b4f82612c4b565b9150612b5a83612c4b565b925082612b6a57612b69612ce5565b5b828204905092915050565b6000612b8082612c4b565b9150612b8b83612c4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bc457612bc3612cb6565b5b828202905092915050565b6000612bda82612c4b565b9150612be583612c4b565b925082821015612bf857612bf7612cb6565b5b828203905092915050565b6000612c0e82612c2b565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612c73578082015181840152602081019050612c58565b83811115612c82576000848401525b50505050565b6000612c9382612c9a565b9050919050565b6000612ca582612d59565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456172746846756e6456657374696e673a20696e646578206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a2063616e6e6f742072656c6561736560008201527f20746f6b656e732c206e6f7420656e6f7567682076657374656420746f6b656e60208201527f7300000000000000000000000000000000000000000000000000000000000000604082015250565b7f456172746846756e6456657374696e673a206e6f7420656e6f7567682077697460008201527f686472617761626c652066756e64730000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a206f6e6c792062656e65666963696160008201527f727920616e64206f776e65722063616e2072656c65617365207665737465642060208201527f746f6b656e730000000000000000000000000000000000000000000000000000604082015250565b7f456172746846756e6456657374696e673a206475726174696f6e206d7573742060008201527f6265203e20300000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a20736c696365506572696f6453656360008201527f6f6e6473206d757374206265203e3d2031000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f456172746846756e6456657374696e673a2063616e6e6f74206372656174652060008201527f76657374696e67207363686564756c652062656361757365206e6f742073756660208201527f66696369656e7420746f6b656e73000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f456172746846756e6456657374696e673a20616d6f756e74206d75737420626560008201527f203e203000000000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a2076657374696e67206973206e6f7460008201527f207265766f6361626c6500000000000000000000000000000000000000000000602082015250565b61321081612c03565b811461321b57600080fd5b50565b61322781612c15565b811461323257600080fd5b50565b61323e81612c21565b811461324957600080fd5b50565b61325581612c4b565b811461326057600080fd5b5056fea26469706673582212200c5474413004ba8ff5973d8660c9040f6a422e2f68a47f623caa554efd742ec964736f6c634300080700330000000000000000000000009e04f519b094f5f8210441e285f603f4d2b50084
Deployed Bytecode
0x6080604052600436106101185760003560e01c80638af104da116100a0578063ea1bb3d511610064578063ea1bb3d5146103a7578063f2fde38b146103e4578063f51321d71461040d578063f7c469f01461044a578063f9079b37146104875761011f565b80638af104da146102ae5780638da5cb5b146102eb57806390be10cc146103165780639ef346b414610341578063b75c7dc61461037e5761011f565b806348deb471116100e757806348deb471146101c95780635a7bb69a146101f457806366afd8ef14610231578063715018a61461025a5780637e913dc6146102715761011f565b8063130836171461012157806317e289e91461014c57806321df0da7146101755780632e1a7d4d146101a05761011f565b3661011f57005b005b34801561012d57600080fd5b506101366104c4565b6040516101439190612aa1565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e91906121ac565b6104d1565b005b34801561018157600080fd5b5061018a610a09565b604051610197919061278c565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190612315565b610a31565b005b3480156101d557600080fd5b506101de610c4e565b6040516101eb9190612aa1565b60405180910390f35b34801561020057600080fd5b5061021b6004803603810190610216919061213f565b610c58565b6040516102289190612aa1565b60405180910390f35b34801561023d57600080fd5b50610258600480360381019061025391906122d5565b610ca1565b005b34801561026657600080fd5b5061026f61107f565b005b34801561027d57600080fd5b506102986004803603810190610293919061213f565b611107565b6040516102a59190612a85565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061216c565b61126c565b6040516102e2919061283f565b60405180910390f35b3480156102f757600080fd5b5061030061129f565b60405161030d919061278c565b60405180910390f35b34801561032257600080fd5b5061032b6112c8565b6040516103389190612aa1565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061227b565b61138c565b6040516103759190612a85565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a0919061227b565b61149d565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061227b565b611796565b6040516103db9190612aa1565b60405180910390f35b3480156103f057600080fd5b5061040b6004803603810190610406919061213f565b611919565b005b34801561041957600080fd5b50610434600480360381019061042f919061216c565b611a11565b6040516104419190612a85565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c919061213f565b611a33565b60405161047e919061283f565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612315565b611a85565b6040516104bb919061283f565b60405180910390f35b6000600280549050905090565b6104d9611af6565b73ffffffffffffffffffffffffffffffffffffffff166104f761129f565b73ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610544906129a5565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059457600080fd5b505afa1580156105a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cc9190612342565b101561060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906129e5565b60405180910390fd5b60008411610650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064790612965565b60405180910390fd5b60008111610693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068a90612a45565b60405180910390fd5b60018310156106d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ce90612985565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663f7c469f0896040518263ffffffff1660e01b8152600401610712919061278c565b60206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076291906122a8565b905060006107798789611afe90919063ffffffff16565b90506040518061014001604052806001151581526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001828152602001898152602001878152602001868152602001851515815260200184815260200160008152602001600015158152506003600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548160ff02191690831515021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff0219169083151502179055509050506108f083600454611afe90919063ffffffff16565b60048190555060028290806001815401808255809150506001900390600052602060002001600090919091909150556000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610977600182611afe90919063ffffffff16565b600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa2e4c9d32cfb4d2d0861e5134280231f9b7dadead6e7008a17555e074369beb18a8a8a8a8a8a8a6040516109f597969594939291906127d0565b60405180910390a150505050505050505050565b60007f0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b50084905090565b60026001541415610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90612a25565b60405180910390fd5b6002600181905550610a87611af6565b73ffffffffffffffffffffffffffffffffffffffff16610aa561129f565b73ffffffffffffffffffffffffffffffffffffffff1614610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906129a5565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190612342565b1015610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290612905565b60405180910390fd5b610c0d610bc661129f565b827f0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b5008473ffffffffffffffffffffffffffffffffffffffff16611b149092919063ffffffff16565b7f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b5681604051610c3c9190612aa1565b60405180910390a16001808190555050565b6000600454905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026001541415610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90612a25565b60405180910390fd5b600260018190555081600115156003600083815260200190815260200160002060000160009054906101000a900460ff16151514610d2457600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff16151514610d5857600080fd5b600060036000858152602001908152602001600020905060008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490506000610dd061129f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508180610e095750805b610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90612945565b60405180910390fd5b6000610f4284604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b905085811015610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906128e5565b60405180910390fd5b610f9e868560070154611afe90919063ffffffff16565b846007018190555060008460000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610fe487600454611cc290919063ffffffff16565b60048190555061103581887f0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b5008473ffffffffffffffffffffffffffffffffffffffff16611b149092919063ffffffff16565b7f22f206afbb58bbf5e729b2561506cabe613d001ea92899e227b3c2891cbcddc9888860405161106692919061285a565b60405180910390a1505050505050600180819055505050565b611087611af6565b73ffffffffffffffffffffffffffffffffffffffff166110a561129f565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f2906129a5565b60405180910390fd5b6111056000611cd8565b565b61110f61203d565b60036000611168846001600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111639190612bcf565b61126c565b8152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b60008282604051602001611281929190612749565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006113876004547f0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b5008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611329919061278c565b60206040518083038186803b15801561134157600080fd5b505afa158015611355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113799190612342565b611cc290919063ffffffff16565b905090565b61139461203d565b60036000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b6114a5611af6565b73ffffffffffffffffffffffffffffffffffffffff166114c361129f565b73ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906129a5565b60405180910390fd5b80600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461154e57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461158257600080fd5b6000600360008481526020019081526020016000209050600115158160050160009054906101000a900460ff161515146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890612a65565b60405180910390fd5b60006116eb82604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b90506000811115611701576117008482610ca1565b5b600061171e83600701548460060154611cc290919063ffffffff16565b905061173581600454611cc290919063ffffffff16565b60048190555060018360080160006101000a81548160ff0219169083151502179055507fe5af7daed5ab2a2dc5f98d53619f05089c0c14d11a6621f6b906a2366c9a7ab385604051611787919061283f565b60405180910390a15050505050565b600081600115156003600083815260200190815260200160002060000160009054906101000a900460ff161515146117cd57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461180157600080fd5b600060036000858152602001908152602001600020905061191081604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611b9a565b92505050919050565b611921611af6565b73ffffffffffffffffffffffffffffffffffffffff1661193f61129f565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c906129a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc906128c5565b60405180910390fd5b611a0e81611cd8565b50565b611a1961203d565b611a2b611a26848461126c565b61138c565b905092915050565b6000611a7e82600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126c565b9050919050565b6000611a8f6104c4565b8210611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac7906128a5565b60405180910390fd5b60028281548110611ae457611ae3612d14565b5b90600052602060002001549050919050565b600033905090565b60008183611b0c9190612aee565b905092915050565b611b958363a9059cbb60e01b8484604051602401611b339291906127a7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d9c565b505050565b600080611ba5611e63565b90508260400151811080611bc25750600115158361012001511515145b15611bd1576000915050611cbd565b611bec83608001518460600151611afe90919063ffffffff16565b8110611c1657611c0e8361010001518460e00151611cc290919063ffffffff16565b915050611cbd565b6000611c2f846060015183611cc290919063ffffffff16565b905060008460a0015190506000611c4f8284611e6b90919063ffffffff16565b90506000611c668383611e8190919063ffffffff16565b90506000611c978860800151611c89848b60e00151611e8190919063ffffffff16565b611e6b90919063ffffffff16565b9050611cb188610100015182611cc290919063ffffffff16565b90508096505050505050505b919050565b60008183611cd09190612bcf565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611dfe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611e979092919063ffffffff16565b9050600081511115611e5e5780806020019051810190611e1e919061224e565b611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5490612a05565b60405180910390fd5b5b505050565b600042905090565b60008183611e799190612b44565b905092915050565b60008183611e8f9190612b75565b905092915050565b6060611ea68484600085611eaf565b90509392505050565b606082471015611ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eeb90612925565b60405180910390fd5b611efd85611fc3565b611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f33906129c5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611f659190612775565b60006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5091509150611fb7828286611fd6565b92505050949350505050565b600080823b905060008111915050919050565b60608315611fe657829050612036565b600083511115611ff95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d9190612883565b60405180910390fd5b9392505050565b604051806101400160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000151581525090565b6000813590506120bb81613207565b92915050565b6000813590506120d08161321e565b92915050565b6000815190506120e58161321e565b92915050565b6000813590506120fa81613235565b92915050565b60008151905061210f81613235565b92915050565b6000813590506121248161324c565b92915050565b6000815190506121398161324c565b92915050565b60006020828403121561215557612154612d43565b5b6000612163848285016120ac565b91505092915050565b6000806040838503121561218357612182612d43565b5b6000612191858286016120ac565b92505060206121a285828601612115565b9150509250929050565b600080600080600080600060e0888a0312156121cb576121ca612d43565b5b60006121d98a828b016120ac565b97505060206121ea8a828b01612115565b96505060406121fb8a828b01612115565b955050606061220c8a828b01612115565b945050608061221d8a828b01612115565b93505060a061222e8a828b016120c1565b92505060c061223f8a828b01612115565b91505092959891949750929550565b60006020828403121561226457612263612d43565b5b6000612272848285016120d6565b91505092915050565b60006020828403121561229157612290612d43565b5b600061229f848285016120eb565b91505092915050565b6000602082840312156122be576122bd612d43565b5b60006122cc84828501612100565b91505092915050565b600080604083850312156122ec576122eb612d43565b5b60006122fa858286016120eb565b925050602061230b85828601612115565b9150509250929050565b60006020828403121561232b5761232a612d43565b5b600061233984828501612115565b91505092915050565b60006020828403121561235857612357612d43565b5b60006123668482850161212a565b91505092915050565b61237881612c03565b82525050565b61238781612c03565b82525050565b61239e61239982612c03565b612c88565b82525050565b6123ad81612c15565b82525050565b6123bc81612c15565b82525050565b6123cb81612c21565b82525050565b60006123dc82612abc565b6123e68185612ad2565b93506123f6818560208601612c55565b80840191505092915050565b600061240d82612ac7565b6124178185612add565b9350612427818560208601612c55565b61243081612d48565b840191505092915050565b6000612448602583612add565b915061245382612d66565b604082019050919050565b600061246b602683612add565b915061247682612db5565b604082019050919050565b600061248e604183612add565b915061249982612e04565b606082019050919050565b60006124b1602f83612add565b91506124bc82612e79565b604082019050919050565b60006124d4602683612add565b91506124df82612ec8565b604082019050919050565b60006124f7604683612add565b915061250282612f17565b606082019050919050565b600061251a602683612add565b915061252582612f8c565b604082019050919050565b600061253d603183612add565b915061254882612fdb565b604082019050919050565b6000612560602083612add565b915061256b8261302a565b602082019050919050565b6000612583601d83612add565b915061258e82613053565b602082019050919050565b60006125a6604e83612add565b91506125b18261307c565b606082019050919050565b60006125c9602a83612add565b91506125d4826130f1565b604082019050919050565b60006125ec601f83612add565b91506125f782613140565b602082019050919050565b600061260f602483612add565b915061261a82613169565b604082019050919050565b6000612632602a83612add565b915061263d826131b8565b604082019050919050565b6101408201600082015161265f60008501826123a4565b506020820151612672602085018261236f565b5060408201516126856040850182612714565b5060608201516126986060850182612714565b5060808201516126ab6080850182612714565b5060a08201516126be60a0850182612714565b5060c08201516126d160c08501826123a4565b5060e08201516126e460e0850182612714565b506101008201516126f9610100850182612714565b5061012082015161270e6101208501826123a4565b50505050565b61271d81612c4b565b82525050565b61272c81612c4b565b82525050565b61274361273e82612c4b565b612cac565b82525050565b6000612755828561238d565b6014820191506127658284612732565b6020820191508190509392505050565b600061278182846123d1565b915081905092915050565b60006020820190506127a1600083018461237e565b92915050565b60006040820190506127bc600083018561237e565b6127c96020830184612723565b9392505050565b600060e0820190506127e5600083018a61237e565b6127f26020830189612723565b6127ff6040830188612723565b61280c6060830187612723565b6128196080830186612723565b61282660a08301856123b3565b61283360c0830184612723565b98975050505050505050565b600060208201905061285460008301846123c2565b92915050565b600060408201905061286f60008301856123c2565b61287c6020830184612723565b9392505050565b6000602082019050818103600083015261289d8184612402565b905092915050565b600060208201905081810360008301526128be8161243b565b9050919050565b600060208201905081810360008301526128de8161245e565b9050919050565b600060208201905081810360008301526128fe81612481565b9050919050565b6000602082019050818103600083015261291e816124a4565b9050919050565b6000602082019050818103600083015261293e816124c7565b9050919050565b6000602082019050818103600083015261295e816124ea565b9050919050565b6000602082019050818103600083015261297e8161250d565b9050919050565b6000602082019050818103600083015261299e81612530565b9050919050565b600060208201905081810360008301526129be81612553565b9050919050565b600060208201905081810360008301526129de81612576565b9050919050565b600060208201905081810360008301526129fe81612599565b9050919050565b60006020820190508181036000830152612a1e816125bc565b9050919050565b60006020820190508181036000830152612a3e816125df565b9050919050565b60006020820190508181036000830152612a5e81612602565b9050919050565b60006020820190508181036000830152612a7e81612625565b9050919050565b600061014082019050612a9b6000830184612648565b92915050565b6000602082019050612ab66000830184612723565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612af982612c4b565b9150612b0483612c4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3957612b38612cb6565b5b828201905092915050565b6000612b4f82612c4b565b9150612b5a83612c4b565b925082612b6a57612b69612ce5565b5b828204905092915050565b6000612b8082612c4b565b9150612b8b83612c4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bc457612bc3612cb6565b5b828202905092915050565b6000612bda82612c4b565b9150612be583612c4b565b925082821015612bf857612bf7612cb6565b5b828203905092915050565b6000612c0e82612c2b565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612c73578082015181840152602081019050612c58565b83811115612c82576000848401525b50505050565b6000612c9382612c9a565b9050919050565b6000612ca582612d59565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456172746846756e6456657374696e673a20696e646578206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a2063616e6e6f742072656c6561736560008201527f20746f6b656e732c206e6f7420656e6f7567682076657374656420746f6b656e60208201527f7300000000000000000000000000000000000000000000000000000000000000604082015250565b7f456172746846756e6456657374696e673a206e6f7420656e6f7567682077697460008201527f686472617761626c652066756e64730000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a206f6e6c792062656e65666963696160008201527f727920616e64206f776e65722063616e2072656c65617365207665737465642060208201527f746f6b656e730000000000000000000000000000000000000000000000000000604082015250565b7f456172746846756e6456657374696e673a206475726174696f6e206d7573742060008201527f6265203e20300000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a20736c696365506572696f6453656360008201527f6f6e6473206d757374206265203e3d2031000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f456172746846756e6456657374696e673a2063616e6e6f74206372656174652060008201527f76657374696e67207363686564756c652062656361757365206e6f742073756660208201527f66696369656e7420746f6b656e73000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f456172746846756e6456657374696e673a20616d6f756e74206d75737420626560008201527f203e203000000000000000000000000000000000000000000000000000000000602082015250565b7f456172746846756e6456657374696e673a2076657374696e67206973206e6f7460008201527f207265766f6361626c6500000000000000000000000000000000000000000000602082015250565b61321081612c03565b811461321b57600080fd5b50565b61322781612c15565b811461323257600080fd5b50565b61323e81612c21565b811461324957600080fd5b50565b61325581612c4b565b811461326057600080fd5b5056fea26469706673582212200c5474413004ba8ff5973d8660c9040f6a422e2f68a47f623caa554efd742ec964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b50084
-----Decoded View---------------
Arg [0] : token_ (address): 0x9e04F519b094F5F8210441e285f603f4d2b50084
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009e04f519b094f5f8210441e285f603f4d2b50084
Deployed Bytecode Sourcemap
28313:12763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37468:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33069:1654;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32311:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35765:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32062:140;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30984:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36232:1086;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19631:94;;;;;;;;;;;;;:::i;:::-;;39192:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39553:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18980:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38581:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38257:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34878:760;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37764:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19880:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31681:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38870:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31276:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37468:143;37551:7;37577:19;:26;;;;37570:33;;37468:143;:::o;33069:1654::-;19211:12;:10;:12::i;:::-;19200:23;;:7;:5;:7::i;:::-;:23;;;19192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33405:7:::1;33373:4;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;33351:167;;;;;;;;;;;;:::i;:::-;;;;;;;;;33549:1;33537:9;:13;33529:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33622:1;33612:7;:11;33604:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33706:1;33683:19;:24;;33675:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;33772:25;33800:4;:42;;;33843:12;33800:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33772:84;;33867:13;33883:18;33894:6;33883;:10;;:18;;;;:::i;:::-;33867:34;;33950:254;;;;;;;;33980:4;33950:254;;;;;;33999:12;33950:254;;;;;;34026:5;33950:254;;;;34046:6;33950:254;;;;34067:9;33950:254;;;;34091:19;33950:254;;;;34125:10;33950:254;;;;;;34150:7;33950:254;;;;34172:1;33950:254;;;;34188:5;33950:254;;;;::::0;33912:16:::1;:35;33929:17;33912:35;;;;;;;;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34245:40;34277:7;34245:27;;:31;;:40;;;;:::i;:::-;34215:27;:70;;;;34296:19;34321:17;34296:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34350:27;34380:19;:33;34400:12;34380:33;;;;;;;;;;;;;;;;34350:63;;34460:26;34484:1;34460:19;:23;;:26;;;;:::i;:::-;34424:19;:33;34444:12;34424:33;;;;;;;;;;;;;;;:62;;;;34502:213;34539:12;34567:6;34589;34611:9;34636:19;34671:10;34697:7;34502:213;;;;;;;;;;;;:::i;:::-;;;;;;;;33340:1383;;;33069:1654:::0;;;;;;;:::o;32311:106::-;32368:7;32402:6;32387:22;;32311:106;:::o;35765:287::-;16371:1;16967:7;;:19;;16959:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;16371:1;17100:7;:18;;;;19211:12:::1;:10;:12::i;:::-;19200:23;;:7;:5;:7::i;:::-;:23;;;19192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35906:6:::2;35874:4;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;35866:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35975:36;35995:7;:5;:7::i;:::-;36004:6;35975;:19;;;;:36;;;;;:::i;:::-;36027:17;36037:6;36027:17;;;;;;:::i;:::-;;;;;;;;16327:1:::0;17279:7;:22;;;;35765:287;:::o;32062:140::-;32141:7;32167:27;;32160:34;;32062:140;:::o;30984:173::-;31090:7;31116:19;:33;31136:12;31116:33;;;;;;;;;;;;;;;;31109:40;;30984:173;;;:::o;36232:1086::-;16371:1;16967:7;;:19;;16959:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;16371:1;17100:7;:18;;;;36396:17:::1;30422:4;30371:55;;:16;:35;30388:17;30371:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;30363:64;;;::::0;::::1;;30493:5;30446:52;;:16;:35;30463:17;30446:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;30438:61;;;::::0;::::1;;36425:39:::2;36467:16;:35;36484:17;36467:35;;;;;;;;;;;36425:77;;36513:18;36548:15;:27;;;;;;;;;;;;36534:41;;:10;:41;;;36513:62;;36586:12;36615:7;:5;:7::i;:::-;36601:21;;:10;:21;;;36586:36;;36655:13;:24;;;;36672:7;36655:24;36633:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;36788:20;36811:41;36836:15;36811:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;36788:64;;36887:6;36871:12;:22;;36863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37001:36;37030:6;37001:15;:24;;;:28;;:36;;;;:::i;:::-;36974:15;:24;;:63;;;;37048:34;37093:15;:27;;;;;;;;;;;;37048:73;;37162:39;37194:6;37162:27;;:31;;:39;;;;:::i;:::-;37132:27;:69;;;;37212:47;37232:18;37252:6;37212;:19;;;;:47;;;;;:::i;:::-;37275:35;37284:17;37303:6;37275:35;;;;;;;:::i;:::-;;;;;;;;36414:904;;;;;17131:1:::1;16327::::0;17279:7;:22;;;;36232:1086;;:::o;19631:94::-;19211:12;:10;:12::i;:::-;19200:23;;:7;:5;:7::i;:::-;:23;;;19192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19696:21:::1;19714:1;19696:9;:21::i;:::-;19631:94::o:0;39192:254::-;39296:22;;:::i;:::-;39337:16;:101;39354:83;39397:6;39435:1;39405:19;:27;39425:6;39405:27;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;39354:42;:83::i;:::-;39337:101;;;;;;;;;;;39330:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39192:254;;;:::o;39553:206::-;39683:7;39736:6;39744:5;39719:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39709:42;;;;;;39702:49;;39553:206;;;;:::o;18980:87::-;19026:7;19053:6;;;;;;;;;;;19046:13;;18980:87;:::o;38581:178::-;38661:7;38687:64;38723:27;;38687:6;:16;;;38712:4;38687:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;:64;;;;:::i;:::-;38680:71;;38581:178;:::o;38257:186::-;38359:22;;:::i;:::-;38400:16;:35;38417:17;38400:35;;;;;;;;;;;38393:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38257:186;;;:::o;34878:760::-;19211:12;:10;:12::i;:::-;19200:23;;:7;:5;:7::i;:::-;:23;;;19192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34997:17:::1;30422:4;30371:55;;:16;:35;30388:17;30371:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;30363:64;;;::::0;::::1;;30493:5;30446:52;;:16;:35;30463:17;30446:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;30438:61;;;::::0;::::1;;35026:39:::2;35068:16;:35;35085:17;35068:35;;;;;;;;;;;35026:77;;35151:4;35122:33;;:15;:25;;;;;;;;;;;;:33;;;35114:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;35213:20;35236:41;35261:15;35236:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;35213:64;;35306:1;35291:12;:16;35288:87;;;35323:40;35331:17;35350:12;35323:7;:40::i;:::-;35288:87;35385:18;35406:57;35438:15;:24;;;35406:15;:27;;;:31;;:57;;;;:::i;:::-;35385:78;;35504:43;35536:10;35504:27;;:31;;:43;;;;:::i;:::-;35474:27;:73;;;;35584:4;35558:15;:23;;;:30;;;;;;;;;;;;;;;;;;35604:26;35612:17;35604:26;;;;;;:::i;:::-;;;;;;;;35015:623;;;19271:1:::1;34878:760:::0;:::o;37764:330::-;37931:7;37881:17;30422:4;30371:55;;:16;:35;30388:17;30371:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;30363:64;;;;;;30493:5;30446:52;;:16;:35;30463:17;30446:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;30438:61;;;;;;37950:39:::1;37992:16;:35;38009:17;37992:35;;;;;;;;;;;37950:77;;38045:41;38070:15;38045:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:24;:41::i;:::-;38038:48;;;37764:330:::0;;;;:::o;19880:192::-;19211:12;:10;:12::i;:::-;19200:23;;:7;:5;:7::i;:::-;:23;;;19192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19989:1:::1;19969:22;;:8;:22;;;;19961:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20045:19;20055:8;20045:9;:19::i;:::-;19880:192:::0;:::o;31681:239::-;31794:22;;:::i;:::-;31835:77;31854:57;31897:6;31905:5;31854:42;:57::i;:::-;31835:18;:77::i;:::-;31828:84;;31681:239;;;;:::o;38870:223::-;38980:7;39006:79;39049:6;39057:19;:27;39077:6;39057:27;;;;;;;;;;;;;;;;39006:42;:79::i;:::-;38999:86;;38870:223;;;:::o;31276:236::-;31357:7;31392:26;:24;:26::i;:::-;31384:5;:34;31376:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;31478:19;31498:5;31478:26;;;;;;;;:::i;:::-;;;;;;;;;;31471:33;;31276:236;;;:::o;17856:98::-;17909:7;17936:10;17929:17;;17856:98;:::o;24104:::-;24162:7;24193:1;24189;:5;;;;:::i;:::-;24182:12;;24104:98;;;;:::o;11422:211::-;11539:86;11559:5;11589:23;;;11614:2;11618:5;11566:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11539:19;:86::i;:::-;11422:211;;;:::o;39908:1014::-;40019:7;40038:19;40060:16;:14;:16::i;:::-;40038:38;;40106:15;:21;;;40092:11;:35;40091:72;;;;40159:4;40132:31;;:15;:23;;;:31;;;40091:72;40087:828;;;40187:1;40180:8;;;;;40087:828;40225:51;40251:15;:24;;;40225:15;:21;;;:25;;:51;;;;:::i;:::-;40210:11;:66;40206:709;;40300:57;40332:15;:24;;;40300:15;:27;;;:31;;:57;;;;:::i;:::-;40293:64;;;;;40206:709;40390:21;40414:38;40430:15;:21;;;40414:11;:15;;:38;;;;:::i;:::-;40390:62;;40467:23;40493:15;:34;;;40467:60;;40542:26;40571:34;40589:15;40571:13;:17;;:34;;;;:::i;:::-;40542:63;;40620:21;40644:39;40667:15;40644:18;:22;;:39;;;;:::i;:::-;40620:63;;40698:20;40721:76;40772:15;:24;;;40721:46;40753:13;40721:15;:27;;;:31;;:46;;;;:::i;:::-;:50;;:76;;;;:::i;:::-;40698:99;;40827:42;40844:15;:24;;;40827:12;:16;;:42;;;;:::i;:::-;40812:57;;40891:12;40884:19;;;;;;;;39908:1014;;;;:::o;24485:98::-;24543:7;24574:1;24570;:5;;;;:::i;:::-;24563:12;;24485:98;;;;:::o;20080:173::-;20136:16;20155:6;;;;;;;;;;;20136:25;;20181:8;20172:6;;:17;;;;;;;;;;;;;;;;;;20236:8;20205:40;;20226:8;20205:40;;;;;;;;;;;;20125:128;20080:173;:::o;13995:716::-;14419:23;14445:69;14473:4;14445:69;;;;;;;;;;;;;;;;;14453:5;14445:27;;;;:69;;;;;:::i;:::-;14419:95;;14549:1;14529:10;:17;:21;14525:179;;;14626:10;14615:30;;;;;;;;;;;;:::i;:::-;14607:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14525:179;14065:646;13995:716;;:::o;40930:141::-;41022:7;41048:15;41041:22;;40930:141;:::o;25241:98::-;25299:7;25330:1;25326;:5;;;;:::i;:::-;25319:12;;25241:98;;;;:::o;24842:::-;24900:7;24931:1;24927;:5;;;;:::i;:::-;24920:12;;24842:98;;;;:::o;6365:229::-;6502:12;6534:52;6556:6;6564:4;6570:1;6573:12;6534:21;:52::i;:::-;6527:59;;6365:229;;;;;:::o;7485:510::-;7655:12;7713:5;7688:21;:30;;7680:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7780:18;7791:6;7780:10;:18::i;:::-;7772:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7846:12;7860:23;7887:6;:11;;7906:5;7913:4;7887:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7845:73;;;;7936:51;7953:7;7962:10;7974:12;7936:16;:51::i;:::-;7929:58;;;;7485:510;;;;;;:::o;3559:387::-;3619:4;3827:12;3894:7;3882:20;3874:28;;3937:1;3930:4;:8;3923:15;;;3559:387;;;:::o;10171:712::-;10321:12;10350:7;10346:530;;;10381:10;10374:17;;;;10346:530;10515:1;10495:10;:17;:21;10491:374;;;10693:10;10687:17;10754:15;10741:10;10737:2;10733:19;10726:44;10491:374;10836:12;10829:20;;;;;;;;;;;:::i;:::-;;;;;;;;10171:712;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;152:133;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;291:137;;;;:::o;434:139::-;480:5;518:6;505:20;496:29;;534:33;561:5;534:33;:::i;:::-;434:139;;;;:::o;579:143::-;636:5;667:6;661:13;652:22;;683:33;710:5;683:33;:::i;:::-;579:143;;;;:::o;728:139::-;774:5;812:6;799:20;790:29;;828:33;855:5;828:33;:::i;:::-;728:139;;;;:::o;873:143::-;930:5;961:6;955:13;946:22;;977:33;1004:5;977:33;:::i;:::-;873:143;;;;:::o;1022:329::-;1081:6;1130:2;1118:9;1109:7;1105:23;1101:32;1098:119;;;1136:79;;:::i;:::-;1098:119;1256:1;1281:53;1326:7;1317:6;1306:9;1302:22;1281:53;:::i;:::-;1271:63;;1227:117;1022:329;;;;:::o;1357:474::-;1425:6;1433;1482:2;1470:9;1461:7;1457:23;1453:32;1450:119;;;1488:79;;:::i;:::-;1450:119;1608:1;1633:53;1678:7;1669:6;1658:9;1654:22;1633:53;:::i;:::-;1623:63;;1579:117;1735:2;1761:53;1806:7;1797:6;1786:9;1782:22;1761:53;:::i;:::-;1751:63;;1706:118;1357:474;;;;;:::o;1837:1197::-;1947:6;1955;1963;1971;1979;1987;1995;2044:3;2032:9;2023:7;2019:23;2015:33;2012:120;;;2051:79;;:::i;:::-;2012:120;2171:1;2196:53;2241:7;2232:6;2221:9;2217:22;2196:53;:::i;:::-;2186:63;;2142:117;2298:2;2324:53;2369:7;2360:6;2349:9;2345:22;2324:53;:::i;:::-;2314:63;;2269:118;2426:2;2452:53;2497:7;2488:6;2477:9;2473:22;2452:53;:::i;:::-;2442:63;;2397:118;2554:2;2580:53;2625:7;2616:6;2605:9;2601:22;2580:53;:::i;:::-;2570:63;;2525:118;2682:3;2709:53;2754:7;2745:6;2734:9;2730:22;2709:53;:::i;:::-;2699:63;;2653:119;2811:3;2838:50;2880:7;2871:6;2860:9;2856:22;2838:50;:::i;:::-;2828:60;;2782:116;2937:3;2964:53;3009:7;3000:6;2989:9;2985:22;2964:53;:::i;:::-;2954:63;;2908:119;1837:1197;;;;;;;;;;:::o;3040:345::-;3107:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:119;;;3162:79;;:::i;:::-;3124:119;3282:1;3307:61;3360:7;3351:6;3340:9;3336:22;3307:61;:::i;:::-;3297:71;;3253:125;3040:345;;;;:::o;3391:329::-;3450:6;3499:2;3487:9;3478:7;3474:23;3470:32;3467:119;;;3505:79;;:::i;:::-;3467:119;3625:1;3650:53;3695:7;3686:6;3675:9;3671:22;3650:53;:::i;:::-;3640:63;;3596:117;3391:329;;;;:::o;3726:351::-;3796:6;3845:2;3833:9;3824:7;3820:23;3816:32;3813:119;;;3851:79;;:::i;:::-;3813:119;3971:1;3996:64;4052:7;4043:6;4032:9;4028:22;3996:64;:::i;:::-;3986:74;;3942:128;3726:351;;;;:::o;4083:474::-;4151:6;4159;4208:2;4196:9;4187:7;4183:23;4179:32;4176:119;;;4214:79;;:::i;:::-;4176:119;4334:1;4359:53;4404:7;4395:6;4384:9;4380:22;4359:53;:::i;:::-;4349:63;;4305:117;4461:2;4487:53;4532:7;4523:6;4512:9;4508:22;4487:53;:::i;:::-;4477:63;;4432:118;4083:474;;;;;:::o;4563:329::-;4622:6;4671:2;4659:9;4650:7;4646:23;4642:32;4639:119;;;4677:79;;:::i;:::-;4639:119;4797:1;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4768:117;4563:329;;;;:::o;4898:351::-;4968:6;5017:2;5005:9;4996:7;4992:23;4988:32;4985:119;;;5023:79;;:::i;:::-;4985:119;5143:1;5168:64;5224:7;5215:6;5204:9;5200:22;5168:64;:::i;:::-;5158:74;;5114:128;4898:351;;;;:::o;5255:108::-;5332:24;5350:5;5332:24;:::i;:::-;5327:3;5320:37;5255:108;;:::o;5369:118::-;5456:24;5474:5;5456:24;:::i;:::-;5451:3;5444:37;5369:118;;:::o;5493:157::-;5598:45;5618:24;5636:5;5618:24;:::i;:::-;5598:45;:::i;:::-;5593:3;5586:58;5493:157;;:::o;5656:99::-;5727:21;5742:5;5727:21;:::i;:::-;5722:3;5715:34;5656:99;;:::o;5761:109::-;5842:21;5857:5;5842:21;:::i;:::-;5837:3;5830:34;5761:109;;:::o;5876:118::-;5963:24;5981:5;5963:24;:::i;:::-;5958:3;5951:37;5876:118;;:::o;6000:373::-;6104:3;6132:38;6164:5;6132:38;:::i;:::-;6186:88;6267:6;6262:3;6186:88;:::i;:::-;6179:95;;6283:52;6328:6;6323:3;6316:4;6309:5;6305:16;6283:52;:::i;:::-;6360:6;6355:3;6351:16;6344:23;;6108:265;6000:373;;;;:::o;6379:364::-;6467:3;6495:39;6528:5;6495:39;:::i;:::-;6550:71;6614:6;6609:3;6550:71;:::i;:::-;6543:78;;6630:52;6675:6;6670:3;6663:4;6656:5;6652:16;6630:52;:::i;:::-;6707:29;6729:6;6707:29;:::i;:::-;6702:3;6698:39;6691:46;;6471:272;6379:364;;;;:::o;6749:366::-;6891:3;6912:67;6976:2;6971:3;6912:67;:::i;:::-;6905:74;;6988:93;7077:3;6988:93;:::i;:::-;7106:2;7101:3;7097:12;7090:19;;6749:366;;;:::o;7121:::-;7263:3;7284:67;7348:2;7343:3;7284:67;:::i;:::-;7277:74;;7360:93;7449:3;7360:93;:::i;:::-;7478:2;7473:3;7469:12;7462:19;;7121:366;;;:::o;7493:::-;7635:3;7656:67;7720:2;7715:3;7656:67;:::i;:::-;7649:74;;7732:93;7821:3;7732:93;:::i;:::-;7850:2;7845:3;7841:12;7834:19;;7493:366;;;:::o;7865:::-;8007:3;8028:67;8092:2;8087:3;8028:67;:::i;:::-;8021:74;;8104:93;8193:3;8104:93;:::i;:::-;8222:2;8217:3;8213:12;8206:19;;7865:366;;;:::o;8237:::-;8379:3;8400:67;8464:2;8459:3;8400:67;:::i;:::-;8393:74;;8476:93;8565:3;8476:93;:::i;:::-;8594:2;8589:3;8585:12;8578:19;;8237:366;;;:::o;8609:::-;8751:3;8772:67;8836:2;8831:3;8772:67;:::i;:::-;8765:74;;8848:93;8937:3;8848:93;:::i;:::-;8966:2;8961:3;8957:12;8950:19;;8609:366;;;:::o;8981:::-;9123:3;9144:67;9208:2;9203:3;9144:67;:::i;:::-;9137:74;;9220:93;9309:3;9220:93;:::i;:::-;9338:2;9333:3;9329:12;9322:19;;8981:366;;;:::o;9353:::-;9495:3;9516:67;9580:2;9575:3;9516:67;:::i;:::-;9509:74;;9592:93;9681:3;9592:93;:::i;:::-;9710:2;9705:3;9701:12;9694:19;;9353:366;;;:::o;9725:::-;9867:3;9888:67;9952:2;9947:3;9888:67;:::i;:::-;9881:74;;9964:93;10053:3;9964:93;:::i;:::-;10082:2;10077:3;10073:12;10066:19;;9725:366;;;:::o;10097:::-;10239:3;10260:67;10324:2;10319:3;10260:67;:::i;:::-;10253:74;;10336:93;10425:3;10336:93;:::i;:::-;10454:2;10449:3;10445:12;10438:19;;10097:366;;;:::o;10469:::-;10611:3;10632:67;10696:2;10691:3;10632:67;:::i;:::-;10625:74;;10708:93;10797:3;10708:93;:::i;:::-;10826:2;10821:3;10817:12;10810:19;;10469:366;;;:::o;10841:::-;10983:3;11004:67;11068:2;11063:3;11004:67;:::i;:::-;10997:74;;11080:93;11169:3;11080:93;:::i;:::-;11198:2;11193:3;11189:12;11182:19;;10841:366;;;:::o;11213:::-;11355:3;11376:67;11440:2;11435:3;11376:67;:::i;:::-;11369:74;;11452:93;11541:3;11452:93;:::i;:::-;11570:2;11565:3;11561:12;11554:19;;11213:366;;;:::o;11585:::-;11727:3;11748:67;11812:2;11807:3;11748:67;:::i;:::-;11741:74;;11824:93;11913:3;11824:93;:::i;:::-;11942:2;11937:3;11933:12;11926:19;;11585:366;;;:::o;11957:::-;12099:3;12120:67;12184:2;12179:3;12120:67;:::i;:::-;12113:74;;12196:93;12285:3;12196:93;:::i;:::-;12314:2;12309:3;12305:12;12298:19;;11957:366;;;:::o;12419:1960::-;12582:6;12577:3;12573:16;12678:4;12671:5;12667:16;12661:23;12697:57;12748:4;12743:3;12739:14;12725:12;12697:57;:::i;:::-;12599:165;12853:4;12846:5;12842:16;12836:23;12872:63;12929:4;12924:3;12920:14;12906:12;12872:63;:::i;:::-;12774:171;13028:4;13021:5;13017:16;13011:23;13047:63;13104:4;13099:3;13095:14;13081:12;13047:63;:::i;:::-;12955:165;13203:4;13196:5;13192:16;13186:23;13222:63;13279:4;13274:3;13270:14;13256:12;13222:63;:::i;:::-;13130:165;13381:4;13374:5;13370:16;13364:23;13400:63;13457:4;13452:3;13448:14;13434:12;13400:63;:::i;:::-;13305:168;13569:4;13562:5;13558:16;13552:23;13588:63;13645:4;13640:3;13636:14;13622:12;13588:63;:::i;:::-;13483:178;13748:4;13741:5;13737:16;13731:23;13767:57;13818:4;13813:3;13809:14;13795:12;13767:57;:::i;:::-;13671:163;13923:4;13916:5;13912:16;13906:23;13942:63;13999:4;13994:3;13990:14;13976:12;13942:63;:::i;:::-;13844:171;14101:6;14094:5;14090:18;14084:25;14122:65;14179:6;14174:3;14170:16;14156:12;14122:65;:::i;:::-;14025:172;14282:6;14275:5;14271:18;14265:25;14303:59;14354:6;14349:3;14345:16;14331:12;14303:59;:::i;:::-;14207:165;12551:1828;12419:1960;;:::o;14385:108::-;14462:24;14480:5;14462:24;:::i;:::-;14457:3;14450:37;14385:108;;:::o;14499:118::-;14586:24;14604:5;14586:24;:::i;:::-;14581:3;14574:37;14499:118;;:::o;14623:157::-;14728:45;14748:24;14766:5;14748:24;:::i;:::-;14728:45;:::i;:::-;14723:3;14716:58;14623:157;;:::o;14786:397::-;14926:3;14941:75;15012:3;15003:6;14941:75;:::i;:::-;15041:2;15036:3;15032:12;15025:19;;15054:75;15125:3;15116:6;15054:75;:::i;:::-;15154:2;15149:3;15145:12;15138:19;;15174:3;15167:10;;14786:397;;;;;:::o;15189:271::-;15319:3;15341:93;15430:3;15421:6;15341:93;:::i;:::-;15334:100;;15451:3;15444:10;;15189:271;;;;:::o;15466:222::-;15559:4;15597:2;15586:9;15582:18;15574:26;;15610:71;15678:1;15667:9;15663:17;15654:6;15610:71;:::i;:::-;15466:222;;;;:::o;15694:332::-;15815:4;15853:2;15842:9;15838:18;15830:26;;15866:71;15934:1;15923:9;15919:17;15910:6;15866:71;:::i;:::-;15947:72;16015:2;16004:9;16000:18;15991:6;15947:72;:::i;:::-;15694:332;;;;;:::o;16032:874::-;16287:4;16325:3;16314:9;16310:19;16302:27;;16339:71;16407:1;16396:9;16392:17;16383:6;16339:71;:::i;:::-;16420:72;16488:2;16477:9;16473:18;16464:6;16420:72;:::i;:::-;16502;16570:2;16559:9;16555:18;16546:6;16502:72;:::i;:::-;16584;16652:2;16641:9;16637:18;16628:6;16584:72;:::i;:::-;16666:73;16734:3;16723:9;16719:19;16710:6;16666:73;:::i;:::-;16749:67;16811:3;16800:9;16796:19;16787:6;16749:67;:::i;:::-;16826:73;16894:3;16883:9;16879:19;16870:6;16826:73;:::i;:::-;16032:874;;;;;;;;;;:::o;16912:222::-;17005:4;17043:2;17032:9;17028:18;17020:26;;17056:71;17124:1;17113:9;17109:17;17100:6;17056:71;:::i;:::-;16912:222;;;;:::o;17140:332::-;17261:4;17299:2;17288:9;17284:18;17276:26;;17312:71;17380:1;17369:9;17365:17;17356:6;17312:71;:::i;:::-;17393:72;17461:2;17450:9;17446:18;17437:6;17393:72;:::i;:::-;17140:332;;;;;:::o;17478:313::-;17591:4;17629:2;17618:9;17614:18;17606:26;;17678:9;17672:4;17668:20;17664:1;17653:9;17649:17;17642:47;17706:78;17779:4;17770:6;17706:78;:::i;:::-;17698:86;;17478:313;;;;:::o;17797:419::-;17963:4;18001:2;17990:9;17986:18;17978:26;;18050:9;18044:4;18040:20;18036:1;18025:9;18021:17;18014:47;18078:131;18204:4;18078:131;:::i;:::-;18070:139;;17797:419;;;:::o;18222:::-;18388:4;18426:2;18415:9;18411:18;18403:26;;18475:9;18469:4;18465:20;18461:1;18450:9;18446:17;18439:47;18503:131;18629:4;18503:131;:::i;:::-;18495:139;;18222:419;;;:::o;18647:::-;18813:4;18851:2;18840:9;18836:18;18828:26;;18900:9;18894:4;18890:20;18886:1;18875:9;18871:17;18864:47;18928:131;19054:4;18928:131;:::i;:::-;18920:139;;18647:419;;;:::o;19072:::-;19238:4;19276:2;19265:9;19261:18;19253:26;;19325:9;19319:4;19315:20;19311:1;19300:9;19296:17;19289:47;19353:131;19479:4;19353:131;:::i;:::-;19345:139;;19072:419;;;:::o;19497:::-;19663:4;19701:2;19690:9;19686:18;19678:26;;19750:9;19744:4;19740:20;19736:1;19725:9;19721:17;19714:47;19778:131;19904:4;19778:131;:::i;:::-;19770:139;;19497:419;;;:::o;19922:::-;20088:4;20126:2;20115:9;20111:18;20103:26;;20175:9;20169:4;20165:20;20161:1;20150:9;20146:17;20139:47;20203:131;20329:4;20203:131;:::i;:::-;20195:139;;19922:419;;;:::o;20347:::-;20513:4;20551:2;20540:9;20536:18;20528:26;;20600:9;20594:4;20590:20;20586:1;20575:9;20571:17;20564:47;20628:131;20754:4;20628:131;:::i;:::-;20620:139;;20347:419;;;:::o;20772:::-;20938:4;20976:2;20965:9;20961:18;20953:26;;21025:9;21019:4;21015:20;21011:1;21000:9;20996:17;20989:47;21053:131;21179:4;21053:131;:::i;:::-;21045:139;;20772:419;;;:::o;21197:::-;21363:4;21401:2;21390:9;21386:18;21378:26;;21450:9;21444:4;21440:20;21436:1;21425:9;21421:17;21414:47;21478:131;21604:4;21478:131;:::i;:::-;21470:139;;21197:419;;;:::o;21622:::-;21788:4;21826:2;21815:9;21811:18;21803:26;;21875:9;21869:4;21865:20;21861:1;21850:9;21846:17;21839:47;21903:131;22029:4;21903:131;:::i;:::-;21895:139;;21622:419;;;:::o;22047:::-;22213:4;22251:2;22240:9;22236:18;22228:26;;22300:9;22294:4;22290:20;22286:1;22275:9;22271:17;22264:47;22328:131;22454:4;22328:131;:::i;:::-;22320:139;;22047:419;;;:::o;22472:::-;22638:4;22676:2;22665:9;22661:18;22653:26;;22725:9;22719:4;22715:20;22711:1;22700:9;22696:17;22689:47;22753:131;22879:4;22753:131;:::i;:::-;22745:139;;22472:419;;;:::o;22897:::-;23063:4;23101:2;23090:9;23086:18;23078:26;;23150:9;23144:4;23140:20;23136:1;23125:9;23121:17;23114:47;23178:131;23304:4;23178:131;:::i;:::-;23170:139;;22897:419;;;:::o;23322:::-;23488:4;23526:2;23515:9;23511:18;23503:26;;23575:9;23569:4;23565:20;23561:1;23550:9;23546:17;23539:47;23603:131;23729:4;23603:131;:::i;:::-;23595:139;;23322:419;;;:::o;23747:::-;23913:4;23951:2;23940:9;23936:18;23928:26;;24000:9;23994:4;23990:20;23986:1;23975:9;23971:17;23964:47;24028:131;24154:4;24028:131;:::i;:::-;24020:139;;23747:419;;;:::o;24172:355::-;24331:4;24369:3;24358:9;24354:19;24346:27;;24383:137;24517:1;24506:9;24502:17;24493:6;24383:137;:::i;:::-;24172:355;;;;:::o;24533:222::-;24626:4;24664:2;24653:9;24649:18;24641:26;;24677:71;24745:1;24734:9;24730:17;24721:6;24677:71;:::i;:::-;24533:222;;;;:::o;24842:98::-;24893:6;24927:5;24921:12;24911:22;;24842:98;;;:::o;24946:99::-;24998:6;25032:5;25026:12;25016:22;;24946:99;;;:::o;25051:147::-;25152:11;25189:3;25174:18;;25051:147;;;;:::o;25204:169::-;25288:11;25322:6;25317:3;25310:19;25362:4;25357:3;25353:14;25338:29;;25204:169;;;;:::o;25379:305::-;25419:3;25438:20;25456:1;25438:20;:::i;:::-;25433:25;;25472:20;25490:1;25472:20;:::i;:::-;25467:25;;25626:1;25558:66;25554:74;25551:1;25548:81;25545:107;;;25632:18;;:::i;:::-;25545:107;25676:1;25673;25669:9;25662:16;;25379:305;;;;:::o;25690:185::-;25730:1;25747:20;25765:1;25747:20;:::i;:::-;25742:25;;25781:20;25799:1;25781:20;:::i;:::-;25776:25;;25820:1;25810:35;;25825:18;;:::i;:::-;25810:35;25867:1;25864;25860:9;25855:14;;25690:185;;;;:::o;25881:348::-;25921:7;25944:20;25962:1;25944:20;:::i;:::-;25939:25;;25978:20;25996:1;25978:20;:::i;:::-;25973:25;;26166:1;26098:66;26094:74;26091:1;26088:81;26083:1;26076:9;26069:17;26065:105;26062:131;;;26173:18;;:::i;:::-;26062:131;26221:1;26218;26214:9;26203:20;;25881:348;;;;:::o;26235:191::-;26275:4;26295:20;26313:1;26295:20;:::i;:::-;26290:25;;26329:20;26347:1;26329:20;:::i;:::-;26324:25;;26368:1;26365;26362:8;26359:34;;;26373:18;;:::i;:::-;26359:34;26418:1;26415;26411:9;26403:17;;26235:191;;;;:::o;26432:96::-;26469:7;26498:24;26516:5;26498:24;:::i;:::-;26487:35;;26432:96;;;:::o;26534:90::-;26568:7;26611:5;26604:13;26597:21;26586:32;;26534:90;;;:::o;26630:77::-;26667:7;26696:5;26685:16;;26630:77;;;:::o;26713:126::-;26750:7;26790:42;26783:5;26779:54;26768:65;;26713:126;;;:::o;26845:77::-;26882:7;26911:5;26900:16;;26845:77;;;:::o;26928:307::-;26996:1;27006:113;27020:6;27017:1;27014:13;27006:113;;;27105:1;27100:3;27096:11;27090:18;27086:1;27081:3;27077:11;27070:39;27042:2;27039:1;27035:10;27030:15;;27006:113;;;27137:6;27134:1;27131:13;27128:101;;;27217:1;27208:6;27203:3;27199:16;27192:27;27128:101;26977:258;26928:307;;;:::o;27241:100::-;27280:7;27309:26;27329:5;27309:26;:::i;:::-;27298:37;;27241:100;;;:::o;27347:94::-;27386:7;27415:20;27429:5;27415:20;:::i;:::-;27404:31;;27347:94;;;:::o;27447:79::-;27486:7;27515:5;27504:16;;27447:79;;;:::o;27532:180::-;27580:77;27577:1;27570:88;27677:4;27674:1;27667:15;27701:4;27698:1;27691:15;27718:180;27766:77;27763:1;27756:88;27863:4;27860:1;27853:15;27887:4;27884:1;27877:15;27904:180;27952:77;27949:1;27942:88;28049:4;28046:1;28039:15;28073:4;28070:1;28063:15;28213:117;28322:1;28319;28312:12;28336:102;28377:6;28428:2;28424:7;28419:2;28412:5;28408:14;28404:28;28394:38;;28336:102;;;:::o;28444:94::-;28477:8;28525:5;28521:2;28517:14;28496:35;;28444:94;;;:::o;28544:224::-;28684:34;28680:1;28672:6;28668:14;28661:58;28753:7;28748:2;28740:6;28736:15;28729:32;28544:224;:::o;28774:225::-;28914:34;28910:1;28902:6;28898:14;28891:58;28983:8;28978:2;28970:6;28966:15;28959:33;28774:225;:::o;29005:289::-;29145:34;29141:1;29133:6;29129:14;29122:58;29214:34;29209:2;29201:6;29197:15;29190:59;29283:3;29278:2;29270:6;29266:15;29259:28;29005:289;:::o;29300:234::-;29440:34;29436:1;29428:6;29424:14;29417:58;29509:17;29504:2;29496:6;29492:15;29485:42;29300:234;:::o;29540:225::-;29680:34;29676:1;29668:6;29664:14;29657:58;29749:8;29744:2;29736:6;29732:15;29725:33;29540:225;:::o;29771:294::-;29911:34;29907:1;29899:6;29895:14;29888:58;29980:34;29975:2;29967:6;29963:15;29956:59;30049:8;30044:2;30036:6;30032:15;30025:33;29771:294;:::o;30071:225::-;30211:34;30207:1;30199:6;30195:14;30188:58;30280:8;30275:2;30267:6;30263:15;30256:33;30071:225;:::o;30302:236::-;30442:34;30438:1;30430:6;30426:14;30419:58;30511:19;30506:2;30498:6;30494:15;30487:44;30302:236;:::o;30544:182::-;30684:34;30680:1;30672:6;30668:14;30661:58;30544:182;:::o;30732:179::-;30872:31;30868:1;30860:6;30856:14;30849:55;30732:179;:::o;30917:302::-;31057:34;31053:1;31045:6;31041:14;31034:58;31126:34;31121:2;31113:6;31109:15;31102:59;31195:16;31190:2;31182:6;31178:15;31171:41;30917:302;:::o;31225:229::-;31365:34;31361:1;31353:6;31349:14;31342:58;31434:12;31429:2;31421:6;31417:15;31410:37;31225:229;:::o;31460:181::-;31600:33;31596:1;31588:6;31584:14;31577:57;31460:181;:::o;31647:223::-;31787:34;31783:1;31775:6;31771:14;31764:58;31856:6;31851:2;31843:6;31839:15;31832:31;31647:223;:::o;31876:229::-;32016:34;32012:1;32004:6;32000:14;31993:58;32085:12;32080:2;32072:6;32068:15;32061:37;31876:229;:::o;32111:122::-;32184:24;32202:5;32184:24;:::i;:::-;32177:5;32174:35;32164:63;;32223:1;32220;32213:12;32164:63;32111:122;:::o;32239:116::-;32309:21;32324:5;32309:21;:::i;:::-;32302:5;32299:32;32289:60;;32345:1;32342;32335:12;32289:60;32239:116;:::o;32361:122::-;32434:24;32452:5;32434:24;:::i;:::-;32427:5;32424:35;32414:63;;32473:1;32470;32463:12;32414:63;32361:122;:::o;32489:::-;32562:24;32580:5;32562:24;:::i;:::-;32555:5;32552:35;32542:63;;32601:1;32598;32591:12;32542:63;32489:122;:::o
Swarm Source
ipfs://0c5474413004ba8ff5973d8660c9040f6a422e2f68a47f623caa554efd742ec9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000259 | 9,899,764.6818 | $2,566.22 |
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.