More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,433 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20182987 | 3 days ago | IN | 0 ETH | 0.00062872 | ||||
Withdraw | 20182978 | 3 days ago | IN | 0 ETH | 0.00063545 | ||||
Withdraw | 20168840 | 5 days ago | IN | 0 ETH | 0.0006802 | ||||
Withdraw | 20158364 | 6 days ago | IN | 0 ETH | 0.00005432 | ||||
Withdraw | 20158335 | 6 days ago | IN | 0 ETH | 0.00018286 | ||||
Withdraw | 20115694 | 12 days ago | IN | 0 ETH | 0.00195545 | ||||
Withdraw | 20115692 | 12 days ago | IN | 0 ETH | 0.00180831 | ||||
Withdraw | 20110275 | 13 days ago | IN | 0 ETH | 0.00032081 | ||||
Withdraw | 20109231 | 13 days ago | IN | 0 ETH | 0.00026559 | ||||
Deposit | 20104856 | 14 days ago | IN | 0 ETH | 0.00053153 | ||||
Withdraw | 20104850 | 14 days ago | IN | 0 ETH | 0.00043803 | ||||
Withdraw | 20086751 | 16 days ago | IN | 0 ETH | 0.00048869 | ||||
Withdraw | 20086747 | 16 days ago | IN | 0 ETH | 0.00083244 | ||||
Withdraw | 20086006 | 16 days ago | IN | 0 ETH | 0.00035918 | ||||
Withdraw | 20086006 | 16 days ago | IN | 0 ETH | 0.00059464 | ||||
Withdraw | 20085978 | 16 days ago | IN | 0 ETH | 0.00034873 | ||||
Withdraw | 20085977 | 16 days ago | IN | 0 ETH | 0.00105041 | ||||
Deposit | 20040308 | 23 days ago | IN | 0 ETH | 0.00187061 | ||||
Deposit | 20030854 | 24 days ago | IN | 0 ETH | 0.00116787 | ||||
Deposit | 20030850 | 24 days ago | IN | 0 ETH | 0.00112961 | ||||
Deposit | 20030846 | 24 days ago | IN | 0 ETH | 0.00091555 | ||||
Deposit | 20018734 | 26 days ago | IN | 0 ETH | 0.00143204 | ||||
Withdraw | 20012413 | 27 days ago | IN | 0 ETH | 0.00172609 | ||||
Withdraw | 20012410 | 27 days ago | IN | 0 ETH | 0.0028428 | ||||
Withdraw | 20005504 | 28 days ago | IN | 0 ETH | 0.00114467 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
13653826 | 952 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ERC20RewardStakingV4
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-20 */ /** *Submitted for verification at BscScan.com on 2021-10-30 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] 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 @openzeppelin/contracts/utils/[email protected] 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 @openzeppelin/contracts/access/[email protected] 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/proxy/utils/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts/security/[email protected] 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/ERC20RewardStakingV4.sol pragma solidity ^0.8.4; contract ERC20RewardStakingV4 is ReentrancyGuard, Ownable, Initializable { using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Rewards to distribute per block. uint256 lastRewardBlock; // Last block number that Rewards distribution occurs. uint256 accRewardTokenPerShare; // Accumulated Rewards per share, times 1e30. See below. } // The stake token IERC20 public STAKE_TOKEN; // The reward token IERC20 public REWARD_TOKEN; // Reward tokens created per block. uint256 public rewardPerBlock; // Keep track of number of tokens staked in case the contract earns reflect fees uint256 public totalStaked = 0; // Keep track of number of reward tokens paid to find remaining reward balance uint256 public totalRewardsPaid = 0; // Keep track of number of reward tokens paid to find remaining reward balance uint256 public totalRewardsAllocated = 0; // Info of each pool. PoolInfo public poolInfo; // Info of each user that stakes LP tokens. mapping (address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; // The block number when Reward mining starts. uint256 public startBlock; // The block number when mining ends. uint256 public bonusEndBlock; event Deposit(address indexed user, uint256 amount); event DepositRewards(uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event SkimStakeTokenFees(address indexed user, uint256 amount); event LogUpdatePool(uint256 bonusEndBlock, uint256 rewardPerBlock); event EmergencyRewardWithdraw(address indexed user, uint256 amount); event EmergencySweepWithdraw(address indexed user, IERC20 indexed token, uint256 amount); function initialize( IERC20 _stakeToken, IERC20 _rewardToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _bonusEndBlock ) external initializer { STAKE_TOKEN = _stakeToken; REWARD_TOKEN = _rewardToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; // staking pool poolInfo = PoolInfo({ lpToken: _stakeToken, allocPoint: 1000, lastRewardBlock: startBlock, accRewardTokenPerShare: 0 }); totalAllocPoint = 1000; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= bonusEndBlock) { return _to - _from; } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock - _from; } } /// @param _bonusEndBlock The block when rewards will end function setBonusEndBlock(uint256 _bonusEndBlock) external onlyOwner { require(_bonusEndBlock > block.number, 'new bonus end block must be greater than current'); bonusEndBlock = _bonusEndBlock; emit LogUpdatePool(bonusEndBlock, rewardPerBlock); } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 accRewardTokenPerShare = poolInfo.accRewardTokenPerShare; if (block.number > poolInfo.lastRewardBlock && totalStaked != 0) { uint256 multiplier = getMultiplier(poolInfo.lastRewardBlock, block.number); uint256 tokenReward = multiplier * rewardPerBlock * poolInfo.allocPoint / totalAllocPoint; accRewardTokenPerShare = accRewardTokenPerShare + (tokenReward * 1e30 / totalStaked); } return user.amount * accRewardTokenPerShare / 1e30 - user.rewardDebt; } // Update reward variables of the given pool to be up-to-date. function updatePool() public { if (block.number <= poolInfo.lastRewardBlock) { return; } if (totalStaked == 0) { poolInfo.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(poolInfo.lastRewardBlock, block.number); uint256 tokenReward = multiplier * rewardPerBlock * poolInfo.allocPoint / totalAllocPoint; totalRewardsAllocated += tokenReward; poolInfo.accRewardTokenPerShare = poolInfo.accRewardTokenPerShare + (tokenReward * 1e30 / totalStaked); poolInfo.lastRewardBlock = block.number; } /// Deposit staking token into the contract to earn rewards. /// @dev Since this contract needs to be supplied with rewards we are /// sending the balance of the contract if the pending rewards are higher /// @param _amount The amount of staking tokens to deposit function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; updatePool(); if (user.amount > 0) { uint256 pending = user.amount * poolInfo.accRewardTokenPerShare / 1e30 - user.rewardDebt; if(pending > 0) { // If rewardBalance is low then revert to avoid losing the user's rewards require(rewardBalance() >= pending, "insufficient reward balance"); safeTransferRewardInternal(address(msg.sender), pending); } } uint256 finalDepositAmount = 0; if (_amount > 0) { uint256 preStakeBalance = STAKE_TOKEN.balanceOf(address(this)); poolInfo.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); finalDepositAmount = STAKE_TOKEN.balanceOf(address(this)) - preStakeBalance; user.amount = user.amount + finalDepositAmount; totalStaked = totalStaked + finalDepositAmount; } user.rewardDebt = user.amount * poolInfo.accRewardTokenPerShare / 1e30; emit Deposit(msg.sender, finalDepositAmount); } /// Withdraw rewards and/or staked tokens. Pass a 0 amount to withdraw only rewards /// @param _amount The amount of staking tokens to withdraw function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(); uint256 pending = user.amount * poolInfo.accRewardTokenPerShare / 1e30 - user.rewardDebt; if(pending > 0) { // If rewardBalance is low then revert to avoid losing the user's rewards require(rewardBalance() >= pending, "insufficient reward balance"); safeTransferRewardInternal(address(msg.sender), pending); } if(_amount > 0) { user.amount = user.amount - _amount; poolInfo.lpToken.safeTransfer(address(msg.sender), _amount); totalStaked = totalStaked - _amount; } user.rewardDebt = user.amount * poolInfo.accRewardTokenPerShare / 1e30; emit Withdraw(msg.sender, _amount); } /// Obtain the reward balance of this contract /// @return wei balace of conract function rewardBalance() public view returns (uint256) { uint256 balance = REWARD_TOKEN.balanceOf(address(this)); if (STAKE_TOKEN == REWARD_TOKEN) { return balance - totalStaked; } return balance; } /// Get the balance of rewards that have not been harvested /// @return wei balance of rewards left to be paid function getUnharvestedRewards() public view returns (uint256) { return totalRewardsAllocated - totalRewardsPaid; } // Deposit Rewards into contract function depositRewards(uint256 _amount) external { require(_amount > 0, 'Deposit value must be greater than 0.'); REWARD_TOKEN.safeTransferFrom(address(msg.sender), address(this), _amount); emit DepositRewards(_amount); } /// @param _to address to send reward token to /// @param _amount value of reward token to transfer function safeTransferRewardInternal(address _to, uint256 _amount) internal { totalRewardsPaid += _amount; REWARD_TOKEN.safeTransfer(_to, _amount); } /// @dev Obtain the stake balance of this contract function totalStakeTokenBalance() public view returns (uint256) { if (STAKE_TOKEN == REWARD_TOKEN) return totalStaked; return STAKE_TOKEN.balanceOf(address(this)); } /// @dev Obtain the stake token fees (if any) earned by reflect token /// @notice If STAKE_TOKEN == REWARD_TOKEN there are no fees to skim function getStakeTokenFeeBalance() public view returns (uint256) { return totalStakeTokenBalance() - totalStaked; } /* Admin Functions */ /// @param _rewardPerBlock The amount of reward tokens to be given per block function setRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { rewardPerBlock = _rewardPerBlock; emit LogUpdatePool(bonusEndBlock, rewardPerBlock); } /// @dev Remove excess stake tokens earned by reflect fees function skimStakeTokenFees(address _to) external onlyOwner { uint256 stakeTokenFeeBalance = getStakeTokenFeeBalance(); STAKE_TOKEN.safeTransfer(_to, stakeTokenFeeBalance); emit SkimStakeTokenFees(_to, stakeTokenFeeBalance); } /* Emergency Functions */ // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; poolInfo.lpToken.safeTransfer(address(msg.sender), user.amount); totalStaked = totalStaked - user.amount; user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, user.amount); } // Withdraw reward. EMERGENCY ONLY. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardBalance(), 'not enough rewards'); // Withdraw rewards REWARD_TOKEN.safeTransfer(msg.sender, _amount); emit EmergencyRewardWithdraw(msg.sender, _amount); } /// @notice A public function to sweep accidental ERC20 transfers to this contract. /// Tokens are sent to owner /// @param token The address of the ERC20 token to sweep function sweepToken(IERC20 token) external onlyOwner { require(address(token) != address(STAKE_TOKEN), "can not sweep stake token"); require(address(token) != address(REWARD_TOKEN), "can not sweep reward token"); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(msg.sender, balance); emit EmergencySweepWithdraw(msg.sender, token, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencySweepWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bonusEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SkimStakeTokenFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeTokenFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnharvestedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakeToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardTokenPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"setBonusEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"skimStakeTokenFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewardsAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600555600060065560006007556000600d553480156200002557600080fd5b5060016000819055506200004e620000426200005460201b60201c565b6200005c60201b60201c565b62000122565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130d580620001326000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638bdf67f211610104578063b6b55f25116100a2578063db2e21bc11610071578063db2e21bc146104ed578063e3161ddd146104f7578063f2fde38b14610501578063f40f0f521461051d576101da565b8063b6b55f251461047d578063bb872b4a14610499578063bbac08f4146104b5578063d13f90b4146104d1576101da565b806399248ea7116100de57806399248ea7146104075780639e0af23414610425578063a49ceb1914610441578063aa5c3ab41461045f576101da565b80638bdf67f21461039d5780638da5cb5b146103b95780638dbb1e3a146103d7576101da565b806341744f7b1161017c57806374958e351161014b57806374958e3514610325578063812bc70814610343578063817b1cd2146103615780638ae39cac1461037f576101da565b806341744f7b146102be57806348cd4cb1146102dc5780635a2f3d09146102fa578063715018a61461031b576101da565b80631be19560116101b85780631be195601461024c5780631c39b672146102685780632e1a7d4d146102865780633279beab146102a2576101da565b806309e4e7ab146101df5780631959a002146101fd5780631aed65531461022e575b600080fd5b6101e761054d565b6040516101f49190612304565b60405180910390f35b61021760048036038101906102129190612382565b610564565b6040516102259291906123af565b60405180910390f35b610236610588565b6040516102439190612304565b60405180910390f35b61026660048036038101906102619190612416565b61058e565b005b61027061083e565b60405161027d91906124a2565b60405180910390f35b6102a0600480360381019061029b91906124e9565b610864565b005b6102bc60048036038101906102b791906124e9565b610af8565b005b6102c6610c5c565b6040516102d39190612304565b60405180910390f35b6102e4610c62565b6040516102f19190612304565b60405180910390f35b610302610c68565b6040516103129493929190612516565b60405180910390f35b610323610ca6565b005b61032d610d2e565b60405161033a9190612304565b60405180910390f35b61034b610d34565b6040516103589190612304565b60405180910390f35b610369610d50565b6040516103769190612304565b60405180910390f35b610387610d56565b6040516103949190612304565b60405180910390f35b6103b760048036038101906103b291906124e9565b610d5c565b005b6103c1610e28565b6040516103ce919061256a565b60405180910390f35b6103f160048036038101906103ec9190612585565b610e52565b6040516103fe9190612304565b60405180910390f35b61040f610e99565b60405161041c91906124a2565b60405180910390f35b61043f600480360381019061043a91906124e9565b610ebf565b005b610449610fc4565b6040516104569190612304565b60405180910390f35b6104676110ea565b6040516104749190612304565b60405180910390f35b610497600480360381019061049291906124e9565b611221565b005b6104b360048036038101906104ae91906124e9565b6115ca565b005b6104cf60048036038101906104ca9190612382565b61168d565b005b6104eb60048036038101906104e691906125c5565b6117b4565b005b6104f56119db565b005b6104ff611b49565b005b61051b60048036038101906105169190612382565b611c1d565b005b61053760048036038101906105329190612382565b611d15565b6040516105449190612304565b60405180910390f35b600060065460075461055f919061266f565b905090565b600c6020528060005260406000206000915090508060000154908060010154905082565b600f5481565b610596611e37565b73ffffffffffffffffffffffffffffffffffffffff166105b4610e28565b73ffffffffffffffffffffffffffffffffffffffff161461060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060190612700565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561069b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106929061276c565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561072c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610723906127d8565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610767919061256a565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a8919061280d565b90506107d533828473ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab395713836040516108329190612304565b60405180910390a35050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005414156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050818160000154101561093c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610933906128f2565b60405180910390fd5b610944611b49565b600081600101546c0c9f2c9cd04674edea40000000600860030154846000015461096e9190612912565b610978919061299b565b610982919061266f565b905060008111156109e257806109966110ea565b10156109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90612a18565b60405180910390fd5b6109e13382611ec5565b5b6000831115610a68578282600001546109fb919061266f565b8260000181905550610a533384600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b82600554610a61919061266f565b6005819055505b6c0c9f2c9cd04674edea400000006008600301548360000154610a8b9190612912565b610a95919061299b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610ae39190612304565b60405180910390a25050600160008190555050565b610b00611e37565b73ffffffffffffffffffffffffffffffffffffffff16610b1e610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90612700565b60405180910390fd5b610b7c6110ea565b811115610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612a84565b60405180910390fd5b610c0b3382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b4282604051610c519190612304565b60405180910390a250565b60075481565b600e5481565b60088060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b610cae611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ccc610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990612700565b60405180910390fd5b610d2c6000611f2f565b565b60065481565b6000600554610d41610fc4565b610d4b919061266f565b905090565b60055481565b60045481565b60008111610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690612b16565b60405180910390fd5b610dee333083600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ff5909392919063ffffffff16565b7f754fe3a3c69256b66ca56365fda4bbf3299d7c94038c105ffd43fb4b37f56db681604051610e1d9190612304565b60405180910390a150565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f548211610e70578282610e69919061266f565b9050610e93565b600f548310610e825760009050610e93565b82600f54610e90919061266f565b90505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec7611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ee5610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290612700565b60405180910390fd5b438111610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490612ba8565b60405180910390fd5b80600f819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600454604051610fb99291906123af565b60405180910390a150565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110485760055490506110e7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110a3919061256a565b602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e4919061280d565b90505b90565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611148919061256a565b602060405180830381865afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611189919061280d565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112195760055481611211919061266f565b91505061121e565b809150505b90565b60026000541415611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506112ba611b49565b60008160000154111561136757600081600101546c0c9f2c9cd04674edea4000000060086003015484600001546112f19190612912565b6112fb919061299b565b611305919061266f565b9050600081111561136557806113196110ea565b101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190612a18565b60405180910390fd5b6113643382611ec5565b5b505b60008083111561153a576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ce919061256a565b602060405180830381865afa1580156113eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140f919061280d565b9050611463333086600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ff5909392919063ffffffff16565b80600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114bf919061256a565b602060405180830381865afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611500919061280d565b61150a919061266f565b915081836000015461151c9190612bc8565b8360000181905550816005546115329190612bc8565b600581905550505b6c0c9f2c9cd04674edea40000000600860030154836000015461155d9190612912565b611567919061299b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516115b59190612304565b60405180910390a25050600160008190555050565b6115d2611e37565b73ffffffffffffffffffffffffffffffffffffffff166115f0610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612700565b60405180910390fd5b806004819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f546004546040516116829291906123af565b60405180910390a150565b611695611e37565b73ffffffffffffffffffffffffffffffffffffffff166116b3610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090612700565b60405180910390fd5b6000611713610d34565b90506117628282600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167feb4e6a6a8d3c8edbd6ef48316a3670cfa0e6374eebe3f555e620399f866d2f32826040516117a89190612304565b60405180910390a25050565b600160159054906101000a900460ff16806117dc5750600160149054906101000a900460ff16155b61181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290612c90565b60405180910390fd5b6000600160159054906101000a900460ff16159050801561186b5760018060156101000a81548160ff02191690831515021790555060018060146101000a81548160ff0219169083151502179055505b85600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360048190555082600e8190555081600f8190555060405180608001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020016103e88152602001600e5481526020016000815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050506103e8600d8190555080156119d3576000600160156101000a81548160ff0219169083151502179055505b505050505050565b60026000541415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ac0338260000154600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8060000154600554611ad2919061266f565b60058190555060008160000181905550600081600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958260000154604051611b369190612304565b60405180910390a2506001600081905550565b6008600201544311611b5a57611c1b565b60006005541415611b745743600860020181905550611c1b565b6000611b8560086002015443610e52565b90506000600d5460086001015460045484611ba09190612912565b611baa9190612912565b611bb4919061299b565b90508060076000828254611bc89190612bc8565b925050819055506005546c0c9f2c9cd04674edea4000000082611beb9190612912565b611bf5919061299b565b600860030154611c059190612bc8565b6008600301819055504360086002018190555050505b565b611c25611e37565b73ffffffffffffffffffffffffffffffffffffffff16611c43610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9090612700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090612d22565b60405180910390fd5b611d1281611f2f565b50565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600860030154905060086002015443118015611d7a5750600060055414155b15611df7576000611d9060086002015443610e52565b90506000600d5460086001015460045484611dab9190612912565b611db59190612912565b611dbf919061299b565b90506005546c0c9f2c9cd04674edea4000000082611ddd9190612912565b611de7919061299b565b83611df29190612bc8565b925050505b81600101546c0c9f2c9cd04674edea40000000828460000154611e1a9190612912565b611e24919061299b565b611e2e919061266f565b92505050919050565b600033905090565b611ec08363a9059cbb60e01b8484604051602401611e5e929190612d42565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061207e565b505050565b8060066000828254611ed79190612bc8565b92505081905550611f2b8282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612078846323b872dd60e01b85858560405160240161201693929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061207e565b50505050565b60006120e0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121459092919063ffffffff16565b905060008151111561214057808060200190518101906121009190612dda565b61213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690612e79565b60405180910390fd5b5b505050565b6060612154848460008561215d565b90509392505050565b6060824710156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612f0b565b60405180910390fd5b6121ab85612271565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190612f77565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122139190613011565b60006040518083038185875af1925050503d8060008114612250576040519150601f19603f3d011682016040523d82523d6000602084013e612255565b606091505b5091509150612265828286612284565b92505050949350505050565b600080823b905060008111915050919050565b60608315612294578290506122e4565b6000835111156122a75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db919061307d565b60405180910390fd5b9392505050565b6000819050919050565b6122fe816122eb565b82525050565b600060208201905061231960008301846122f5565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061234f82612324565b9050919050565b61235f81612344565b811461236a57600080fd5b50565b60008135905061237c81612356565b92915050565b6000602082840312156123985761239761231f565b5b60006123a68482850161236d565b91505092915050565b60006040820190506123c460008301856122f5565b6123d160208301846122f5565b9392505050565b60006123e382612344565b9050919050565b6123f3816123d8565b81146123fe57600080fd5b50565b600081359050612410816123ea565b92915050565b60006020828403121561242c5761242b61231f565b5b600061243a84828501612401565b91505092915050565b6000819050919050565b600061246861246361245e84612324565b612443565b612324565b9050919050565b600061247a8261244d565b9050919050565b600061248c8261246f565b9050919050565b61249c81612481565b82525050565b60006020820190506124b76000830184612493565b92915050565b6124c6816122eb565b81146124d157600080fd5b50565b6000813590506124e3816124bd565b92915050565b6000602082840312156124ff576124fe61231f565b5b600061250d848285016124d4565b91505092915050565b600060808201905061252b6000830187612493565b61253860208301866122f5565b61254560408301856122f5565b61255260608301846122f5565b95945050505050565b61256481612344565b82525050565b600060208201905061257f600083018461255b565b92915050565b6000806040838503121561259c5761259b61231f565b5b60006125aa858286016124d4565b92505060206125bb858286016124d4565b9150509250929050565b600080600080600060a086880312156125e1576125e061231f565b5b60006125ef88828901612401565b955050602061260088828901612401565b9450506040612611888289016124d4565b9350506060612622888289016124d4565b9250506080612633888289016124d4565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061267a826122eb565b9150612685836122eb565b92508282101561269857612697612640565b5b828203905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006126ea6020836126a3565b91506126f5826126b4565b602082019050919050565b60006020820190508181036000830152612719816126dd565b9050919050565b7f63616e206e6f74207377656570207374616b6520746f6b656e00000000000000600082015250565b60006127566019836126a3565b915061276182612720565b602082019050919050565b6000602082019050818103600083015261278581612749565b9050919050565b7f63616e206e6f742073776565702072657761726420746f6b656e000000000000600082015250565b60006127c2601a836126a3565b91506127cd8261278c565b602082019050919050565b600060208201905081810360008301526127f1816127b5565b9050919050565b600081519050612807816124bd565b92915050565b6000602082840312156128235761282261231f565b5b6000612831848285016127f8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612870601f836126a3565b915061287b8261283a565b602082019050919050565b6000602082019050818103600083015261289f81612863565b9050919050565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b60006128dc6012836126a3565b91506128e7826128a6565b602082019050919050565b6000602082019050818103600083015261290b816128cf565b9050919050565b600061291d826122eb565b9150612928836122eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561296157612960612640565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129a6826122eb565b91506129b1836122eb565b9250826129c1576129c061296c565b5b828204905092915050565b7f696e73756666696369656e74207265776172642062616c616e63650000000000600082015250565b6000612a02601b836126a3565b9150612a0d826129cc565b602082019050919050565b60006020820190508181036000830152612a31816129f5565b9050919050565b7f6e6f7420656e6f75676820726577617264730000000000000000000000000000600082015250565b6000612a6e6012836126a3565b9150612a7982612a38565b602082019050919050565b60006020820190508181036000830152612a9d81612a61565b9050919050565b7f4465706f7369742076616c7565206d757374206265206772656174657220746860008201527f616e20302e000000000000000000000000000000000000000000000000000000602082015250565b6000612b006025836126a3565b9150612b0b82612aa4565b604082019050919050565b60006020820190508181036000830152612b2f81612af3565b9050919050565b7f6e657720626f6e757320656e6420626c6f636b206d757374206265206772656160008201527f746572207468616e2063757272656e7400000000000000000000000000000000602082015250565b6000612b926030836126a3565b9150612b9d82612b36565b604082019050919050565b60006020820190508181036000830152612bc181612b85565b9050919050565b6000612bd3826122eb565b9150612bde836122eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c1357612c12612640565b5b828201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612c7a602e836126a3565b9150612c8582612c1e565b604082019050919050565b60006020820190508181036000830152612ca981612c6d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d0c6026836126a3565b9150612d1782612cb0565b604082019050919050565b60006020820190508181036000830152612d3b81612cff565b9050919050565b6000604082019050612d57600083018561255b565b612d6460208301846122f5565b9392505050565b6000606082019050612d80600083018661255b565b612d8d602083018561255b565b612d9a60408301846122f5565b949350505050565b60008115159050919050565b612db781612da2565b8114612dc257600080fd5b50565b600081519050612dd481612dae565b92915050565b600060208284031215612df057612def61231f565b5b6000612dfe84828501612dc5565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612e63602a836126a3565b9150612e6e82612e07565b604082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612ef56026836126a3565b9150612f0082612e99565b604082019050919050565b60006020820190508181036000830152612f2481612ee8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612f61601d836126a3565b9150612f6c82612f2b565b602082019050919050565b60006020820190508181036000830152612f9081612f54565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612fcb578082015181840152602081019050612fb0565b83811115612fda576000848401525b50505050565b6000612feb82612f97565b612ff58185612fa2565b9350613005818560208601612fad565b80840191505092915050565b600061301d8284612fe0565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061304f82613028565b61305981856126a3565b9350613069818560208601612fad565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b90509291505056fea2646970667358221220bde539c186b030ddc87e92a75f2e2ad5d4f43568cbc66086f137b3f85d0d30e164736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638bdf67f211610104578063b6b55f25116100a2578063db2e21bc11610071578063db2e21bc146104ed578063e3161ddd146104f7578063f2fde38b14610501578063f40f0f521461051d576101da565b8063b6b55f251461047d578063bb872b4a14610499578063bbac08f4146104b5578063d13f90b4146104d1576101da565b806399248ea7116100de57806399248ea7146104075780639e0af23414610425578063a49ceb1914610441578063aa5c3ab41461045f576101da565b80638bdf67f21461039d5780638da5cb5b146103b95780638dbb1e3a146103d7576101da565b806341744f7b1161017c57806374958e351161014b57806374958e3514610325578063812bc70814610343578063817b1cd2146103615780638ae39cac1461037f576101da565b806341744f7b146102be57806348cd4cb1146102dc5780635a2f3d09146102fa578063715018a61461031b576101da565b80631be19560116101b85780631be195601461024c5780631c39b672146102685780632e1a7d4d146102865780633279beab146102a2576101da565b806309e4e7ab146101df5780631959a002146101fd5780631aed65531461022e575b600080fd5b6101e761054d565b6040516101f49190612304565b60405180910390f35b61021760048036038101906102129190612382565b610564565b6040516102259291906123af565b60405180910390f35b610236610588565b6040516102439190612304565b60405180910390f35b61026660048036038101906102619190612416565b61058e565b005b61027061083e565b60405161027d91906124a2565b60405180910390f35b6102a0600480360381019061029b91906124e9565b610864565b005b6102bc60048036038101906102b791906124e9565b610af8565b005b6102c6610c5c565b6040516102d39190612304565b60405180910390f35b6102e4610c62565b6040516102f19190612304565b60405180910390f35b610302610c68565b6040516103129493929190612516565b60405180910390f35b610323610ca6565b005b61032d610d2e565b60405161033a9190612304565b60405180910390f35b61034b610d34565b6040516103589190612304565b60405180910390f35b610369610d50565b6040516103769190612304565b60405180910390f35b610387610d56565b6040516103949190612304565b60405180910390f35b6103b760048036038101906103b291906124e9565b610d5c565b005b6103c1610e28565b6040516103ce919061256a565b60405180910390f35b6103f160048036038101906103ec9190612585565b610e52565b6040516103fe9190612304565b60405180910390f35b61040f610e99565b60405161041c91906124a2565b60405180910390f35b61043f600480360381019061043a91906124e9565b610ebf565b005b610449610fc4565b6040516104569190612304565b60405180910390f35b6104676110ea565b6040516104749190612304565b60405180910390f35b610497600480360381019061049291906124e9565b611221565b005b6104b360048036038101906104ae91906124e9565b6115ca565b005b6104cf60048036038101906104ca9190612382565b61168d565b005b6104eb60048036038101906104e691906125c5565b6117b4565b005b6104f56119db565b005b6104ff611b49565b005b61051b60048036038101906105169190612382565b611c1d565b005b61053760048036038101906105329190612382565b611d15565b6040516105449190612304565b60405180910390f35b600060065460075461055f919061266f565b905090565b600c6020528060005260406000206000915090508060000154908060010154905082565b600f5481565b610596611e37565b73ffffffffffffffffffffffffffffffffffffffff166105b4610e28565b73ffffffffffffffffffffffffffffffffffffffff161461060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060190612700565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561069b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106929061276c565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561072c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610723906127d8565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610767919061256a565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a8919061280d565b90506107d533828473ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab395713836040516108329190612304565b60405180910390a35050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005414156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050818160000154101561093c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610933906128f2565b60405180910390fd5b610944611b49565b600081600101546c0c9f2c9cd04674edea40000000600860030154846000015461096e9190612912565b610978919061299b565b610982919061266f565b905060008111156109e257806109966110ea565b10156109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90612a18565b60405180910390fd5b6109e13382611ec5565b5b6000831115610a68578282600001546109fb919061266f565b8260000181905550610a533384600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b82600554610a61919061266f565b6005819055505b6c0c9f2c9cd04674edea400000006008600301548360000154610a8b9190612912565b610a95919061299b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610ae39190612304565b60405180910390a25050600160008190555050565b610b00611e37565b73ffffffffffffffffffffffffffffffffffffffff16610b1e610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90612700565b60405180910390fd5b610b7c6110ea565b811115610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612a84565b60405180910390fd5b610c0b3382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b4282604051610c519190612304565b60405180910390a250565b60075481565b600e5481565b60088060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b610cae611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ccc610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990612700565b60405180910390fd5b610d2c6000611f2f565b565b60065481565b6000600554610d41610fc4565b610d4b919061266f565b905090565b60055481565b60045481565b60008111610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690612b16565b60405180910390fd5b610dee333083600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ff5909392919063ffffffff16565b7f754fe3a3c69256b66ca56365fda4bbf3299d7c94038c105ffd43fb4b37f56db681604051610e1d9190612304565b60405180910390a150565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f548211610e70578282610e69919061266f565b9050610e93565b600f548310610e825760009050610e93565b82600f54610e90919061266f565b90505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec7611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ee5610e28565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290612700565b60405180910390fd5b438111610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490612ba8565b60405180910390fd5b80600f819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600454604051610fb99291906123af565b60405180910390a150565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110485760055490506110e7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110a3919061256a565b602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e4919061280d565b90505b90565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611148919061256a565b602060405180830381865afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611189919061280d565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112195760055481611211919061266f565b91505061121e565b809150505b90565b60026000541415611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506112ba611b49565b60008160000154111561136757600081600101546c0c9f2c9cd04674edea4000000060086003015484600001546112f19190612912565b6112fb919061299b565b611305919061266f565b9050600081111561136557806113196110ea565b101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190612a18565b60405180910390fd5b6113643382611ec5565b5b505b60008083111561153a576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ce919061256a565b602060405180830381865afa1580156113eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140f919061280d565b9050611463333086600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ff5909392919063ffffffff16565b80600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114bf919061256a565b602060405180830381865afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611500919061280d565b61150a919061266f565b915081836000015461151c9190612bc8565b8360000181905550816005546115329190612bc8565b600581905550505b6c0c9f2c9cd04674edea40000000600860030154836000015461155d9190612912565b611567919061299b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516115b59190612304565b60405180910390a25050600160008190555050565b6115d2611e37565b73ffffffffffffffffffffffffffffffffffffffff166115f0610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612700565b60405180910390fd5b806004819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f546004546040516116829291906123af565b60405180910390a150565b611695611e37565b73ffffffffffffffffffffffffffffffffffffffff166116b3610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090612700565b60405180910390fd5b6000611713610d34565b90506117628282600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167feb4e6a6a8d3c8edbd6ef48316a3670cfa0e6374eebe3f555e620399f866d2f32826040516117a89190612304565b60405180910390a25050565b600160159054906101000a900460ff16806117dc5750600160149054906101000a900460ff16155b61181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290612c90565b60405180910390fd5b6000600160159054906101000a900460ff16159050801561186b5760018060156101000a81548160ff02191690831515021790555060018060146101000a81548160ff0219169083151502179055505b85600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360048190555082600e8190555081600f8190555060405180608001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020016103e88152602001600e5481526020016000815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050506103e8600d8190555080156119d3576000600160156101000a81548160ff0219169083151502179055505b505050505050565b60026000541415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890612886565b60405180910390fd5b60026000819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ac0338260000154600860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b8060000154600554611ad2919061266f565b60058190555060008160000181905550600081600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958260000154604051611b369190612304565b60405180910390a2506001600081905550565b6008600201544311611b5a57611c1b565b60006005541415611b745743600860020181905550611c1b565b6000611b8560086002015443610e52565b90506000600d5460086001015460045484611ba09190612912565b611baa9190612912565b611bb4919061299b565b90508060076000828254611bc89190612bc8565b925050819055506005546c0c9f2c9cd04674edea4000000082611beb9190612912565b611bf5919061299b565b600860030154611c059190612bc8565b6008600301819055504360086002018190555050505b565b611c25611e37565b73ffffffffffffffffffffffffffffffffffffffff16611c43610e28565b73ffffffffffffffffffffffffffffffffffffffff1614611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9090612700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090612d22565b60405180910390fd5b611d1281611f2f565b50565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600860030154905060086002015443118015611d7a5750600060055414155b15611df7576000611d9060086002015443610e52565b90506000600d5460086001015460045484611dab9190612912565b611db59190612912565b611dbf919061299b565b90506005546c0c9f2c9cd04674edea4000000082611ddd9190612912565b611de7919061299b565b83611df29190612bc8565b925050505b81600101546c0c9f2c9cd04674edea40000000828460000154611e1a9190612912565b611e24919061299b565b611e2e919061266f565b92505050919050565b600033905090565b611ec08363a9059cbb60e01b8484604051602401611e5e929190612d42565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061207e565b505050565b8060066000828254611ed79190612bc8565b92505081905550611f2b8282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e3f9092919063ffffffff16565b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612078846323b872dd60e01b85858560405160240161201693929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061207e565b50505050565b60006120e0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121459092919063ffffffff16565b905060008151111561214057808060200190518101906121009190612dda565b61213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690612e79565b60405180910390fd5b5b505050565b6060612154848460008561215d565b90509392505050565b6060824710156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612f0b565b60405180910390fd5b6121ab85612271565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190612f77565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122139190613011565b60006040518083038185875af1925050503d8060008114612250576040519150601f19603f3d011682016040523d82523d6000602084013e612255565b606091505b5091509150612265828286612284565b92505050949350505050565b600080823b905060008111915050919050565b60608315612294578290506122e4565b6000835111156122a75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db919061307d565b60405180910390fd5b9392505050565b6000819050919050565b6122fe816122eb565b82525050565b600060208201905061231960008301846122f5565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061234f82612324565b9050919050565b61235f81612344565b811461236a57600080fd5b50565b60008135905061237c81612356565b92915050565b6000602082840312156123985761239761231f565b5b60006123a68482850161236d565b91505092915050565b60006040820190506123c460008301856122f5565b6123d160208301846122f5565b9392505050565b60006123e382612344565b9050919050565b6123f3816123d8565b81146123fe57600080fd5b50565b600081359050612410816123ea565b92915050565b60006020828403121561242c5761242b61231f565b5b600061243a84828501612401565b91505092915050565b6000819050919050565b600061246861246361245e84612324565b612443565b612324565b9050919050565b600061247a8261244d565b9050919050565b600061248c8261246f565b9050919050565b61249c81612481565b82525050565b60006020820190506124b76000830184612493565b92915050565b6124c6816122eb565b81146124d157600080fd5b50565b6000813590506124e3816124bd565b92915050565b6000602082840312156124ff576124fe61231f565b5b600061250d848285016124d4565b91505092915050565b600060808201905061252b6000830187612493565b61253860208301866122f5565b61254560408301856122f5565b61255260608301846122f5565b95945050505050565b61256481612344565b82525050565b600060208201905061257f600083018461255b565b92915050565b6000806040838503121561259c5761259b61231f565b5b60006125aa858286016124d4565b92505060206125bb858286016124d4565b9150509250929050565b600080600080600060a086880312156125e1576125e061231f565b5b60006125ef88828901612401565b955050602061260088828901612401565b9450506040612611888289016124d4565b9350506060612622888289016124d4565b9250506080612633888289016124d4565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061267a826122eb565b9150612685836122eb565b92508282101561269857612697612640565b5b828203905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006126ea6020836126a3565b91506126f5826126b4565b602082019050919050565b60006020820190508181036000830152612719816126dd565b9050919050565b7f63616e206e6f74207377656570207374616b6520746f6b656e00000000000000600082015250565b60006127566019836126a3565b915061276182612720565b602082019050919050565b6000602082019050818103600083015261278581612749565b9050919050565b7f63616e206e6f742073776565702072657761726420746f6b656e000000000000600082015250565b60006127c2601a836126a3565b91506127cd8261278c565b602082019050919050565b600060208201905081810360008301526127f1816127b5565b9050919050565b600081519050612807816124bd565b92915050565b6000602082840312156128235761282261231f565b5b6000612831848285016127f8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612870601f836126a3565b915061287b8261283a565b602082019050919050565b6000602082019050818103600083015261289f81612863565b9050919050565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b60006128dc6012836126a3565b91506128e7826128a6565b602082019050919050565b6000602082019050818103600083015261290b816128cf565b9050919050565b600061291d826122eb565b9150612928836122eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561296157612960612640565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129a6826122eb565b91506129b1836122eb565b9250826129c1576129c061296c565b5b828204905092915050565b7f696e73756666696369656e74207265776172642062616c616e63650000000000600082015250565b6000612a02601b836126a3565b9150612a0d826129cc565b602082019050919050565b60006020820190508181036000830152612a31816129f5565b9050919050565b7f6e6f7420656e6f75676820726577617264730000000000000000000000000000600082015250565b6000612a6e6012836126a3565b9150612a7982612a38565b602082019050919050565b60006020820190508181036000830152612a9d81612a61565b9050919050565b7f4465706f7369742076616c7565206d757374206265206772656174657220746860008201527f616e20302e000000000000000000000000000000000000000000000000000000602082015250565b6000612b006025836126a3565b9150612b0b82612aa4565b604082019050919050565b60006020820190508181036000830152612b2f81612af3565b9050919050565b7f6e657720626f6e757320656e6420626c6f636b206d757374206265206772656160008201527f746572207468616e2063757272656e7400000000000000000000000000000000602082015250565b6000612b926030836126a3565b9150612b9d82612b36565b604082019050919050565b60006020820190508181036000830152612bc181612b85565b9050919050565b6000612bd3826122eb565b9150612bde836122eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c1357612c12612640565b5b828201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612c7a602e836126a3565b9150612c8582612c1e565b604082019050919050565b60006020820190508181036000830152612ca981612c6d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d0c6026836126a3565b9150612d1782612cb0565b604082019050919050565b60006020820190508181036000830152612d3b81612cff565b9050919050565b6000604082019050612d57600083018561255b565b612d6460208301846122f5565b9392505050565b6000606082019050612d80600083018661255b565b612d8d602083018561255b565b612d9a60408301846122f5565b949350505050565b60008115159050919050565b612db781612da2565b8114612dc257600080fd5b50565b600081519050612dd481612dae565b92915050565b600060208284031215612df057612def61231f565b5b6000612dfe84828501612dc5565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612e63602a836126a3565b9150612e6e82612e07565b604082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612ef56026836126a3565b9150612f0082612e99565b604082019050919050565b60006020820190508181036000830152612f2481612ee8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612f61601d836126a3565b9150612f6c82612f2b565b602082019050919050565b60006020820190508181036000830152612f9081612f54565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612fcb578082015181840152602081019050612fb0565b83811115612fda576000848401525b50505050565b6000612feb82612f97565b612ff58185612fa2565b9350613005818560208601612fad565b80840191505092915050565b600061301d8284612fe0565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061304f82613028565b61305981856126a3565b9350613069818560208601612fad565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b90509291505056fea2646970667358221220bde539c186b030ddc87e92a75f2e2ad5d4f43568cbc66086f137b3f85d0d30e164736f6c634300080a0033
Deployed Bytecode Sourcemap
20839:10348:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28163:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22170:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22461:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30803:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21552:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26927:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30356:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22026:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22392:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22096:24;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15903:85;;;:::i;:::-;;21906:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29204:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21791:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21673:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28323:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15312:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23616:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21603:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23928:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28879:177;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27827:216;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25752:1022;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29434:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29668:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23012:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30000:313;;;:::i;:::-;;24916:556;;;:::i;:::-;;16128:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24245:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28163:120;28217:7;28262:16;;28238:21;;:40;;;;:::i;:::-;28231:47;;28163:120;:::o;22170:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22461:28::-;;;;:::o;30803:379::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30895:11:::1;;;;;;;;;;;30869:38;;30877:5;30869:38;;;;30861:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30976:12;;;;;;;;;;;30950:39;;30958:5;30950:39;;;;30942:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31025:15;31043:5;:15;;;31067:4;31043:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31025:48;;31078:39;31097:10;31109:7;31078:5;:18;;;;:39;;;;;:::i;:::-;31162:5;31127:50;;31150:10;31127:50;;;31169:7;31127:50;;;;;;:::i;:::-;;;;;;;;30856:326;30803:379:::0;:::o;21552:25::-;;;;;;;;;;;;;:::o;26927:810::-;19909:1;20454:7;;:19;;20446:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19909:1;20575:7;:18;;;;26989:21:::1;27013:8;:20;27022:10;27013:20;;;;;;;;;;;;;;;26989:44;;27061:7;27046:4;:11;;;:22;;27038:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;27096:12;:10;:12::i;:::-;27113:15;27186:4;:15;;;27179:4;27145:8;:31;;;27131:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;27113:88;;27219:1;27209:7;:11;27206:234;;;27333:7;27314:15;:13;:15::i;:::-;:26;;27306:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27378:56;27413:10;27426:7;27378:26;:56::i;:::-;27206:234;27459:1;27449:7;:11;27446:169;;;27496:7;27482:4;:11;;;:21;;;;:::i;:::-;27468:4;:11;;:35;;;;27509:59;27547:10;27560:7;27509:8;:16;;;;;;;;;;;;:29;;;;:59;;;;;:::i;:::-;27602:7;27588:11;;:21;;;;:::i;:::-;27574:11;:35;;;;27446:169;27687:4;27653:8;:31;;;27639:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;27621:4;:15;;:70;;;;27712:10;27703:29;;;27724:7;27703:29;;;;;;:::i;:::-;;;;;;;;26984:753;;19868:1:::0;20730:7;:22;;;;26927:810;:::o;30356:264::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30449:15:::1;:13;:15::i;:::-;30438:7;:26;;30430:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30515:46;30541:10;30553:7;30515:12;;;;;;;;;;;:25;;;;:46;;;;;:::i;:::-;30595:10;30571:44;;;30607:7;30571:44;;;;;;:::i;:::-;;;;;;;;30356:264:::0;:::o;22026:40::-;;;;:::o;22392:25::-;;;;:::o;22096:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15903:85::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15962:21:::1;15980:1;15962:9;:21::i;:::-;15903:85::o:0;21906:35::-;;;;:::o;29204:120::-;29260:7;29308:11;;29281:24;:22;:24::i;:::-;:38;;;;:::i;:::-;29274:45;;29204:120;:::o;21791:30::-;;;;:::o;21673:29::-;;;;:::o;28323:233::-;28396:1;28386:7;:11;28378:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28444:74;28482:10;28503:4;28510:7;28444:12;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;28528:23;28543:7;28528:23;;;;;;:::i;:::-;;;;;;;;28323:233;:::o;15312:78::-;15358:7;15379:6;;;;;;;;;;;15372:13;;15312:78;:::o;23616:246::-;23688:7;23713:13;;23706:3;:20;23702:156;;23747:5;23741:3;:11;;;;:::i;:::-;23734:18;;;;23702:156;23777:13;;23768:5;:22;23764:94;;23805:1;23798:8;;;;23764:94;23847:5;23831:13;;:21;;;;:::i;:::-;23824:28;;23616:246;;;;;:::o;21603:26::-;;;;;;;;;;;;;:::o;23928:258::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24027:12:::1;24010:14;:29;24002:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;24113:14;24097:13;:30;;;;24137:44;24151:13;;24166:14;;24137:44;;;;;;;:::i;:::-;;;;;;;;23928:258:::0;:::o;28879:177::-;28934:7;28967:12;;;;;;;;;;;28952:27;;:11;;;;;;;;;;;:27;;;28948:55;;;28992:11;;28985:18;;;;28948:55;29015:11;;;;;;;;;;;:21;;;29045:4;29015:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29008:43;;28879:177;;:::o;27827:216::-;27873:7;27887:15;27905:12;;;;;;;;;;;:22;;;27936:4;27905:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27887:55;;27966:12;;;;;;;;;;;27951:27;;:11;;;;;;;;;;;:27;;;27947:73;;;28003:11;;27993:7;:21;;;;:::i;:::-;27986:28;;;;;27947:73;28031:7;28024:14;;;27827:216;;:::o;25752:1022::-;19909:1;20454:7;;:19;;20446:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19909:1;20575:7;:18;;;;25813:21:::1;25837:8;:20;25846:10;25837:20;;;;;;;;;;;;;;;25813:44;;25862:12;:10;:12::i;:::-;25897:1;25883:4;:11;;;:15;25879:364;;;25906:15;25979:4;:15;;;25972:4;25938:8;:31;;;25924:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;25906:88;;26013:1;26003:7;:11;26000:238;;;26129:7;26110:15;:13;:15::i;:::-;:26;;26102:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26175:56;26210:10;26223:7;26175:26;:56::i;:::-;26000:238;25900:343;25879:364;26249:26;26298:1:::0;26288:7:::1;:11;26284:360;;;26307:23;26333:11;;;;;;;;;;;:21;;;26363:4;26333:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26307:62;;26375:78;26417:10;26438:4;26445:7;26375:8;:16;;;;;;;;;;;;:33;;;;:78;;;;;;:::i;:::-;26519:15;26480:11;;;;;;;;;;;:21;;;26510:4;26480:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;26459:75;;26568:18;26554:4;:11;;;:32;;;;:::i;:::-;26540:4;:11;;:46;;;;26620:18;26606:11;;:32;;;;:::i;:::-;26592:11;:46;;;;26301:343;26284:360;26714:4;26680:8;:31;;;26666:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;26648:4;:15;;:70;;;;26738:10;26730:39;;;26750:18;26730:39;;;;;;:::i;:::-;;;;;;;;25808:966;;19868:1:::0;20730:7;:22;;;;25752:1022;:::o;29434:167::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29527:15:::1;29510:14;:32;;;;29552:44;29566:13;;29581:14;;29552:44;;;;;;;:::i;:::-;;;;;;;;29434:167:::0;:::o;29668:237::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29733:28:::1;29764:25;:23;:25::i;:::-;29733:56;;29794:51;29819:3;29824:20;29794:11;;;;;;;;;;;:24;;;;:51;;;;;:::i;:::-;29874:3;29855:45;;;29879:20;29855:45;;;;;;:::i;:::-;;;;;;;;29728:177;29668:237:::0;:::o;23012:534::-;17908:13;;;;;;;;;;;:30;;;;17926:12;;;;;;;;;;;17925:13;17908:30;17900:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;17996:19;18019:13;;;;;;;;;;;18018:14;17996:36;;18041:14;18037:77;;;18079:4;18063:13;;:20;;;;;;;;;;;;;;;;;;18104:4;18089:12;;:19;;;;;;;;;;;;;;;;;;18037:77;23204:11:::1;23190;;:25;;;;;;;;;;;;;;;;;;23235:12;23220;;:27;;;;;;;;;;;;;;;;;;23269:15;23252:14;:32;;;;23302:11;23289:10;:24;;;;23334:14;23318:13;:30;;;;23385:127;;;;;;;;23409:11;23385:127;;;;;;23438:4;23385:127;;;;23465:10;;23385:127;;;;23505:1;23385:127;;::::0;23374:8:::1;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23537:4;23519:15;:22;;;;18132:14:::0;18128:53;;;18170:5;18154:13;;:21;;;;;;;;;;;;;;;;;;18128:53;17895:290;23012:534;;;;;:::o;30000:313::-;19909:1;20454:7;;:19;;20446:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19909:1;20575:7;:18;;;;30056:21:::1;30080:8;:20;30089:10;30080:20;;;;;;;;;;;;;;;30056:44;;30105:63;30143:10;30156:4;:11;;;30105:8;:16;;;;;;;;;;;;:29;;;;:63;;;;;:::i;:::-;30201:4;:11;;;30187;;:25;;;;:::i;:::-;30173:11;:39;;;;30231:1;30217:4;:11;;:15;;;;30255:1;30237:4;:15;;:19;;;;30284:10;30266:42;;;30296:4;:11;;;30266:42;;;;;;:::i;:::-;;;;;;;;30051:262;19868:1:::0;20730:7;:22;;;;30000:313::o;24916:556::-;24970:8;:24;;;24954:12;:40;24950:64;;25002:7;;24950:64;25037:1;25022:11;;:16;25018:85;;;25073:12;25046:8;:24;;:39;;;;25091:7;;25018:85;25107:18;25128:53;25142:8;:24;;;25168:12;25128:13;:53::i;:::-;25107:74;;25186:19;25260:15;;25238:8;:19;;;25221:14;;25208:10;:27;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;25186:89;;25305:11;25280:21;;:36;;;;;;;:::i;:::-;;;;;;;;25411:11;;25404:4;25390:11;:18;;;;:::i;:::-;:32;;;;:::i;:::-;25355:8;:31;;;:68;;;;:::i;:::-;25321:8;:31;;:102;;;;25455:12;25428:8;:24;;:39;;;;24945:527;;24916:556;:::o;16128:177::-;15516:12;:10;:12::i;:::-;15505:23;;:7;:5;:7::i;:::-;:23;;;15497:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16231:1:::1;16211:22;;:8;:22;;;;16203:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16281:19;16291:8;16281:9;:19::i;:::-;16128:177:::0;:::o;24245:601::-;24306:7;24320:21;24344:8;:15;24353:5;24344:15;;;;;;;;;;;;;;;24320:39;;24364:30;24397:8;:31;;;24364:64;;24452:8;:24;;;24437:12;:39;:59;;;;;24495:1;24480:11;;:16;;24437:59;24433:336;;;24504:18;24525:53;24539:8;:24;;;24565:12;24525:13;:53::i;:::-;24504:74;;24584:19;24658:15;;24636:8;:19;;;24619:14;;24606:10;:27;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;24584:89;;24751:11;;24744:4;24730:11;:18;;;;:::i;:::-;:32;;;;:::i;:::-;24704:22;:59;;;;:::i;:::-;24679:84;;24498:271;;24433:336;24826:4;:15;;;24819:4;24794:22;24780:4;:11;;;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:61;;;;:::i;:::-;24773:68;;;;24245:601;;;:::o;14156:89::-;14209:7;14230:10;14223:17;;14156:89;:::o;10595:181::-;10685:86;10705:5;10735:23;;;10760:2;10764:5;10712:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10685:19;:86::i;:::-;10595:181;;;:::o;28665:156::-;28765:7;28745:16;;:27;;;;;;;:::i;:::-;;;;;;;;28777:39;28803:3;28808:7;28777:12;;;;;;;;;;;:25;;;;:39;;;;;:::i;:::-;28665:156;;:::o;16310:152::-;16360:16;16379:6;;;;;;;;;;;16360:25;;16399:8;16390:6;;:17;;;;;;;;;;;;;;;;;;16448:8;16417:40;;16438:8;16417:40;;;;;;;;;;;;16355:107;16310:152;:::o;10781:212::-;10892:96;10912:5;10942:27;;;10971:4;10977:2;10981:5;10919:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10892:19;:96::i;:::-;10781:212;;;;:::o;12862:659::-;13262:23;13288:69;13316:4;13288:69;;;;;;;;;;;;;;;;;13296:5;13288:27;;;;:69;;;;;:::i;:::-;13262:95;;13386:1;13366:10;:17;:21;13362:155;;;13445:10;13434:30;;;;;;;;;;;;:::i;:::-;13426:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13362:155;12932:589;12862:659;;:::o;5986:199::-;6102:12;6128:52;6150:6;6158:4;6164:1;6167:12;6128:21;:52::i;:::-;6121:59;;5986:199;;;;;:::o;6989:456::-;7132:12;7184:5;7159:21;:30;;7151:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7245:18;7256:6;7245:10;:18::i;:::-;7237:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7305:12;7319:23;7346:6;:11;;7365:5;7372:4;7346:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7304:73;;;;7389:51;7406:7;7415:10;7427:12;7389:16;:51::i;:::-;7382:58;;;;6989:456;;;;;;:::o;3393:333::-;3453:4;3637:12;3689:7;3677:20;3669:28;;3720:1;3713:4;:8;3706:15;;;3393:333;;;:::o;9414:547::-;9543:12;9566:7;9562:395;;;9588:10;9581:17;;;;9562:395;9698:1;9678:10;:17;:21;9674:278;;;9837:10;9831:17;9883:15;9870:10;9866:2;9862:19;9855:44;9674:278;9932:12;9925:20;;;;;;;;;;;:::i;:::-;;;;;;;;9414:547;;;;;;:::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:332::-;1732:4;1770:2;1759:9;1755:18;1747:26;;1783:71;1851:1;1840:9;1836:17;1827:6;1783:71;:::i;:::-;1864:72;1932:2;1921:9;1917:18;1908:6;1864:72;:::i;:::-;1611:332;;;;;:::o;1949:109::-;1999:7;2028:24;2046:5;2028:24;:::i;:::-;2017:35;;1949:109;;;:::o;2064:148::-;2150:37;2181:5;2150:37;:::i;:::-;2143:5;2140:48;2130:76;;2202:1;2199;2192:12;2130:76;2064:148;:::o;2218:165::-;2277:5;2315:6;2302:20;2293:29;;2331:46;2371:5;2331:46;:::i;:::-;2218:165;;;;:::o;2389:355::-;2461:6;2510:2;2498:9;2489:7;2485:23;2481:32;2478:119;;;2516:79;;:::i;:::-;2478:119;2636:1;2661:66;2719:7;2710:6;2699:9;2695:22;2661:66;:::i;:::-;2651:76;;2607:130;2389:355;;;;:::o;2750:60::-;2778:3;2799:5;2792:12;;2750:60;;;:::o;2816:142::-;2866:9;2899:53;2917:34;2926:24;2944:5;2926:24;:::i;:::-;2917:34;:::i;:::-;2899:53;:::i;:::-;2886:66;;2816:142;;;:::o;2964:126::-;3014:9;3047:37;3078:5;3047:37;:::i;:::-;3034:50;;2964:126;;;:::o;3096:139::-;3159:9;3192:37;3223:5;3192:37;:::i;:::-;3179:50;;3096:139;;;:::o;3241:157::-;3341:50;3385:5;3341:50;:::i;:::-;3336:3;3329:63;3241:157;;:::o;3404:248::-;3510:4;3548:2;3537:9;3533:18;3525:26;;3561:84;3642:1;3631:9;3627:17;3618:6;3561:84;:::i;:::-;3404:248;;;;:::o;3658:122::-;3731:24;3749:5;3731:24;:::i;:::-;3724:5;3721:35;3711:63;;3770:1;3767;3760:12;3711:63;3658:122;:::o;3786:139::-;3832:5;3870:6;3857:20;3848:29;;3886:33;3913:5;3886:33;:::i;:::-;3786:139;;;;:::o;3931:329::-;3990:6;4039:2;4027:9;4018:7;4014:23;4010:32;4007:119;;;4045:79;;:::i;:::-;4007:119;4165:1;4190:53;4235:7;4226:6;4215:9;4211:22;4190:53;:::i;:::-;4180:63;;4136:117;3931:329;;;;:::o;4266:579::-;4456:4;4494:3;4483:9;4479:19;4471:27;;4508:84;4589:1;4578:9;4574:17;4565:6;4508:84;:::i;:::-;4602:72;4670:2;4659:9;4655:18;4646:6;4602:72;:::i;:::-;4684;4752:2;4741:9;4737:18;4728:6;4684:72;:::i;:::-;4766;4834:2;4823:9;4819:18;4810:6;4766:72;:::i;:::-;4266:579;;;;;;;:::o;4851:118::-;4938:24;4956:5;4938:24;:::i;:::-;4933:3;4926:37;4851:118;;:::o;4975:222::-;5068:4;5106:2;5095:9;5091:18;5083:26;;5119:71;5187:1;5176:9;5172:17;5163:6;5119:71;:::i;:::-;4975:222;;;;:::o;5203:474::-;5271:6;5279;5328:2;5316:9;5307:7;5303:23;5299:32;5296:119;;;5334:79;;:::i;:::-;5296:119;5454:1;5479:53;5524:7;5515:6;5504:9;5500:22;5479:53;:::i;:::-;5469:63;;5425:117;5581:2;5607:53;5652:7;5643:6;5632:9;5628:22;5607:53;:::i;:::-;5597:63;;5552:118;5203:474;;;;;:::o;5683:963::-;5804:6;5812;5820;5828;5836;5885:3;5873:9;5864:7;5860:23;5856:33;5853:120;;;5892:79;;:::i;:::-;5853:120;6012:1;6037:66;6095:7;6086:6;6075:9;6071:22;6037:66;:::i;:::-;6027:76;;5983:130;6152:2;6178:66;6236:7;6227:6;6216:9;6212:22;6178:66;:::i;:::-;6168:76;;6123:131;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;6421:2;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6392:118;6549:3;6576:53;6621:7;6612:6;6601:9;6597:22;6576:53;:::i;:::-;6566:63;;6520:119;5683:963;;;;;;;;:::o;6652:180::-;6700:77;6697:1;6690:88;6797:4;6794:1;6787:15;6821:4;6818:1;6811:15;6838:191;6878:4;6898:20;6916:1;6898:20;:::i;:::-;6893:25;;6932:20;6950:1;6932:20;:::i;:::-;6927:25;;6971:1;6968;6965:8;6962:34;;;6976:18;;:::i;:::-;6962:34;7021:1;7018;7014:9;7006:17;;6838:191;;;;:::o;7035:169::-;7119:11;7153:6;7148:3;7141:19;7193:4;7188:3;7184:14;7169:29;;7035:169;;;;:::o;7210:182::-;7350:34;7346:1;7338:6;7334:14;7327:58;7210:182;:::o;7398:366::-;7540:3;7561:67;7625:2;7620:3;7561:67;:::i;:::-;7554:74;;7637:93;7726:3;7637:93;:::i;:::-;7755:2;7750:3;7746:12;7739:19;;7398:366;;;:::o;7770:419::-;7936:4;7974:2;7963:9;7959:18;7951:26;;8023:9;8017:4;8013:20;8009:1;7998:9;7994:17;7987:47;8051:131;8177:4;8051:131;:::i;:::-;8043:139;;7770:419;;;:::o;8195:175::-;8335:27;8331:1;8323:6;8319:14;8312:51;8195:175;:::o;8376:366::-;8518:3;8539:67;8603:2;8598:3;8539:67;:::i;:::-;8532:74;;8615:93;8704:3;8615:93;:::i;:::-;8733:2;8728:3;8724:12;8717:19;;8376:366;;;:::o;8748:419::-;8914:4;8952:2;8941:9;8937:18;8929:26;;9001:9;8995:4;8991:20;8987:1;8976:9;8972:17;8965:47;9029:131;9155:4;9029:131;:::i;:::-;9021:139;;8748:419;;;:::o;9173:176::-;9313:28;9309:1;9301:6;9297:14;9290:52;9173:176;:::o;9355:366::-;9497:3;9518:67;9582:2;9577:3;9518:67;:::i;:::-;9511:74;;9594:93;9683:3;9594:93;:::i;:::-;9712:2;9707:3;9703:12;9696:19;;9355:366;;;:::o;9727:419::-;9893:4;9931:2;9920:9;9916:18;9908:26;;9980:9;9974:4;9970:20;9966:1;9955:9;9951:17;9944:47;10008:131;10134:4;10008:131;:::i;:::-;10000:139;;9727:419;;;:::o;10152:143::-;10209:5;10240:6;10234:13;10225:22;;10256:33;10283:5;10256:33;:::i;:::-;10152:143;;;;:::o;10301:351::-;10371:6;10420:2;10408:9;10399:7;10395:23;10391:32;10388:119;;;10426:79;;:::i;:::-;10388:119;10546:1;10571:64;10627:7;10618:6;10607:9;10603:22;10571:64;:::i;:::-;10561:74;;10517:128;10301:351;;;;:::o;10658:181::-;10798:33;10794:1;10786:6;10782:14;10775:57;10658:181;:::o;10845:366::-;10987:3;11008:67;11072:2;11067:3;11008:67;:::i;:::-;11001:74;;11084:93;11173:3;11084:93;:::i;:::-;11202:2;11197:3;11193:12;11186:19;;10845:366;;;:::o;11217:419::-;11383:4;11421:2;11410:9;11406:18;11398:26;;11470:9;11464:4;11460:20;11456:1;11445:9;11441:17;11434:47;11498:131;11624:4;11498:131;:::i;:::-;11490:139;;11217:419;;;:::o;11642:168::-;11782:20;11778:1;11770:6;11766:14;11759:44;11642:168;:::o;11816:366::-;11958:3;11979:67;12043:2;12038:3;11979:67;:::i;:::-;11972:74;;12055:93;12144:3;12055:93;:::i;:::-;12173:2;12168:3;12164:12;12157:19;;11816:366;;;:::o;12188:419::-;12354:4;12392:2;12381:9;12377:18;12369:26;;12441:9;12435:4;12431:20;12427:1;12416:9;12412:17;12405:47;12469:131;12595:4;12469:131;:::i;:::-;12461:139;;12188:419;;;:::o;12613:348::-;12653:7;12676:20;12694:1;12676:20;:::i;:::-;12671:25;;12710:20;12728:1;12710:20;:::i;:::-;12705:25;;12898:1;12830:66;12826:74;12823:1;12820:81;12815:1;12808:9;12801:17;12797:105;12794:131;;;12905:18;;:::i;:::-;12794:131;12953:1;12950;12946:9;12935:20;;12613:348;;;;:::o;12967:180::-;13015:77;13012:1;13005:88;13112:4;13109:1;13102:15;13136:4;13133:1;13126:15;13153:185;13193:1;13210:20;13228:1;13210:20;:::i;:::-;13205:25;;13244:20;13262:1;13244:20;:::i;:::-;13239:25;;13283:1;13273:35;;13288:18;;:::i;:::-;13273:35;13330:1;13327;13323:9;13318:14;;13153:185;;;;:::o;13344:177::-;13484:29;13480:1;13472:6;13468:14;13461:53;13344:177;:::o;13527:366::-;13669:3;13690:67;13754:2;13749:3;13690:67;:::i;:::-;13683:74;;13766:93;13855:3;13766:93;:::i;:::-;13884:2;13879:3;13875:12;13868:19;;13527:366;;;:::o;13899:419::-;14065:4;14103:2;14092:9;14088:18;14080:26;;14152:9;14146:4;14142:20;14138:1;14127:9;14123:17;14116:47;14180:131;14306:4;14180:131;:::i;:::-;14172:139;;13899:419;;;:::o;14324:168::-;14464:20;14460:1;14452:6;14448:14;14441:44;14324:168;:::o;14498:366::-;14640:3;14661:67;14725:2;14720:3;14661:67;:::i;:::-;14654:74;;14737:93;14826:3;14737:93;:::i;:::-;14855:2;14850:3;14846:12;14839:19;;14498:366;;;:::o;14870:419::-;15036:4;15074:2;15063:9;15059:18;15051:26;;15123:9;15117:4;15113:20;15109:1;15098:9;15094:17;15087:47;15151:131;15277:4;15151:131;:::i;:::-;15143:139;;14870:419;;;:::o;15295:224::-;15435:34;15431:1;15423:6;15419:14;15412:58;15504:7;15499:2;15491:6;15487:15;15480:32;15295:224;:::o;15525:366::-;15667:3;15688:67;15752:2;15747:3;15688:67;:::i;:::-;15681:74;;15764:93;15853:3;15764:93;:::i;:::-;15882:2;15877:3;15873:12;15866:19;;15525:366;;;:::o;15897:419::-;16063:4;16101:2;16090:9;16086:18;16078:26;;16150:9;16144:4;16140:20;16136:1;16125:9;16121:17;16114:47;16178:131;16304:4;16178:131;:::i;:::-;16170:139;;15897:419;;;:::o;16322:235::-;16462:34;16458:1;16450:6;16446:14;16439:58;16531:18;16526:2;16518:6;16514:15;16507:43;16322:235;:::o;16563:366::-;16705:3;16726:67;16790:2;16785:3;16726:67;:::i;:::-;16719:74;;16802:93;16891:3;16802:93;:::i;:::-;16920:2;16915:3;16911:12;16904:19;;16563:366;;;:::o;16935:419::-;17101:4;17139:2;17128:9;17124:18;17116:26;;17188:9;17182:4;17178:20;17174:1;17163:9;17159:17;17152:47;17216:131;17342:4;17216:131;:::i;:::-;17208:139;;16935:419;;;:::o;17360:305::-;17400:3;17419:20;17437:1;17419:20;:::i;:::-;17414:25;;17453:20;17471:1;17453:20;:::i;:::-;17448:25;;17607:1;17539:66;17535:74;17532:1;17529:81;17526:107;;;17613:18;;:::i;:::-;17526:107;17657:1;17654;17650:9;17643:16;;17360:305;;;;:::o;17671:233::-;17811:34;17807:1;17799:6;17795:14;17788:58;17880:16;17875:2;17867:6;17863:15;17856:41;17671:233;:::o;17910:366::-;18052:3;18073:67;18137:2;18132:3;18073:67;:::i;:::-;18066:74;;18149:93;18238:3;18149:93;:::i;:::-;18267:2;18262:3;18258:12;18251:19;;17910:366;;;:::o;18282:419::-;18448:4;18486:2;18475:9;18471:18;18463:26;;18535:9;18529:4;18525:20;18521:1;18510:9;18506:17;18499:47;18563:131;18689:4;18563:131;:::i;:::-;18555:139;;18282:419;;;:::o;18707:225::-;18847:34;18843:1;18835:6;18831:14;18824:58;18916:8;18911:2;18903:6;18899:15;18892:33;18707:225;:::o;18938:366::-;19080:3;19101:67;19165:2;19160:3;19101:67;:::i;:::-;19094:74;;19177:93;19266:3;19177:93;:::i;:::-;19295:2;19290:3;19286:12;19279:19;;18938:366;;;:::o;19310:419::-;19476:4;19514:2;19503:9;19499:18;19491:26;;19563:9;19557:4;19553:20;19549:1;19538:9;19534:17;19527:47;19591:131;19717:4;19591:131;:::i;:::-;19583:139;;19310:419;;;:::o;19735:332::-;19856:4;19894:2;19883:9;19879:18;19871:26;;19907:71;19975:1;19964:9;19960:17;19951:6;19907:71;:::i;:::-;19988:72;20056:2;20045:9;20041:18;20032:6;19988:72;:::i;:::-;19735:332;;;;;:::o;20073:442::-;20222:4;20260:2;20249:9;20245:18;20237:26;;20273:71;20341:1;20330:9;20326:17;20317:6;20273:71;:::i;:::-;20354:72;20422:2;20411:9;20407:18;20398:6;20354:72;:::i;:::-;20436;20504:2;20493:9;20489:18;20480:6;20436:72;:::i;:::-;20073:442;;;;;;:::o;20521:90::-;20555:7;20598:5;20591:13;20584:21;20573:32;;20521:90;;;:::o;20617:116::-;20687:21;20702:5;20687:21;:::i;:::-;20680:5;20677:32;20667:60;;20723:1;20720;20713:12;20667:60;20617:116;:::o;20739:137::-;20793:5;20824:6;20818:13;20809:22;;20840:30;20864:5;20840:30;:::i;:::-;20739:137;;;;:::o;20882:345::-;20949:6;20998:2;20986:9;20977:7;20973:23;20969:32;20966:119;;;21004:79;;:::i;:::-;20966:119;21124:1;21149:61;21202:7;21193:6;21182:9;21178:22;21149:61;:::i;:::-;21139:71;;21095:125;20882:345;;;;:::o;21233:229::-;21373:34;21369:1;21361:6;21357:14;21350:58;21442:12;21437:2;21429:6;21425:15;21418:37;21233:229;:::o;21468:366::-;21610:3;21631:67;21695:2;21690:3;21631:67;:::i;:::-;21624:74;;21707:93;21796:3;21707:93;:::i;:::-;21825:2;21820:3;21816:12;21809:19;;21468:366;;;:::o;21840:419::-;22006:4;22044:2;22033:9;22029:18;22021:26;;22093:9;22087:4;22083:20;22079:1;22068:9;22064:17;22057:47;22121:131;22247:4;22121:131;:::i;:::-;22113:139;;21840:419;;;:::o;22265:225::-;22405:34;22401:1;22393:6;22389:14;22382:58;22474:8;22469:2;22461:6;22457:15;22450:33;22265:225;:::o;22496:366::-;22638:3;22659:67;22723:2;22718:3;22659:67;:::i;:::-;22652:74;;22735:93;22824:3;22735:93;:::i;:::-;22853:2;22848:3;22844:12;22837:19;;22496:366;;;:::o;22868:419::-;23034:4;23072:2;23061:9;23057:18;23049:26;;23121:9;23115:4;23111:20;23107:1;23096:9;23092:17;23085:47;23149:131;23275:4;23149:131;:::i;:::-;23141:139;;22868:419;;;:::o;23293:179::-;23433:31;23429:1;23421:6;23417:14;23410:55;23293:179;:::o;23478:366::-;23620:3;23641:67;23705:2;23700:3;23641:67;:::i;:::-;23634:74;;23717:93;23806:3;23717:93;:::i;:::-;23835:2;23830:3;23826:12;23819:19;;23478:366;;;:::o;23850:419::-;24016:4;24054:2;24043:9;24039:18;24031:26;;24103:9;24097:4;24093:20;24089:1;24078:9;24074:17;24067:47;24131:131;24257:4;24131:131;:::i;:::-;24123:139;;23850:419;;;:::o;24275:98::-;24326:6;24360:5;24354:12;24344:22;;24275:98;;;:::o;24379:147::-;24480:11;24517:3;24502:18;;24379:147;;;;:::o;24532:307::-;24600:1;24610:113;24624:6;24621:1;24618:13;24610:113;;;24709:1;24704:3;24700:11;24694:18;24690:1;24685:3;24681:11;24674:39;24646:2;24643:1;24639:10;24634:15;;24610:113;;;24741:6;24738:1;24735:13;24732:101;;;24821:1;24812:6;24807:3;24803:16;24796:27;24732:101;24581:258;24532:307;;;:::o;24845:373::-;24949:3;24977:38;25009:5;24977:38;:::i;:::-;25031:88;25112:6;25107:3;25031:88;:::i;:::-;25024:95;;25128:52;25173:6;25168:3;25161:4;25154:5;25150:16;25128:52;:::i;:::-;25205:6;25200:3;25196:16;25189:23;;24953:265;24845:373;;;;:::o;25224:271::-;25354:3;25376:93;25465:3;25456:6;25376:93;:::i;:::-;25369:100;;25486:3;25479:10;;25224:271;;;;:::o;25501:99::-;25553:6;25587:5;25581:12;25571:22;;25501:99;;;:::o;25606:102::-;25647:6;25698:2;25694:7;25689:2;25682:5;25678:14;25674:28;25664:38;;25606:102;;;:::o;25714:364::-;25802:3;25830:39;25863:5;25830:39;:::i;:::-;25885:71;25949:6;25944:3;25885:71;:::i;:::-;25878:78;;25965:52;26010:6;26005:3;25998:4;25991:5;25987:16;25965:52;:::i;:::-;26042:29;26064:6;26042:29;:::i;:::-;26037:3;26033:39;26026:46;;25806:272;25714:364;;;;:::o;26084:313::-;26197:4;26235:2;26224:9;26220:18;26212:26;;26284:9;26278:4;26274:20;26270:1;26259:9;26255:17;26248:47;26312:78;26385:4;26376:6;26312:78;:::i;:::-;26304:86;;26084:313;;;;:::o
Swarm Source
ipfs://bde539c186b030ddc87e92a75f2e2ad5d4f43568cbc66086f137b3f85d0d30e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.00268 | 91,422,323.3864 | $245,015.48 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.