More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20148927 | 105 days ago | IN | 0 ETH | 0.00082603 | ||||
Stake | 19694930 | 168 days ago | IN | 0 ETH | 0.00127662 | ||||
Unstake | 19694924 | 168 days ago | IN | 0 ETH | 0.00081738 | ||||
Unstake | 19694922 | 168 days ago | IN | 0 ETH | 0.00030554 | ||||
Claim Earned | 19694909 | 168 days ago | IN | 0 ETH | 0.00036838 | ||||
Claim Earned | 19694909 | 168 days ago | IN | 0 ETH | 0.00145821 | ||||
Stake | 19623807 | 178 days ago | IN | 0 ETH | 0.00326798 | ||||
Stake | 19442670 | 203 days ago | IN | 0 ETH | 0.00623028 | ||||
Stake | 19441596 | 204 days ago | IN | 0 ETH | 0.00987257 | ||||
0x60806040 | 19406550 | 209 days ago | IN | 0 ETH | 0.20632094 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CashcabStaking
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-10 */ // File: cashcab/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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 generally not needed starting with Solidity 0.8, since 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 subtraction 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; } } } // File: cashcab/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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); } } } } // File: cashcab/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: cashcab/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library 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"); } } } // File: cashcab/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // 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; } } // File: cashcab/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: cashcab/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: cashcab/cashcab.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; abstract contract IERC20Staking is ReentrancyGuard, Ownable { struct Plan { uint256 overallStaked; uint256 stakesCount; uint256 apr; uint256 stakeDuration; bool initialPool; bool conclude; } struct Staking { uint256 amount; uint256 stakeAt; uint256 endstakeAt; } mapping(uint256 => mapping(address => Staking[])) public stakes; // Declare state variables for tracking rewards uint256 public totalRewards; mapping(uint256 => uint256) public totalRewardsPerPlan; mapping(address => uint256) public totalEarnedRewardsPerWallet; // Declare state variable for tracking rewards per wallet per plan mapping(uint256 => mapping(address => uint256)) public totalRewardsPerWalletPerPlan; address public stakingToken; mapping(uint256 => Plan) public plans; mapping(address => bool) public blacklist; modifier notBlacklisted() { require(!blacklist[msg.sender], "Address is blacklisted"); _; } constructor(address _stakingToken) { stakingToken = _stakingToken; } function stake(uint256 _stakingId, uint256 _amount) public virtual; function canWithdrawAmount(uint256 _stakingId, address account) public virtual view returns (uint256, uint256); function unstake(uint256 _stakingId, uint256 _amount) public virtual; function earnedToken(uint256 _stakingId, address account) public virtual view returns (uint256); function claimEarned(uint256 _stakingId) public virtual; function getStakedPlans(address _account) public virtual view returns (bool[] memory); } contract CashcabStaking is IERC20Staking { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public periodicTime = 365 days; uint256 public planLimit = 2; uint256 minAPR = 1; constructor(address _stakingToken) IERC20Staking(_stakingToken) { plans[0].apr = 30; plans[0].stakeDuration = 30 days; plans[1].apr = 60; plans[1].stakeDuration = 60 days; } function stake(uint256 _stakingId, uint256 _amount) public nonReentrant override { require(_amount > 0, "Staking Amount cannot be zero"); require( IERC20(stakingToken).balanceOf(msg.sender) >= _amount, "Balance is not enough" ); require(_stakingId < planLimit, "Staking is unavailable"); Plan storage plan = plans[_stakingId]; require(!plan.conclude, "Staking in this pool is concluded"); uint256 beforeBalance = IERC20(stakingToken).balanceOf(address(this)); IERC20(stakingToken).transferFrom(msg.sender, address(this), _amount); uint256 afterBalance = IERC20(stakingToken).balanceOf(address(this)); uint256 amount = afterBalance - beforeBalance; uint256 stakelength = stakes[_stakingId][msg.sender].length; if(stakelength == 0) { plan.stakesCount += 1; } stakes[_stakingId][msg.sender].push(); Staking storage _staking = stakes[_stakingId][msg.sender][stakelength]; _staking.amount = amount; _staking.stakeAt = block.timestamp; _staking.endstakeAt = block.timestamp + plan.stakeDuration; plan.overallStaked = plan.overallStaked.add(amount); } function stakeFor(uint256 _stakingId, uint256 _amount, address _beneficiary) public nonReentrant onlyOwner { require(_amount > 0, "Staking Amount cannot be zero"); require(_stakingId < planLimit, "Staking is unavailable"); require(_beneficiary != address(0), "Beneficiary cannot be zero address"); Plan storage plan = plans[_stakingId]; require(!plan.conclude, "Staking in this pool is concluded"); // Transfer tokens from the sender to the contract uint256 beforeBalance = IERC20(stakingToken).balanceOf(address(this)); IERC20(stakingToken).transferFrom(msg.sender, address(this), _amount); uint256 afterBalance = IERC20(stakingToken).balanceOf(address(this)); uint256 amount = afterBalance.sub(beforeBalance); // Update staking details for the beneficiary uint256 stakelength = stakes[_stakingId][_beneficiary].length; if(stakelength == 0) { plan.stakesCount += 1; } stakes[_stakingId][_beneficiary].push(Staking({ amount: amount, stakeAt: block.timestamp, endstakeAt: block.timestamp + plan.stakeDuration })); plan.overallStaked = plan.overallStaked.add(amount); } function canWithdrawAmount(uint256 _stakingId, address account) public override view returns (uint256, uint256) { uint256 _stakedAmount = 0; uint256 _canWithdraw = 0; for (uint256 i = 0; i < stakes[_stakingId][account].length; i++) { Staking storage _staking = stakes[_stakingId][account][i]; _stakedAmount = _stakedAmount.add(_staking.amount); // Check if the lock duration has ended for each staking if (block.timestamp >= _staking.endstakeAt) { _canWithdraw = _canWithdraw.add(_staking.amount); } } return (_stakedAmount, _canWithdraw); } function earnedToken(uint256 _stakingId, address account) public override view returns (uint256) { uint256 _earned = 0; Plan storage plan = plans[_stakingId]; for (uint256 i = 0; i < stakes[_stakingId][account].length; i++) { Staking storage _staking = stakes[_stakingId][account][i]; _earned = _earned.add( _staking.amount .mul(block.timestamp - _staking.stakeAt) .div(periodicTime) .mul(plan.apr) .div(100) ); } return _earned; } function unstake(uint256 _stakingId, uint256 _amount) public nonReentrant notBlacklisted override { uint256 _stakedAmount; uint256 _canWithdraw; uint256 _earned = 0; Plan storage plan = plans[_stakingId]; // Get the total staked amount and the amount that can be withdrawn (_stakedAmount, _canWithdraw) = canWithdrawAmount(_stakingId, msg.sender); require(_canWithdraw >= _amount, "Withdraw amount exceeds allowed limit"); uint256 remainingAmountToUnstake = _amount; for (uint256 i = stakes[_stakingId][msg.sender].length; i > 0; i--) { Staking storage _staking = stakes[_stakingId][msg.sender][i-1]; // Check if the lock duration has ended if (block.timestamp >= _staking.endstakeAt && remainingAmountToUnstake > 0) { uint256 amountToUnstake = _staking.amount < remainingAmountToUnstake ? _staking.amount : remainingAmountToUnstake; // Calculate earned rewards for this stake _earned += amountToUnstake .mul(block.timestamp - _staking.stakeAt) .div(periodicTime) .mul(plan.apr) .div(100); // Update the staking amount and the amount remaining to be unstaked _staking.amount -= amountToUnstake; remainingAmountToUnstake -= amountToUnstake; } } require(remainingAmountToUnstake == 0, "Unable to unstake the full amount"); // Transfer the unstaked principal amount and earned rewards to the user if (_amount > 0) { IERC20(stakingToken).transfer(msg.sender, _amount); } if (_earned > 0) { IERC20(stakingToken).transfer(msg.sender, _earned); totalRewards = totalRewards.add(_earned); totalRewardsPerPlan[_stakingId] = totalRewardsPerPlan[_stakingId].add(_earned); totalRewardsPerWalletPerPlan[_stakingId][msg.sender] = totalRewardsPerWalletPerPlan[_stakingId][msg.sender].add(_earned); // Update the total earned rewards for the wallet totalEarnedRewardsPerWallet[msg.sender] += _earned; } // Update the overall staked amount in the plan plan.overallStaked = plan.overallStaked.sub(_amount); } function claimEarned(uint256 _stakingId) public override { uint256 _earned = 0; Plan storage plan = plans[_stakingId]; require(stakes[_stakingId][msg.sender].length > 0, "No stakes found"); for (uint256 i = 0; i < stakes[_stakingId][msg.sender].length; i++) { Staking storage _staking = stakes[_stakingId][msg.sender][i]; _earned = _earned.add( _staking .amount .mul(plan.apr) .mul(block.timestamp - _staking.stakeAt) .div(periodicTime) .div(100) ); totalRewards = totalRewards.add(_earned); totalRewardsPerPlan[_stakingId] = totalRewardsPerPlan[_stakingId].add(_earned); totalRewardsPerWalletPerPlan[_stakingId][msg.sender] = totalRewardsPerWalletPerPlan[_stakingId][msg.sender].add(_earned); // Update the total earned rewards for the wallet totalEarnedRewardsPerWallet[msg.sender] += _earned; _staking.stakeAt = block.timestamp; } require(_earned > 0, "There is no amount to claim"); IERC20(stakingToken).transfer(msg.sender, _earned); } function getStakedPlans(address _account) public override view returns (bool[] memory) { bool[] memory walletPlans = new bool[](planLimit); for (uint256 i = 0; i < planLimit; i++) { walletPlans[i] = stakes[i][_account].length == 0 ? false : true; } return walletPlans; } function setAPR(uint256 _stakingId, uint256 _percent) external onlyOwner { plans[_stakingId].apr = _percent; } function setStakeConclude(uint256 _stakingId, bool _conclude) external onlyOwner { plans[_stakingId].conclude = _conclude; } function addToBlacklist(address _address) external onlyOwner { blacklist[_address] = true; } function removeFromBlacklist(address _address) external onlyOwner { blacklist[_address] = false; } // Getter functions to retrieve totalRewards and totalRewardsPerPlan function getTotalRewards() public view returns (uint256) { return totalRewards; } function getTotalRewardsPerPlan(uint256 _stakingId) public view returns (uint256) { return totalRewardsPerPlan[_stakingId]; } // Getter function to retrieve total earned rewards for a specific wallet function getTotalEarnedRewardsPerWallet(address _wallet) public view returns (uint256) { return totalEarnedRewardsPerWallet[_wallet]; } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","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"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"canWithdrawAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"claimEarned","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"earnedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedPlans","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getTotalEarnedRewardsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getTotalRewardsPerPlan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodicTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"planLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"plans","outputs":[{"internalType":"uint256","name":"overallStaked","type":"uint256"},{"internalType":"uint256","name":"stakesCount","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"stakeDuration","type":"uint256"},{"internalType":"bool","name":"initialPool","type":"bool"},{"internalType":"bool","name":"conclude","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"bool","name":"_conclude","type":"bool"}],"name":"setStakeConclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakeAt","type":"uint256"},{"internalType":"uint256","name":"endstakeAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedRewardsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalRewardsPerPlan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"totalRewardsPerWalletPerPlan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526301e13380600a556002600b556001600c553480156200002357600080fd5b50604051620038f3380380620038f3833981810160405281019062000049919062000269565b80600160008190555062000072620000666200013160201b60201c565b6200013960201b60201c565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050601e600860008081526020019081526020016000206002018190555062278d006008600080815260200190815260200160002060030181905550603c600860006001815260200190815260200160002060020181905550624f1a00600860006001815260200190815260200160002060030181905550506200029b565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002318262000204565b9050919050565b620002438162000224565b81146200024f57600080fd5b50565b600081519050620002638162000238565b92915050565b600060208284031215620002825762000281620001ff565b5b6000620002928482850162000252565b91505092915050565b61364880620002ab6000396000f3fe6080604052600436106101a05760003560e01c80638a9640e5116100ec578063b16206161161008a578063e030400b11610064578063e030400b14610623578063e627f2db1461064c578063f2fde38b14610677578063f9f92be4146106a0576101a7565b8063b16206161461057b578063b1b0ebcc146105bd578063c28fc741146105e6576101a7565b80639e2c8a5b116100c65780639e2c8a5b146104ad578063a230561b146104d6578063ae6a490c146104ff578063b1427ac11461053c576101a7565b80638a9640e5146104075780638c972702146104445780638da5cb5b14610482576101a7565b80635792c7a41161015957806372f702f31161013357806372f702f3146103395780637b0472f0146103645780637ca6a0481461038d578063819ba5fe146103ca576101a7565b80635792c7a4146102bc5780636132df35146102f9578063715018a614610322576101a7565b806304c10b9a146101ac5780630e15561a146101d757806320d70ad214610202578063399a967b1461023f57806344337ea11461026a578063537df3b614610293576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101c16106dd565b6040516101ce9190612844565b60405180910390f35b3480156101e357600080fd5b506101ec6106e3565b6040516101f99190612844565b60405180910390f35b34801561020e57600080fd5b50610229600480360381019061022491906128c2565b6106e9565b6040516102369190612844565b60405180910390f35b34801561024b57600080fd5b50610254610701565b6040516102619190612844565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c91906128c2565b610707565b005b34801561029f57600080fd5b506102ba60048036038101906102b591906128c2565b6107de565b005b3480156102c857600080fd5b506102e360048036038101906102de919061291b565b6108b5565b6040516102f09190612844565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061295b565b610a3c565b005b34801561032e57600080fd5b50610337610e9f565b005b34801561034557600080fd5b5061034e610f27565b60405161035b9190612997565b60405180910390f35b34801561037057600080fd5b5061038b600480360381019061038691906129b2565b610f4d565b005b34801561039957600080fd5b506103b460048036038101906103af919061295b565b611513565b6040516103c19190612844565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906128c2565b61152b565b6040516103fe9190612844565b60405180910390f35b34801561041357600080fd5b5061042e600480360381019061042991906128c2565b611574565b60405161043b9190612abc565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061291b565b611679565b604051610479929190612ade565b60405180910390f35b34801561048e57600080fd5b506104976117b3565b6040516104a49190612997565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906129b2565b6117dd565b005b3480156104e257600080fd5b506104fd60048036038101906104f891906129b2565b611e1c565b005b34801561050b57600080fd5b506105266004803603810190610521919061295b565b611eb7565b6040516105339190612844565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190612b07565b611ed4565b60405161057293929190612b5a565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d919061295b565b611f28565b6040516105b496959493929190612ba0565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612c01565b611f7e565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061291b565b612511565b60405161061a9190612844565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190612c80565b612536565b005b34801561065857600080fd5b506106616125e4565b60405161066e9190612844565b60405180910390f35b34801561068357600080fd5b5061069e600480360381019061069991906128c2565b6125ee565b005b3480156106ac57600080fd5b506106c760048036038101906106c291906128c2565b6126e5565b6040516106d49190612cc0565b60405180910390f35b600a5481565b60035481565b60056020528060005260406000206000915090505481565b600b5481565b61070f612705565b73ffffffffffffffffffffffffffffffffffffffff1661072d6117b3565b73ffffffffffffffffffffffffffffffffffffffff1614610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077a90612d38565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6107e6612705565b73ffffffffffffffffffffffffffffffffffffffff166108046117b3565b73ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190612d38565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009050600060086000868152602001908152602001600020905060005b6002600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610a305760006002600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061099557610994612d58565b5b90600052602060002090600302019050610a1a610a0b60646109fd86600201546109ef600a546109e18860010154426109ce9190612db6565b896000015461270d90919063ffffffff16565b61272390919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b8561273990919063ffffffff16565b9350508080610a2890612dea565b9150506108d6565b50819250505092915050565b60008060086000848152602001908152602001600020905060006002600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905011610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190612e7e565b60405180910390fd5b60005b6002600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610db55760006002600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610bac57610bab612d58565b5b90600052602060002090600302019050610c31610c226064610c14600a54610c06866001015442610bdd9190612db6565b610bf88a60020154896000015461270d90919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b61272390919063ffffffff16565b8561273990919063ffffffff16565b9350610c488460035461273990919063ffffffff16565b600381905550610c7484600460008881526020019081526020016000205461273990919063ffffffff16565b6004600087815260200190815260200160002081905550610cee846006600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273990919063ffffffff16565b6006600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d919190612e9e565b92505081905550428160010181905550508080610dad90612dea565b915050610aed565b5060008211610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090612f1e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610e56929190612f3e565b6020604051808303816000875af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e999190612f7c565b50505050565b610ea7612705565b73ffffffffffffffffffffffffffffffffffffffff16610ec56117b3565b73ffffffffffffffffffffffffffffffffffffffff1614610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290612d38565b60405180910390fd5b610f25600061274f565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005403610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990612ff5565b60405180910390fd5b600260008190555060008111610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613061565b60405180910390fd5b80600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110399190612997565b602060405180830381865afa158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190613096565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061310f565b60405180910390fd5b600b5482106110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f69061317b565b60405180910390fd5b60006008600084815260200190815260200160002090508060040160019054906101000a900460ff1615611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f9061320d565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111c59190612997565b602060405180830381865afa1580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112069190613096565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b81526004016112679392919061322d565b6020604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612f7c565b506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113089190612997565b602060405180830381865afa158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613096565b9050600082826113599190612db6565b905060006002600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600081036113d85760018560010160008282546113d09190612e9e565b925050819055505b6002600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001816001815401808255809150500390600052602060002090505060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106114a8576114a7612d58565b5b906000526020600020906003020190508281600001819055504281600101819055508560030154426114da9190612e9e565b81600201819055506114f983876000015461273990919063ffffffff16565b866000018190555050505050505060016000819055505050565b60046020528060005260406000206000915090505481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000600b5467ffffffffffffffff81111561159457611593613264565b5b6040519080825280602002602001820160405280156115c25781602001602082028036833780820191505090505b50905060005b600b5481101561166f5760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014611634576001611637565b60005b82828151811061164a57611649612d58565b5b602002602001019015159081151581525050808061166790612dea565b9150506115c8565b5080915050919050565b60008060008060005b6002600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156117a35760006002600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061174157611740612d58565b5b9060005260206000209060030201905061176881600001548561273990919063ffffffff16565b93508060020154421061178f5761178c81600001548461273990919063ffffffff16565b92505b50808061179b90612dea565b915050611682565b5081819350935050509250929050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005403611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990612ff5565b60405180910390fd5b6002600081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae906132df565b60405180910390fd5b6000806000806008600087815260200190815260200160002090506118dc8633611679565b809450819550505084831015611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613371565b60405180910390fd5b600085905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115611aed576000600260008a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001836119ed9190612db6565b815481106119fe576119fd612d58565b5b9060005260206000209060030201905080600201544210158015611a225750600083115b15611ad957600083826000015410611a3a5783611a40565b81600001545b9050611aa16064611a938760020154611a85600a54611a77886001015442611a689190612db6565b8861270d90919063ffffffff16565b61272390919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b86611aac9190612e9e565b955080826000016000828254611ac29190612db6565b925050819055508084611ad59190612db6565b9350505b508080611ae590613391565b915050611985565b5060008114611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b289061342c565b60405180910390fd5b6000861115611bdc57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401611b97929190612f3e565b6020604051808303816000875af1158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda9190612f7c565b505b6000831115611dec57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401611c42929190612f3e565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190612f7c565b50611c9b8360035461273990919063ffffffff16565b600381905550611cc783600460008a81526020019081526020016000205461273990919063ffffffff16565b6004600089815260200190815260200160002081905550611d4183600660008a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273990919063ffffffff16565b6006600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de49190612e9e565b925050819055505b611e0386836000015461281590919063ffffffff16565b8260000181905550505050505060016000819055505050565b611e24612705565b73ffffffffffffffffffffffffffffffffffffffff16611e426117b3565b73ffffffffffffffffffffffffffffffffffffffff1614611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90612d38565b60405180910390fd5b8060086000848152602001908152602001600020600201819055505050565b600060046000838152602001908152602001600020549050919050565b60026020528260005260406000206020528160005260406000208181548110611efc57600080fd5b906000526020600020906003020160009250925050508060000154908060010154908060020154905083565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16905086565b600260005403611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90612ff5565b60405180910390fd5b6002600081905550611fd3612705565b73ffffffffffffffffffffffffffffffffffffffff16611ff16117b3565b73ffffffffffffffffffffffffffffffffffffffff1614612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90612d38565b60405180910390fd5b6000821161208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190613061565b60405180910390fd5b600b5483106120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c59061317b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361213d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612134906134be565b60405180910390fd5b60006008600085815260200190815260200160002090508060040160019054906101000a900460ff16156121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219d9061320d565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122039190612997565b602060405180830381865afa158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613096565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b81526004016122a59392919061322d565b6020604051808303816000875af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190612f7c565b506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123469190612997565b602060405180830381865afa158015612363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123879190613096565b9050600061239e838361281590919063ffffffff16565b905060006002600089815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506000810361241d5760018560010160008282546124159190612e9e565b925050819055505b6002600089815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020018760030154426124949190612e9e565b815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506124f782866000015461273990919063ffffffff16565b856000018190555050505050506001600081905550505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b61253e612705565b73ffffffffffffffffffffffffffffffffffffffff1661255c6117b3565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990612d38565b60405180910390fd5b806008600084815260200190815260200160002060040160016101000a81548160ff0219169083151502179055505050565b6000600354905090565b6125f6612705565b73ffffffffffffffffffffffffffffffffffffffff166126146117b3565b73ffffffffffffffffffffffffffffffffffffffff161461266a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266190612d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090613550565b60405180910390fd5b6126e28161274f565b50565b60096020528060005260406000206000915054906101000a900460ff1681565b600033905090565b6000818361271b9190613570565b905092915050565b6000818361273191906135e1565b905092915050565b600081836127479190612e9e565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836128239190612db6565b905092915050565b6000819050919050565b61283e8161282b565b82525050565b60006020820190506128596000830184612835565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061288f82612864565b9050919050565b61289f81612884565b81146128aa57600080fd5b50565b6000813590506128bc81612896565b92915050565b6000602082840312156128d8576128d761285f565b5b60006128e6848285016128ad565b91505092915050565b6128f88161282b565b811461290357600080fd5b50565b600081359050612915816128ef565b92915050565b600080604083850312156129325761293161285f565b5b600061294085828601612906565b9250506020612951858286016128ad565b9150509250929050565b6000602082840312156129715761297061285f565b5b600061297f84828501612906565b91505092915050565b61299181612884565b82525050565b60006020820190506129ac6000830184612988565b92915050565b600080604083850312156129c9576129c861285f565b5b60006129d785828601612906565b92505060206129e885828601612906565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b612a3381612a1e565b82525050565b6000612a458383612a2a565b60208301905092915050565b6000602082019050919050565b6000612a69826129f2565b612a7381856129fd565b9350612a7e83612a0e565b8060005b83811015612aaf578151612a968882612a39565b9750612aa183612a51565b925050600181019050612a82565b5085935050505092915050565b60006020820190508181036000830152612ad68184612a5e565b905092915050565b6000604082019050612af36000830185612835565b612b006020830184612835565b9392505050565b600080600060608486031215612b2057612b1f61285f565b5b6000612b2e86828701612906565b9350506020612b3f868287016128ad565b9250506040612b5086828701612906565b9150509250925092565b6000606082019050612b6f6000830186612835565b612b7c6020830185612835565b612b896040830184612835565b949350505050565b612b9a81612a1e565b82525050565b600060c082019050612bb56000830189612835565b612bc26020830188612835565b612bcf6040830187612835565b612bdc6060830186612835565b612be96080830185612b91565b612bf660a0830184612b91565b979650505050505050565b600080600060608486031215612c1a57612c1961285f565b5b6000612c2886828701612906565b9350506020612c3986828701612906565b9250506040612c4a868287016128ad565b9150509250925092565b612c5d81612a1e565b8114612c6857600080fd5b50565b600081359050612c7a81612c54565b92915050565b60008060408385031215612c9757612c9661285f565b5b6000612ca585828601612906565b9250506020612cb685828601612c6b565b9150509250929050565b6000602082019050612cd56000830184612b91565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d22602083612cdb565b9150612d2d82612cec565b602082019050919050565b60006020820190508181036000830152612d5181612d15565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dc18261282b565b9150612dcc8361282b565b9250828203905081811115612de457612de3612d87565b5b92915050565b6000612df58261282b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e2757612e26612d87565b5b600182019050919050565b7f4e6f207374616b657320666f756e640000000000000000000000000000000000600082015250565b6000612e68600f83612cdb565b9150612e7382612e32565b602082019050919050565b60006020820190508181036000830152612e9781612e5b565b9050919050565b6000612ea98261282b565b9150612eb48361282b565b9250828201905080821115612ecc57612ecb612d87565b5b92915050565b7f5468657265206973206e6f20616d6f756e7420746f20636c61696d0000000000600082015250565b6000612f08601b83612cdb565b9150612f1382612ed2565b602082019050919050565b60006020820190508181036000830152612f3781612efb565b9050919050565b6000604082019050612f536000830185612988565b612f606020830184612835565b9392505050565b600081519050612f7681612c54565b92915050565b600060208284031215612f9257612f9161285f565b5b6000612fa084828501612f67565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612fdf601f83612cdb565b9150612fea82612fa9565b602082019050919050565b6000602082019050818103600083015261300e81612fd2565b9050919050565b7f5374616b696e6720416d6f756e742063616e6e6f74206265207a65726f000000600082015250565b600061304b601d83612cdb565b915061305682613015565b602082019050919050565b6000602082019050818103600083015261307a8161303e565b9050919050565b600081519050613090816128ef565b92915050565b6000602082840312156130ac576130ab61285f565b5b60006130ba84828501613081565b91505092915050565b7f42616c616e6365206973206e6f7420656e6f7567680000000000000000000000600082015250565b60006130f9601583612cdb565b9150613104826130c3565b602082019050919050565b60006020820190508181036000830152613128816130ec565b9050919050565b7f5374616b696e6720697320756e617661696c61626c6500000000000000000000600082015250565b6000613165601683612cdb565b91506131708261312f565b602082019050919050565b6000602082019050818103600083015261319481613158565b9050919050565b7f5374616b696e6720696e207468697320706f6f6c20697320636f6e636c75646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006131f7602183612cdb565b91506132028261319b565b604082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b60006060820190506132426000830186612988565b61324f6020830185612988565b61325c6040830184612835565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4164647265737320697320626c61636b6c697374656400000000000000000000600082015250565b60006132c9601683612cdb565b91506132d482613293565b602082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f576974686472617720616d6f756e74206578636565647320616c6c6f7765642060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b600061335b602583612cdb565b9150613366826132ff565b604082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b600061339c8261282b565b9150600082036133af576133ae612d87565b5b600182039050919050565b7f556e61626c6520746f20756e7374616b65207468652066756c6c20616d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613416602183612cdb565b9150613421826133ba565b604082019050919050565b6000602082019050818103600083015261344581613409565b9050919050565b7f42656e65666963696172792063616e6e6f74206265207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a8602283612cdb565b91506134b38261344c565b604082019050919050565b600060208201905081810360008301526134d78161349b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061353a602683612cdb565b9150613545826134de565b604082019050919050565b600060208201905081810360008301526135698161352d565b9050919050565b600061357b8261282b565b91506135868361282b565b92508282026135948161282b565b915082820484148315176135ab576135aa612d87565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135ec8261282b565b91506135f78361282b565b925082613607576136066135b2565b5b82820490509291505056fea264697066735822122098b03542faa8f7af9519c328d4ddfb51b97812a509a6066aaa8418a5f62d873764736f6c6343000813003300000000000000000000000073af41fe7054057218e0eb07fe43ba5f25c7d79f
Deployed Bytecode
0x6080604052600436106101a05760003560e01c80638a9640e5116100ec578063b16206161161008a578063e030400b11610064578063e030400b14610623578063e627f2db1461064c578063f2fde38b14610677578063f9f92be4146106a0576101a7565b8063b16206161461057b578063b1b0ebcc146105bd578063c28fc741146105e6576101a7565b80639e2c8a5b116100c65780639e2c8a5b146104ad578063a230561b146104d6578063ae6a490c146104ff578063b1427ac11461053c576101a7565b80638a9640e5146104075780638c972702146104445780638da5cb5b14610482576101a7565b80635792c7a41161015957806372f702f31161013357806372f702f3146103395780637b0472f0146103645780637ca6a0481461038d578063819ba5fe146103ca576101a7565b80635792c7a4146102bc5780636132df35146102f9578063715018a614610322576101a7565b806304c10b9a146101ac5780630e15561a146101d757806320d70ad214610202578063399a967b1461023f57806344337ea11461026a578063537df3b614610293576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101c16106dd565b6040516101ce9190612844565b60405180910390f35b3480156101e357600080fd5b506101ec6106e3565b6040516101f99190612844565b60405180910390f35b34801561020e57600080fd5b50610229600480360381019061022491906128c2565b6106e9565b6040516102369190612844565b60405180910390f35b34801561024b57600080fd5b50610254610701565b6040516102619190612844565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c91906128c2565b610707565b005b34801561029f57600080fd5b506102ba60048036038101906102b591906128c2565b6107de565b005b3480156102c857600080fd5b506102e360048036038101906102de919061291b565b6108b5565b6040516102f09190612844565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061295b565b610a3c565b005b34801561032e57600080fd5b50610337610e9f565b005b34801561034557600080fd5b5061034e610f27565b60405161035b9190612997565b60405180910390f35b34801561037057600080fd5b5061038b600480360381019061038691906129b2565b610f4d565b005b34801561039957600080fd5b506103b460048036038101906103af919061295b565b611513565b6040516103c19190612844565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906128c2565b61152b565b6040516103fe9190612844565b60405180910390f35b34801561041357600080fd5b5061042e600480360381019061042991906128c2565b611574565b60405161043b9190612abc565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061291b565b611679565b604051610479929190612ade565b60405180910390f35b34801561048e57600080fd5b506104976117b3565b6040516104a49190612997565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906129b2565b6117dd565b005b3480156104e257600080fd5b506104fd60048036038101906104f891906129b2565b611e1c565b005b34801561050b57600080fd5b506105266004803603810190610521919061295b565b611eb7565b6040516105339190612844565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190612b07565b611ed4565b60405161057293929190612b5a565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d919061295b565b611f28565b6040516105b496959493929190612ba0565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612c01565b611f7e565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061291b565b612511565b60405161061a9190612844565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190612c80565b612536565b005b34801561065857600080fd5b506106616125e4565b60405161066e9190612844565b60405180910390f35b34801561068357600080fd5b5061069e600480360381019061069991906128c2565b6125ee565b005b3480156106ac57600080fd5b506106c760048036038101906106c291906128c2565b6126e5565b6040516106d49190612cc0565b60405180910390f35b600a5481565b60035481565b60056020528060005260406000206000915090505481565b600b5481565b61070f612705565b73ffffffffffffffffffffffffffffffffffffffff1661072d6117b3565b73ffffffffffffffffffffffffffffffffffffffff1614610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077a90612d38565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6107e6612705565b73ffffffffffffffffffffffffffffffffffffffff166108046117b3565b73ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190612d38565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009050600060086000868152602001908152602001600020905060005b6002600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610a305760006002600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061099557610994612d58565b5b90600052602060002090600302019050610a1a610a0b60646109fd86600201546109ef600a546109e18860010154426109ce9190612db6565b896000015461270d90919063ffffffff16565b61272390919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b8561273990919063ffffffff16565b9350508080610a2890612dea565b9150506108d6565b50819250505092915050565b60008060086000848152602001908152602001600020905060006002600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905011610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190612e7e565b60405180910390fd5b60005b6002600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610db55760006002600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610bac57610bab612d58565b5b90600052602060002090600302019050610c31610c226064610c14600a54610c06866001015442610bdd9190612db6565b610bf88a60020154896000015461270d90919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b61272390919063ffffffff16565b8561273990919063ffffffff16565b9350610c488460035461273990919063ffffffff16565b600381905550610c7484600460008881526020019081526020016000205461273990919063ffffffff16565b6004600087815260200190815260200160002081905550610cee846006600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273990919063ffffffff16565b6006600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d919190612e9e565b92505081905550428160010181905550508080610dad90612dea565b915050610aed565b5060008211610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090612f1e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610e56929190612f3e565b6020604051808303816000875af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e999190612f7c565b50505050565b610ea7612705565b73ffffffffffffffffffffffffffffffffffffffff16610ec56117b3565b73ffffffffffffffffffffffffffffffffffffffff1614610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290612d38565b60405180910390fd5b610f25600061274f565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005403610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990612ff5565b60405180910390fd5b600260008190555060008111610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613061565b60405180910390fd5b80600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110399190612997565b602060405180830381865afa158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190613096565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061310f565b60405180910390fd5b600b5482106110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f69061317b565b60405180910390fd5b60006008600084815260200190815260200160002090508060040160019054906101000a900460ff1615611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f9061320d565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111c59190612997565b602060405180830381865afa1580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112069190613096565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b81526004016112679392919061322d565b6020604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612f7c565b506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113089190612997565b602060405180830381865afa158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613096565b9050600082826113599190612db6565b905060006002600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600081036113d85760018560010160008282546113d09190612e9e565b925050819055505b6002600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001816001815401808255809150500390600052602060002090505060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106114a8576114a7612d58565b5b906000526020600020906003020190508281600001819055504281600101819055508560030154426114da9190612e9e565b81600201819055506114f983876000015461273990919063ffffffff16565b866000018190555050505050505060016000819055505050565b60046020528060005260406000206000915090505481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000600b5467ffffffffffffffff81111561159457611593613264565b5b6040519080825280602002602001820160405280156115c25781602001602082028036833780820191505090505b50905060005b600b5481101561166f5760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014611634576001611637565b60005b82828151811061164a57611649612d58565b5b602002602001019015159081151581525050808061166790612dea565b9150506115c8565b5080915050919050565b60008060008060005b6002600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156117a35760006002600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061174157611740612d58565b5b9060005260206000209060030201905061176881600001548561273990919063ffffffff16565b93508060020154421061178f5761178c81600001548461273990919063ffffffff16565b92505b50808061179b90612dea565b915050611682565b5081819350935050509250929050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005403611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990612ff5565b60405180910390fd5b6002600081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae906132df565b60405180910390fd5b6000806000806008600087815260200190815260200160002090506118dc8633611679565b809450819550505084831015611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613371565b60405180910390fd5b600085905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115611aed576000600260008a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001836119ed9190612db6565b815481106119fe576119fd612d58565b5b9060005260206000209060030201905080600201544210158015611a225750600083115b15611ad957600083826000015410611a3a5783611a40565b81600001545b9050611aa16064611a938760020154611a85600a54611a77886001015442611a689190612db6565b8861270d90919063ffffffff16565b61272390919063ffffffff16565b61270d90919063ffffffff16565b61272390919063ffffffff16565b86611aac9190612e9e565b955080826000016000828254611ac29190612db6565b925050819055508084611ad59190612db6565b9350505b508080611ae590613391565b915050611985565b5060008114611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b289061342c565b60405180910390fd5b6000861115611bdc57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401611b97929190612f3e565b6020604051808303816000875af1158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda9190612f7c565b505b6000831115611dec57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401611c42929190612f3e565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190612f7c565b50611c9b8360035461273990919063ffffffff16565b600381905550611cc783600460008a81526020019081526020016000205461273990919063ffffffff16565b6004600089815260200190815260200160002081905550611d4183600660008a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273990919063ffffffff16565b6006600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de49190612e9e565b925050819055505b611e0386836000015461281590919063ffffffff16565b8260000181905550505050505060016000819055505050565b611e24612705565b73ffffffffffffffffffffffffffffffffffffffff16611e426117b3565b73ffffffffffffffffffffffffffffffffffffffff1614611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90612d38565b60405180910390fd5b8060086000848152602001908152602001600020600201819055505050565b600060046000838152602001908152602001600020549050919050565b60026020528260005260406000206020528160005260406000208181548110611efc57600080fd5b906000526020600020906003020160009250925050508060000154908060010154908060020154905083565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16905086565b600260005403611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90612ff5565b60405180910390fd5b6002600081905550611fd3612705565b73ffffffffffffffffffffffffffffffffffffffff16611ff16117b3565b73ffffffffffffffffffffffffffffffffffffffff1614612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90612d38565b60405180910390fd5b6000821161208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190613061565b60405180910390fd5b600b5483106120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c59061317b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361213d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612134906134be565b60405180910390fd5b60006008600085815260200190815260200160002090508060040160019054906101000a900460ff16156121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219d9061320d565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122039190612997565b602060405180830381865afa158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613096565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b81526004016122a59392919061322d565b6020604051808303816000875af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190612f7c565b506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123469190612997565b602060405180830381865afa158015612363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123879190613096565b9050600061239e838361281590919063ffffffff16565b905060006002600089815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506000810361241d5760018560010160008282546124159190612e9e565b925050819055505b6002600089815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020018760030154426124949190612e9e565b815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506124f782866000015461273990919063ffffffff16565b856000018190555050505050506001600081905550505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b61253e612705565b73ffffffffffffffffffffffffffffffffffffffff1661255c6117b3565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990612d38565b60405180910390fd5b806008600084815260200190815260200160002060040160016101000a81548160ff0219169083151502179055505050565b6000600354905090565b6125f6612705565b73ffffffffffffffffffffffffffffffffffffffff166126146117b3565b73ffffffffffffffffffffffffffffffffffffffff161461266a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266190612d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090613550565b60405180910390fd5b6126e28161274f565b50565b60096020528060005260406000206000915054906101000a900460ff1681565b600033905090565b6000818361271b9190613570565b905092915050565b6000818361273191906135e1565b905092915050565b600081836127479190612e9e565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836128239190612db6565b905092915050565b6000819050919050565b61283e8161282b565b82525050565b60006020820190506128596000830184612835565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061288f82612864565b9050919050565b61289f81612884565b81146128aa57600080fd5b50565b6000813590506128bc81612896565b92915050565b6000602082840312156128d8576128d761285f565b5b60006128e6848285016128ad565b91505092915050565b6128f88161282b565b811461290357600080fd5b50565b600081359050612915816128ef565b92915050565b600080604083850312156129325761293161285f565b5b600061294085828601612906565b9250506020612951858286016128ad565b9150509250929050565b6000602082840312156129715761297061285f565b5b600061297f84828501612906565b91505092915050565b61299181612884565b82525050565b60006020820190506129ac6000830184612988565b92915050565b600080604083850312156129c9576129c861285f565b5b60006129d785828601612906565b92505060206129e885828601612906565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b612a3381612a1e565b82525050565b6000612a458383612a2a565b60208301905092915050565b6000602082019050919050565b6000612a69826129f2565b612a7381856129fd565b9350612a7e83612a0e565b8060005b83811015612aaf578151612a968882612a39565b9750612aa183612a51565b925050600181019050612a82565b5085935050505092915050565b60006020820190508181036000830152612ad68184612a5e565b905092915050565b6000604082019050612af36000830185612835565b612b006020830184612835565b9392505050565b600080600060608486031215612b2057612b1f61285f565b5b6000612b2e86828701612906565b9350506020612b3f868287016128ad565b9250506040612b5086828701612906565b9150509250925092565b6000606082019050612b6f6000830186612835565b612b7c6020830185612835565b612b896040830184612835565b949350505050565b612b9a81612a1e565b82525050565b600060c082019050612bb56000830189612835565b612bc26020830188612835565b612bcf6040830187612835565b612bdc6060830186612835565b612be96080830185612b91565b612bf660a0830184612b91565b979650505050505050565b600080600060608486031215612c1a57612c1961285f565b5b6000612c2886828701612906565b9350506020612c3986828701612906565b9250506040612c4a868287016128ad565b9150509250925092565b612c5d81612a1e565b8114612c6857600080fd5b50565b600081359050612c7a81612c54565b92915050565b60008060408385031215612c9757612c9661285f565b5b6000612ca585828601612906565b9250506020612cb685828601612c6b565b9150509250929050565b6000602082019050612cd56000830184612b91565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d22602083612cdb565b9150612d2d82612cec565b602082019050919050565b60006020820190508181036000830152612d5181612d15565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dc18261282b565b9150612dcc8361282b565b9250828203905081811115612de457612de3612d87565b5b92915050565b6000612df58261282b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e2757612e26612d87565b5b600182019050919050565b7f4e6f207374616b657320666f756e640000000000000000000000000000000000600082015250565b6000612e68600f83612cdb565b9150612e7382612e32565b602082019050919050565b60006020820190508181036000830152612e9781612e5b565b9050919050565b6000612ea98261282b565b9150612eb48361282b565b9250828201905080821115612ecc57612ecb612d87565b5b92915050565b7f5468657265206973206e6f20616d6f756e7420746f20636c61696d0000000000600082015250565b6000612f08601b83612cdb565b9150612f1382612ed2565b602082019050919050565b60006020820190508181036000830152612f3781612efb565b9050919050565b6000604082019050612f536000830185612988565b612f606020830184612835565b9392505050565b600081519050612f7681612c54565b92915050565b600060208284031215612f9257612f9161285f565b5b6000612fa084828501612f67565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612fdf601f83612cdb565b9150612fea82612fa9565b602082019050919050565b6000602082019050818103600083015261300e81612fd2565b9050919050565b7f5374616b696e6720416d6f756e742063616e6e6f74206265207a65726f000000600082015250565b600061304b601d83612cdb565b915061305682613015565b602082019050919050565b6000602082019050818103600083015261307a8161303e565b9050919050565b600081519050613090816128ef565b92915050565b6000602082840312156130ac576130ab61285f565b5b60006130ba84828501613081565b91505092915050565b7f42616c616e6365206973206e6f7420656e6f7567680000000000000000000000600082015250565b60006130f9601583612cdb565b9150613104826130c3565b602082019050919050565b60006020820190508181036000830152613128816130ec565b9050919050565b7f5374616b696e6720697320756e617661696c61626c6500000000000000000000600082015250565b6000613165601683612cdb565b91506131708261312f565b602082019050919050565b6000602082019050818103600083015261319481613158565b9050919050565b7f5374616b696e6720696e207468697320706f6f6c20697320636f6e636c75646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006131f7602183612cdb565b91506132028261319b565b604082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b60006060820190506132426000830186612988565b61324f6020830185612988565b61325c6040830184612835565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4164647265737320697320626c61636b6c697374656400000000000000000000600082015250565b60006132c9601683612cdb565b91506132d482613293565b602082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f576974686472617720616d6f756e74206578636565647320616c6c6f7765642060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b600061335b602583612cdb565b9150613366826132ff565b604082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b600061339c8261282b565b9150600082036133af576133ae612d87565b5b600182039050919050565b7f556e61626c6520746f20756e7374616b65207468652066756c6c20616d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613416602183612cdb565b9150613421826133ba565b604082019050919050565b6000602082019050818103600083015261344581613409565b9050919050565b7f42656e65666963696172792063616e6e6f74206265207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a8602283612cdb565b91506134b38261344c565b604082019050919050565b600060208201905081810360008301526134d78161349b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061353a602683612cdb565b9150613545826134de565b604082019050919050565b600060208201905081810360008301526135698161352d565b9050919050565b600061357b8261282b565b91506135868361282b565b92508282026135948161282b565b915082820484148315176135ab576135aa612d87565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135ec8261282b565b91506135f78361282b565b925082613607576136066135b2565b5b82820490509291505056fea264697066735822122098b03542faa8f7af9519c328d4ddfb51b97812a509a6066aaa8418a5f62d873764736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000073af41fe7054057218e0eb07fe43ba5f25c7d79f
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x73af41fe7054057218E0EB07Fe43bA5f25c7D79F
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000073af41fe7054057218e0eb07fe43ba5f25c7d79f
Deployed Bytecode Sourcemap
30207:9640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30323:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29013:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29108:62;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30368:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39019:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39133:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33986:633;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37092:1309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27588:103;;;;;;;;;;;;;:::i;:::-;;29345:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30667:1313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29047:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39658:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38409:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33291:687;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;26937:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34627:2457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38741:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39432:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28888:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;29379:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;31988:1295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29251:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38873:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39329:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27846:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29423:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30323:38;;;;:::o;29013:27::-;;;;:::o;29108:62::-;;;;;;;;;;;;;;;;;:::o;30368:28::-;;;;:::o;39019:106::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39113:4:::1;39091:9;:19;39101:8;39091:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;39019:106:::0;:::o;39133:112::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39232:5:::1;39210:9;:19;39220:8;39210:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;39133:112:::0;:::o;33986:633::-;34074:7;34094:15;34112:1;34094:19;;34124:17;34144:5;:17;34150:10;34144:17;;;;;;;;;;;34124:37;;34187:9;34182:403;34206:6;:18;34213:10;34206:18;;;;;;;;;;;:27;34225:7;34206:27;;;;;;;;;;;;;;;:34;;;;34202:1;:38;34182:403;;;34262:24;34289:6;:18;34296:10;34289:18;;;;;;;;;;;:27;34308:7;34289:27;;;;;;;;;;;;;;;34317:1;34289:30;;;;;;;;:::i;:::-;;;;;;;;;;;;34262:57;;34344:229;34374:184;34554:3;34374:153;34518:4;:8;;;34374:117;34478:12;;34374:77;34434:8;:16;;;34416:15;:34;;;;:::i;:::-;34374:8;:15;;;:41;;:77;;;;:::i;:::-;:103;;:117;;;;:::i;:::-;:143;;:153;;;;:::i;:::-;:179;;:184;;;;:::i;:::-;34344:7;:11;;:229;;;;:::i;:::-;34334:239;;34247:338;34242:3;;;;;:::i;:::-;;;;34182:403;;;;34604:7;34597:14;;;;33986:633;;;;:::o;37092:1309::-;37160:15;37190:17;37210:5;:17;37216:10;37210:17;;;;;;;;;;;37190:37;;37288:1;37248:6;:18;37255:10;37248:18;;;;;;;;;;;:30;37267:10;37248:30;;;;;;;;;;;;;;;:37;;;;:41;37240:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37327:9;37322:949;37346:6;:18;37353:10;37346:18;;;;;;;;;;;:30;37365:10;37346:30;;;;;;;;;;;;;;;:37;;;;37342:1;:41;37322:949;;;37405:24;37432:6;:18;37439:10;37432:18;;;;;;;;;;;:30;37451:10;37432:30;;;;;;;;;;;;;;;37463:1;37432:33;;;;;;;;:::i;:::-;;;;;;;;;;;;37405:60;;37504:251;37534:206;37736:3;37534:175;37696:12;;37534:135;37652:8;:16;;;37634:15;:34;;;;:::i;:::-;37534:73;37598:4;:8;;;37534;:37;;;:63;;:73;;;;:::i;:::-;:99;;:135;;;;:::i;:::-;:161;;:175;;;;:::i;:::-;:201;;:206;;;;:::i;:::-;37504:7;:11;;:251;;;;:::i;:::-;37494:261;;37787:25;37804:7;37787:12;;:16;;:25;;;;:::i;:::-;37772:12;:40;;;;37861:44;37897:7;37861:19;:31;37881:10;37861:31;;;;;;;;;;;;:35;;:44;;;;:::i;:::-;37827:19;:31;37847:10;37827:31;;;;;;;;;;;:78;;;;37977:65;38034:7;37977:28;:40;38006:10;37977:40;;;;;;;;;;;:52;38018:10;37977:52;;;;;;;;;;;;;;;;:56;;:65;;;;:::i;:::-;37922:28;:40;37951:10;37922:40;;;;;;;;;;;:52;37963:10;37922:52;;;;;;;;;;;;;;;:120;;;;38165:7;38122:27;:39;38150:10;38122:39;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;38230:15;38211:8;:16;;:34;;;;37390:881;37385:3;;;;;:::i;:::-;;;;37322:949;;;;38299:1;38289:7;:11;38281:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38350:12;;;;;;;;;;;38343:29;;;38373:10;38385:7;38343:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37149:1252;;37092:1309;:::o;27588:103::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27653:30:::1;27680:1;27653:18;:30::i;:::-;27588:103::o:0;29345:27::-;;;;;;;;;;;;;:::o;30667:1313::-;24084:1;24682:7;;:19;24674:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24084:1;24815:7;:18;;;;30777:1:::1;30767:7;:11;30759:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;30891:7;30852:12;;;;;;;;;;;30845:30;;;30876:10;30845:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;30823:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;30979:9;;30966:10;:22;30958:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31036:17;31056:5;:17;31062:10;31056:17;;;;;;;;;;;31036:37;;31093:4;:13;;;;;;;;;;;;31092:14;31084:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31157:21;31188:12;;;;;;;;;;;31181:30;;;31220:4;31181:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31157:69;;31244:12;;;;;;;;;;;31237:33;;;31271:10;31291:4;31298:7;31237:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31317:20;31347:12;;;;;;;;;;;31340:30;;;31379:4;31340:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31317:68;;31396:14;31428:13;31413:12;:28;;;;:::i;:::-;31396:45;;31462:19;31484:6;:18;31491:10;31484:18;;;;;;;;;;;:30;31503:10;31484:30;;;;;;;;;;;;;;;:37;;;;31462:59;;31560:1;31545:11;:16:::0;31542:69:::1;;31598:1;31578:4;:16;;;:21;;;;;;;:::i;:::-;;;;;;;;31542:69;31623:6;:18;31630:10;31623:18;;;;;;;;;;;:30;31642:10;31623:30;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;::::0;;31681:24:::1;31708:6;:18;31715:10;31708:18;;;;;;;;;;;:30;31727:10;31708:30;;;;;;;;;;;;;;;31739:11;31708:43;;;;;;;;:::i;:::-;;;;;;;;;;;;31681:70;;31780:6;31762:8;:15;;:24;;;;31816:15;31797:8;:16;;:34;;;;31882:4;:18;;;31864:15;:36;;;;:::i;:::-;31842:8;:19;;:58;;;;31942:30;31965:6;31942:4;:18;;;:22;;:30;;;;:::i;:::-;31921:4;:18;;:51;;;;30748:1232;;;;;;24040:1:::0;24994:7;:22;;;;30667:1313;;:::o;29047:54::-;;;;;;;;;;;;;;;;;:::o;39658:149::-;39736:7;39763:27;:36;39791:7;39763:36;;;;;;;;;;;;;;;;39756:43;;39658:149;;;:::o;38409:324::-;38481:13;38507:25;38546:9;;38535:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38507:49;;38572:9;38567:130;38591:9;;38587:1;:13;38567:130;;;38669:1;38639:6;:9;38646:1;38639:9;;;;;;;;;;;:19;38649:8;38639:19;;;;;;;;;;;;;;;:26;;;;:31;:46;;38681:4;38639:46;;;38673:5;38639:46;38622:11;38634:1;38622:14;;;;;;;;:::i;:::-;;;;;;;:63;;;;;;;;;;;38602:3;;;;;:::i;:::-;;;;38567:130;;;;38714:11;38707:18;;;38409:324;;;:::o;33291:687::-;33385:7;33394;33414:21;33450:20;33500:9;33495:427;33519:6;:18;33526:10;33519:18;;;;;;;;;;;:27;33538:7;33519:27;;;;;;;;;;;;;;;:34;;;;33515:1;:38;33495:427;;;33575:24;33602:6;:18;33609:10;33602:18;;;;;;;;;;;:27;33621:7;33602:27;;;;;;;;;;;;;;;33630:1;33602:30;;;;;;;;:::i;:::-;;;;;;;;;;;;33575:57;;33663:34;33681:8;:15;;;33663:13;:17;;:34;;;;:::i;:::-;33647:50;;33807:8;:19;;;33788:15;:38;33784:127;;33862:33;33879:8;:15;;;33862:12;:16;;:33;;;;:::i;:::-;33847:48;;33784:127;33560:362;33555:3;;;;;:::i;:::-;;;;33495:427;;;;33942:13;33957:12;33934:36;;;;;;33291:687;;;;;:::o;26937:87::-;26983:7;27010:6;;;;;;;;;;;27003:13;;26937:87;:::o;34627:2457::-;24084:1;24682:7;;:19;24674:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24084:1;24815:7;:18;;;;29519:9:::1;:21;29529:10;29519:21;;;;;;;;;;;;;;;;;;;;;;;;;29518:22;29510:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34736:21:::2;34768:20:::0;34799:15:::2;34831:17:::0;34851:5:::2;:17;34857:10;34851:17;;;;;;;;;;;34831:37;;34990:41;35008:10;35020;34990:17;:41::i;:::-;34958:73;;;;;;;;35066:7;35050:12;:23;;35042:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35128:32;35163:7;35128:42;;35196:9;35208:6;:18;35215:10;35208:18;;;;;;;;;;;:30;35227:10;35208:30;;;;;;;;;;;;;;;:37;;;;35196:49;;35191:945;35251:1;35247;:5;35191:945;;;35274:24;35301:6;:18;35308:10;35301:18;;;;;;;;;;;:30;35320:10;35301:30;;;;;;;;;;;;;;;35334:1;35332;:3;;;;:::i;:::-;35301:35;;;;;;;;:::i;:::-;;;;;;;;;;;;35274:62;;35429:8;:19;;;35410:15;:38;;:70;;;;;35479:1;35452:24;:28;35410:70;35406:719;;;35501:23;35545:24;35527:8;:15;;;:42;:87;;35590:24;35527:87;;;35572:8;:15;;;35527:87;35501:113;;35706:200;35902:3;35706:165;35862:4;:8;;;35706:125;35818:12;;35706:81;35770:8;:16;;;35752:15;:34;;;;:::i;:::-;35706:15;:45;;:81;;;;:::i;:::-;:111;;:125;;;;:::i;:::-;:155;;:165;;;;:::i;:::-;:195;;:200;;;;:::i;:::-;35695:211;;;;;:::i;:::-;;;36032:15;36013:8;:15;;;:34;;;;;;;:::i;:::-;;;;;;;;36094:15;36066:43;;;;;:::i;:::-;;;35482:643;35406:719;35259:877;35254:3;;;;;:::i;:::-;;;;35191:945;;;;36184:1;36156:24;:29;36148:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36332:1;36322:7;:11;36318:94;;;36357:12;;;;;;;;;;;36350:29;;;36380:10;36392:7;36350:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36318:94;36446:1;36436:7;:11;36432:523;;;36471:12;;;;;;;;;;;36464:29;;;36494:10;36506:7;36464:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36558:25;36575:7;36558:12;;:16;;:25;;;;:::i;:::-;36543:12;:40;;;;36632:44;36668:7;36632:19;:31;36652:10;36632:31;;;;;;;;;;;;:35;;:44;;;;:::i;:::-;36598:19;:31;36618:10;36598:31;;;;;;;;;;;:78;;;;36748:65;36805:7;36748:28;:40;36777:10;36748:40;;;;;;;;;;;:52;36789:10;36748:52;;;;;;;;;;;;;;;;:56;;:65;;;;:::i;:::-;36693:28;:40;36722:10;36693:40;;;;;;;;;;;:52;36734:10;36693:52;;;;;;;;;;;;;;;:120;;;;36936:7;36893:27;:39;36921:10;36893:39;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;36432:523;37045:31;37068:7;37045:4;:18;;;:22;;:31;;;;:::i;:::-;37024:4;:18;;:52;;;;34725:2359;;;;;24040:1:::0;24994:7;:22;;;;34627:2457;;:::o;38741:124::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38849:8:::1;38825:5;:17;38831:10;38825:17;;;;;;;;;;;:21;;:32;;;;38741:124:::0;;:::o;39432:139::-;39505:7;39532:19;:31;39552:10;39532:31;;;;;;;;;;;;39525:38;;39432:139;;;:::o;28888:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29379:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31988:1295::-;24084:1;24682:7;;:19;24674:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24084:1;24815:7;:18;;;;27168:12:::1;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32124:1:::2;32114:7;:11;32106:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32191:9;;32178:10;:22;32170:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32270:1;32246:26;;:12;:26;;::::0;32238:73:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;32324:17;32344:5;:17;32350:10;32344:17;;;;;;;;;;;32324:37;;32381:4;:13;;;;;;;;;;;;32380:14;32372:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;32505:21;32536:12;;;;;;;;;;;32529:30;;;32568:4;32529:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32505:69;;32592:12;;;;;;;;;;;32585:33;;;32619:10;32639:4;32646:7;32585:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32665:20;32695:12;;;;;;;;;;;32688:30;;;32727:4;32688:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32665:68;;32744:14;32761:31;32778:13;32761:12;:16;;:31;;;;:::i;:::-;32744:48;;32860:19;32882:6;:18;32889:10;32882:18;;;;;;;;;;;:32;32901:12;32882:32;;;;;;;;;;;;;;;:39;;;;32860:61;;32950:1;32935:11;:16:::0;32932:69:::2;;32988:1;32968:4;:16;;;:21;;;;;;;:::i;:::-;;;;;;;;32932:69;33013:6;:18;33020:10;33013:18;;;;;;;;;;;:32;33032:12;33013:32;;;;;;;;;;;;;;;33051:151;;;;;;;;33082:6;33051:151;;;;33112:15;33051:151;;;;33172:4;:18;;;33154:15;:36;;;;:::i;:::-;33051:151;;::::0;33013:190:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33245:30;33268:6;33245:4;:18;;;:22;;:30;;;;:::i;:::-;33224:4;:18;;:51;;;;32095:1188;;;;;24040:1:::0;24994:7;:22;;;;31988:1295;;;:::o;29251:83::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38873:138::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38994:9:::1;38965:5;:17;38971:10;38965:17;;;;;;;;;;;:26;;;:38;;;;;;;;;;;;;;;;;;38873:138:::0;;:::o;39329:95::-;39377:7;39404:12;;39397:19;;39329:95;:::o;27846:201::-;27168:12;:10;:12::i;:::-;27157:23;;:7;:5;:7::i;:::-;:23;;;27149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27955:1:::1;27935:22;;:8;:22;;::::0;27927:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28011:28;28030:8;28011:18;:28::i;:::-;27846:201:::0;:::o;29423:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;25686:98::-;25739:7;25766:10;25759:17;;25686:98;:::o;3587:::-;3645:7;3676:1;3672;:5;;;;:::i;:::-;3665:12;;3587:98;;;;:::o;3986:::-;4044:7;4075:1;4071;:5;;;;:::i;:::-;4064:12;;3986:98;;;;:::o;2849:::-;2907:7;2938:1;2934;:5;;;;:::i;:::-;2927:12;;2849:98;;;;:::o;28207:191::-;28281:16;28300:6;;;;;;;;;;;28281:25;;28326:8;28317:6;;:17;;;;;;;;;;;;;;;;;;28381:8;28350:40;;28371:8;28350:40;;;;;;;;;;;;28270:128;28207:191;:::o;3230:98::-;3288:7;3319:1;3315;:5;;;;:::i;:::-;3308:12;;3230:98;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:474::-;1952:6;1960;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:53;2205:7;2196:6;2185:9;2181:22;2160:53;:::i;:::-;2150:63;;2106:117;2262:2;2288:53;2333:7;2324:6;2313:9;2309:22;2288:53;:::i;:::-;2278:63;;2233:118;1884:474;;;;;:::o;2364:329::-;2423:6;2472:2;2460:9;2451:7;2447:23;2443:32;2440:119;;;2478:79;;:::i;:::-;2440:119;2598:1;2623:53;2668:7;2659:6;2648:9;2644:22;2623:53;:::i;:::-;2613:63;;2569:117;2364:329;;;;:::o;2699:118::-;2786:24;2804:5;2786:24;:::i;:::-;2781:3;2774:37;2699:118;;:::o;2823:222::-;2916:4;2954:2;2943:9;2939:18;2931:26;;2967:71;3035:1;3024:9;3020:17;3011:6;2967:71;:::i;:::-;2823:222;;;;:::o;3051:474::-;3119:6;3127;3176:2;3164:9;3155:7;3151:23;3147:32;3144:119;;;3182:79;;:::i;:::-;3144:119;3302:1;3327:53;3372:7;3363:6;3352:9;3348:22;3327:53;:::i;:::-;3317:63;;3273:117;3429:2;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3400:118;3051:474;;;;;:::o;3531:111::-;3595:6;3629:5;3623:12;3613:22;;3531:111;;;:::o;3648:181::-;3744:11;3778:6;3773:3;3766:19;3818:4;3813:3;3809:14;3794:29;;3648:181;;;;:::o;3835:129::-;3899:4;3922:3;3914:11;;3952:4;3947:3;3943:14;3935:22;;3835:129;;;:::o;3970:90::-;4004:7;4047:5;4040:13;4033:21;4022:32;;3970:90;;;:::o;4066:99::-;4137:21;4152:5;4137:21;:::i;:::-;4132:3;4125:34;4066:99;;:::o;4171:167::-;4234:10;4255:40;4291:3;4283:6;4255:40;:::i;:::-;4327:4;4322:3;4318:14;4304:28;;4171:167;;;;:::o;4344:110::-;4411:4;4443;4438:3;4434:14;4426:22;;4344:110;;;:::o;4484:708::-;4597:3;4626:51;4671:5;4626:51;:::i;:::-;4693:83;4769:6;4764:3;4693:83;:::i;:::-;4686:90;;4800:53;4847:5;4800:53;:::i;:::-;4876:7;4907:1;4892:275;4917:6;4914:1;4911:13;4892:275;;;4993:6;4987:13;5020:57;5073:3;5058:13;5020:57;:::i;:::-;5013:64;;5100:57;5150:6;5100:57;:::i;:::-;5090:67;;4952:215;4939:1;4936;4932:9;4927:14;;4892:275;;;4896:14;5183:3;5176:10;;4602:590;;;4484:708;;;;:::o;5198:361::-;5335:4;5373:2;5362:9;5358:18;5350:26;;5422:9;5416:4;5412:20;5408:1;5397:9;5393:17;5386:47;5450:102;5547:4;5538:6;5450:102;:::i;:::-;5442:110;;5198:361;;;;:::o;5565:332::-;5686:4;5724:2;5713:9;5709:18;5701:26;;5737:71;5805:1;5794:9;5790:17;5781:6;5737:71;:::i;:::-;5818:72;5886:2;5875:9;5871:18;5862:6;5818:72;:::i;:::-;5565:332;;;;;:::o;5903:619::-;5980:6;5988;5996;6045:2;6033:9;6024:7;6020:23;6016:32;6013:119;;;6051:79;;:::i;:::-;6013:119;6171:1;6196:53;6241:7;6232:6;6221:9;6217:22;6196:53;:::i;:::-;6186:63;;6142:117;6298:2;6324:53;6369:7;6360:6;6349:9;6345:22;6324:53;:::i;:::-;6314:63;;6269:118;6426:2;6452:53;6497:7;6488:6;6477:9;6473:22;6452:53;:::i;:::-;6442:63;;6397:118;5903:619;;;;;:::o;6528:442::-;6677:4;6715:2;6704:9;6700:18;6692:26;;6728:71;6796:1;6785:9;6781:17;6772:6;6728:71;:::i;:::-;6809:72;6877:2;6866:9;6862:18;6853:6;6809:72;:::i;:::-;6891;6959:2;6948:9;6944:18;6935:6;6891:72;:::i;:::-;6528:442;;;;;;:::o;6976:109::-;7057:21;7072:5;7057:21;:::i;:::-;7052:3;7045:34;6976:109;;:::o;7091:751::-;7312:4;7350:3;7339:9;7335:19;7327:27;;7364:71;7432:1;7421:9;7417:17;7408:6;7364:71;:::i;:::-;7445:72;7513:2;7502:9;7498:18;7489:6;7445:72;:::i;:::-;7527;7595:2;7584:9;7580:18;7571:6;7527:72;:::i;:::-;7609;7677:2;7666:9;7662:18;7653:6;7609:72;:::i;:::-;7691:67;7753:3;7742:9;7738:19;7729:6;7691:67;:::i;:::-;7768;7830:3;7819:9;7815:19;7806:6;7768:67;:::i;:::-;7091:751;;;;;;;;;:::o;7848:619::-;7925:6;7933;7941;7990:2;7978:9;7969:7;7965:23;7961:32;7958:119;;;7996:79;;:::i;:::-;7958:119;8116:1;8141:53;8186:7;8177:6;8166:9;8162:22;8141:53;:::i;:::-;8131:63;;8087:117;8243:2;8269:53;8314:7;8305:6;8294:9;8290:22;8269:53;:::i;:::-;8259:63;;8214:118;8371:2;8397:53;8442:7;8433:6;8422:9;8418:22;8397:53;:::i;:::-;8387:63;;8342:118;7848:619;;;;;:::o;8473:116::-;8543:21;8558:5;8543:21;:::i;:::-;8536:5;8533:32;8523:60;;8579:1;8576;8569:12;8523:60;8473:116;:::o;8595:133::-;8638:5;8676:6;8663:20;8654:29;;8692:30;8716:5;8692:30;:::i;:::-;8595:133;;;;:::o;8734:468::-;8799:6;8807;8856:2;8844:9;8835:7;8831:23;8827:32;8824:119;;;8862:79;;:::i;:::-;8824:119;8982:1;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8953:117;9109:2;9135:50;9177:7;9168:6;9157:9;9153:22;9135:50;:::i;:::-;9125:60;;9080:115;8734:468;;;;;:::o;9208:210::-;9295:4;9333:2;9322:9;9318:18;9310:26;;9346:65;9408:1;9397:9;9393:17;9384:6;9346:65;:::i;:::-;9208:210;;;;:::o;9424:169::-;9508:11;9542:6;9537:3;9530:19;9582:4;9577:3;9573:14;9558:29;;9424:169;;;;:::o;9599:182::-;9739:34;9735:1;9727:6;9723:14;9716:58;9599:182;:::o;9787:366::-;9929:3;9950:67;10014:2;10009:3;9950:67;:::i;:::-;9943:74;;10026:93;10115:3;10026:93;:::i;:::-;10144:2;10139:3;10135:12;10128:19;;9787:366;;;:::o;10159:419::-;10325:4;10363:2;10352:9;10348:18;10340:26;;10412:9;10406:4;10402:20;10398:1;10387:9;10383:17;10376:47;10440:131;10566:4;10440:131;:::i;:::-;10432:139;;10159:419;;;:::o;10584:180::-;10632:77;10629:1;10622:88;10729:4;10726:1;10719:15;10753:4;10750:1;10743:15;10770:180;10818:77;10815:1;10808:88;10915:4;10912:1;10905:15;10939:4;10936:1;10929:15;10956:194;10996:4;11016:20;11034:1;11016:20;:::i;:::-;11011:25;;11050:20;11068:1;11050:20;:::i;:::-;11045:25;;11094:1;11091;11087:9;11079:17;;11118:1;11112:4;11109:11;11106:37;;;11123:18;;:::i;:::-;11106:37;10956:194;;;;:::o;11156:233::-;11195:3;11218:24;11236:5;11218:24;:::i;:::-;11209:33;;11264:66;11257:5;11254:77;11251:103;;11334:18;;:::i;:::-;11251:103;11381:1;11374:5;11370:13;11363:20;;11156:233;;;:::o;11395:165::-;11535:17;11531:1;11523:6;11519:14;11512:41;11395:165;:::o;11566:366::-;11708:3;11729:67;11793:2;11788:3;11729:67;:::i;:::-;11722:74;;11805:93;11894:3;11805:93;:::i;:::-;11923:2;11918:3;11914:12;11907:19;;11566:366;;;:::o;11938:419::-;12104:4;12142:2;12131:9;12127:18;12119:26;;12191:9;12185:4;12181:20;12177:1;12166:9;12162:17;12155:47;12219:131;12345:4;12219:131;:::i;:::-;12211:139;;11938:419;;;:::o;12363:191::-;12403:3;12422:20;12440:1;12422:20;:::i;:::-;12417:25;;12456:20;12474:1;12456:20;:::i;:::-;12451:25;;12499:1;12496;12492:9;12485:16;;12520:3;12517:1;12514:10;12511:36;;;12527:18;;:::i;:::-;12511:36;12363:191;;;;:::o;12560:177::-;12700:29;12696:1;12688:6;12684:14;12677:53;12560:177;:::o;12743:366::-;12885:3;12906:67;12970:2;12965:3;12906:67;:::i;:::-;12899:74;;12982:93;13071:3;12982:93;:::i;:::-;13100:2;13095:3;13091:12;13084:19;;12743:366;;;:::o;13115:419::-;13281:4;13319:2;13308:9;13304:18;13296:26;;13368:9;13362:4;13358:20;13354:1;13343:9;13339:17;13332:47;13396:131;13522:4;13396:131;:::i;:::-;13388:139;;13115:419;;;:::o;13540:332::-;13661:4;13699:2;13688:9;13684:18;13676:26;;13712:71;13780:1;13769:9;13765:17;13756:6;13712:71;:::i;:::-;13793:72;13861:2;13850:9;13846:18;13837:6;13793:72;:::i;:::-;13540:332;;;;;:::o;13878:137::-;13932:5;13963:6;13957:13;13948:22;;13979:30;14003:5;13979:30;:::i;:::-;13878:137;;;;:::o;14021:345::-;14088:6;14137:2;14125:9;14116:7;14112:23;14108:32;14105:119;;;14143:79;;:::i;:::-;14105:119;14263:1;14288:61;14341:7;14332:6;14321:9;14317:22;14288:61;:::i;:::-;14278:71;;14234:125;14021:345;;;;:::o;14372:181::-;14512:33;14508:1;14500:6;14496:14;14489:57;14372:181;:::o;14559:366::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:419::-;15097:4;15135:2;15124:9;15120:18;15112:26;;15184:9;15178:4;15174:20;15170:1;15159:9;15155:17;15148:47;15212:131;15338:4;15212:131;:::i;:::-;15204:139;;14931:419;;;:::o;15356:179::-;15496:31;15492:1;15484:6;15480:14;15473:55;15356:179;:::o;15541:366::-;15683:3;15704:67;15768:2;15763:3;15704:67;:::i;:::-;15697:74;;15780:93;15869:3;15780:93;:::i;:::-;15898:2;15893:3;15889:12;15882:19;;15541:366;;;:::o;15913:419::-;16079:4;16117:2;16106:9;16102:18;16094:26;;16166:9;16160:4;16156:20;16152:1;16141:9;16137:17;16130:47;16194:131;16320:4;16194:131;:::i;:::-;16186:139;;15913:419;;;:::o;16338:143::-;16395:5;16426:6;16420:13;16411:22;;16442:33;16469:5;16442:33;:::i;:::-;16338:143;;;;:::o;16487:351::-;16557:6;16606:2;16594:9;16585:7;16581:23;16577:32;16574:119;;;16612:79;;:::i;:::-;16574:119;16732:1;16757:64;16813:7;16804:6;16793:9;16789:22;16757:64;:::i;:::-;16747:74;;16703:128;16487:351;;;;:::o;16844:171::-;16984:23;16980:1;16972:6;16968:14;16961:47;16844:171;:::o;17021:366::-;17163:3;17184:67;17248:2;17243:3;17184:67;:::i;:::-;17177:74;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17021:366;;;:::o;17393:419::-;17559:4;17597:2;17586:9;17582:18;17574:26;;17646:9;17640:4;17636:20;17632:1;17621:9;17617:17;17610:47;17674:131;17800:4;17674:131;:::i;:::-;17666:139;;17393:419;;;:::o;17818:172::-;17958:24;17954:1;17946:6;17942:14;17935:48;17818:172;:::o;17996:366::-;18138:3;18159:67;18223:2;18218:3;18159:67;:::i;:::-;18152:74;;18235:93;18324:3;18235:93;:::i;:::-;18353:2;18348:3;18344:12;18337:19;;17996:366;;;:::o;18368:419::-;18534:4;18572:2;18561:9;18557:18;18549:26;;18621:9;18615:4;18611:20;18607:1;18596:9;18592:17;18585:47;18649:131;18775:4;18649:131;:::i;:::-;18641:139;;18368:419;;;:::o;18793:220::-;18933:34;18929:1;18921:6;18917:14;18910:58;19002:3;18997:2;18989:6;18985:15;18978:28;18793:220;:::o;19019:366::-;19161:3;19182:67;19246:2;19241:3;19182:67;:::i;:::-;19175:74;;19258:93;19347:3;19258:93;:::i;:::-;19376:2;19371:3;19367:12;19360:19;;19019:366;;;:::o;19391:419::-;19557:4;19595:2;19584:9;19580:18;19572:26;;19644:9;19638:4;19634:20;19630:1;19619:9;19615:17;19608:47;19672:131;19798:4;19672:131;:::i;:::-;19664:139;;19391:419;;;:::o;19816:442::-;19965:4;20003:2;19992:9;19988:18;19980:26;;20016:71;20084:1;20073:9;20069:17;20060:6;20016:71;:::i;:::-;20097:72;20165:2;20154:9;20150:18;20141:6;20097:72;:::i;:::-;20179;20247:2;20236:9;20232:18;20223:6;20179:72;:::i;:::-;19816:442;;;;;;:::o;20264:180::-;20312:77;20309:1;20302:88;20409:4;20406:1;20399:15;20433:4;20430:1;20423:15;20450:172;20590:24;20586:1;20578:6;20574:14;20567:48;20450:172;:::o;20628:366::-;20770:3;20791:67;20855:2;20850:3;20791:67;:::i;:::-;20784:74;;20867:93;20956:3;20867:93;:::i;:::-;20985:2;20980:3;20976:12;20969:19;;20628:366;;;:::o;21000:419::-;21166:4;21204:2;21193:9;21189:18;21181:26;;21253:9;21247:4;21243:20;21239:1;21228:9;21224:17;21217:47;21281:131;21407:4;21281:131;:::i;:::-;21273:139;;21000:419;;;:::o;21425:224::-;21565:34;21561:1;21553:6;21549:14;21542:58;21634:7;21629:2;21621:6;21617:15;21610:32;21425:224;:::o;21655:366::-;21797:3;21818:67;21882:2;21877:3;21818:67;:::i;:::-;21811:74;;21894:93;21983:3;21894:93;:::i;:::-;22012:2;22007:3;22003:12;21996:19;;21655:366;;;:::o;22027:419::-;22193:4;22231:2;22220:9;22216:18;22208:26;;22280:9;22274:4;22270:20;22266:1;22255:9;22251:17;22244:47;22308:131;22434:4;22308:131;:::i;:::-;22300:139;;22027:419;;;:::o;22452:171::-;22491:3;22514:24;22532:5;22514:24;:::i;:::-;22505:33;;22560:4;22553:5;22550:15;22547:41;;22568:18;;:::i;:::-;22547:41;22615:1;22608:5;22604:13;22597:20;;22452:171;;;:::o;22629:220::-;22769:34;22765:1;22757:6;22753:14;22746:58;22838:3;22833:2;22825:6;22821:15;22814:28;22629:220;:::o;22855:366::-;22997:3;23018:67;23082:2;23077:3;23018:67;:::i;:::-;23011:74;;23094:93;23183:3;23094:93;:::i;:::-;23212:2;23207:3;23203:12;23196:19;;22855:366;;;:::o;23227:419::-;23393:4;23431:2;23420:9;23416:18;23408:26;;23480:9;23474:4;23470:20;23466:1;23455:9;23451:17;23444:47;23508:131;23634:4;23508:131;:::i;:::-;23500:139;;23227:419;;;:::o;23652:221::-;23792:34;23788:1;23780:6;23776:14;23769:58;23861:4;23856:2;23848:6;23844:15;23837:29;23652:221;:::o;23879:366::-;24021:3;24042:67;24106:2;24101:3;24042:67;:::i;:::-;24035:74;;24118:93;24207:3;24118:93;:::i;:::-;24236:2;24231:3;24227:12;24220:19;;23879:366;;;:::o;24251:419::-;24417:4;24455:2;24444:9;24440:18;24432:26;;24504:9;24498:4;24494:20;24490:1;24479:9;24475:17;24468:47;24532:131;24658:4;24532:131;:::i;:::-;24524:139;;24251:419;;;:::o;24676:225::-;24816:34;24812:1;24804:6;24800:14;24793:58;24885:8;24880:2;24872:6;24868:15;24861:33;24676:225;:::o;24907:366::-;25049:3;25070:67;25134:2;25129:3;25070:67;:::i;:::-;25063:74;;25146:93;25235:3;25146:93;:::i;:::-;25264:2;25259:3;25255:12;25248:19;;24907:366;;;:::o;25279:419::-;25445:4;25483:2;25472:9;25468:18;25460:26;;25532:9;25526:4;25522:20;25518:1;25507:9;25503:17;25496:47;25560:131;25686:4;25560:131;:::i;:::-;25552:139;;25279:419;;;:::o;25704:410::-;25744:7;25767:20;25785:1;25767:20;:::i;:::-;25762:25;;25801:20;25819:1;25801:20;:::i;:::-;25796:25;;25856:1;25853;25849:9;25878:30;25896:11;25878:30;:::i;:::-;25867:41;;26057:1;26048:7;26044:15;26041:1;26038:22;26018:1;26011:9;25991:83;25968:139;;26087:18;;:::i;:::-;25968:139;25752:362;25704:410;;;;:::o;26120:180::-;26168:77;26165:1;26158:88;26265:4;26262:1;26255:15;26289:4;26286:1;26279:15;26306:185;26346:1;26363:20;26381:1;26363:20;:::i;:::-;26358:25;;26397:20;26415:1;26397:20;:::i;:::-;26392:25;;26436:1;26426:35;;26441:18;;:::i;:::-;26426:35;26483:1;26480;26476:9;26471:14;;26306:185;;;;:::o
Swarm Source
ipfs://98b03542faa8f7af9519c328d4ddfb51b97812a509a6066aaa8418a5f62d8737
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.