More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 201 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Any ERC... | 17484852 | 530 days ago | IN | 0 ETH | 0.00092993 | ||||
Unstake | 16700650 | 641 days ago | IN | 0 ETH | 0.00251916 | ||||
Claim | 16700642 | 641 days ago | IN | 0 ETH | 0.00194005 | ||||
Unstake | 15513124 | 807 days ago | IN | 0 ETH | 0.00022665 | ||||
Unstake | 15513096 | 807 days ago | IN | 0 ETH | 0.00015231 | ||||
Unstake | 15513096 | 807 days ago | IN | 0 ETH | 0.00013929 | ||||
Unstake | 15513095 | 807 days ago | IN | 0 ETH | 0.0003267 | ||||
Claim | 15249234 | 849 days ago | IN | 0 ETH | 0.0002662 | ||||
Unstake | 15249230 | 849 days ago | IN | 0 ETH | 0.00073984 | ||||
Unstake | 15170623 | 861 days ago | IN | 0 ETH | 0.00338472 | ||||
Claim | 15170619 | 861 days ago | IN | 0 ETH | 0.00343012 | ||||
Unstake | 15018038 | 886 days ago | IN | 0 ETH | 0.00124551 | ||||
Claim | 14991799 | 891 days ago | IN | 0 ETH | 0.00110771 | ||||
Unstake | 14991796 | 891 days ago | IN | 0 ETH | 0.00393264 | ||||
Re Invest | 14606201 | 953 days ago | IN | 0 ETH | 0.00141131 | ||||
Claim | 14544762 | 963 days ago | IN | 0 ETH | 0.00410626 | ||||
Re Invest | 14343627 | 994 days ago | IN | 0 ETH | 0.00265116 | ||||
Claim | 14316730 | 998 days ago | IN | 0 ETH | 0.00169274 | ||||
Unstake | 14316716 | 998 days ago | IN | 0 ETH | 0.00511217 | ||||
Unstake | 14282284 | 1004 days ago | IN | 0 ETH | 0.00333853 | ||||
Claim | 14277211 | 1005 days ago | IN | 0 ETH | 0.00479206 | ||||
Unstake | 14219884 | 1013 days ago | IN | 0 ETH | 0.00260236 | ||||
Unstake | 14219883 | 1013 days ago | IN | 0 ETH | 0.01136542 | ||||
Claim | 14204032 | 1016 days ago | IN | 0 ETH | 0.00117056 | ||||
Unstake | 14204032 | 1016 days ago | IN | 0 ETH | 0.00385985 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ConstantReturnStaking
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-25 */ // SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.6.11; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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.3._ */ 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.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner public { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } interface Token { function transferFrom(address, address, uint) external returns (bool); function transfer(address, uint) external returns (bool); } interface LegacyToken { function transfer(address, uint) external; } contract ConstantReturnStaking is Ownable { using Address for address; using SafeMath for uint; using EnumerableSet for EnumerableSet.AddressSet; event RewardsTransferred(address indexed holder, uint amount); event ReferralFeeTransferred(address indexed referrer, uint amount); event Reinvest(address indexed holder, uint amount); // ============================= CONTRACT VARIABLES ============================== // stake token contract address address public constant TRUSTED_TOKEN_ADDRESS = 0x961C8c0B1aaD0c0b10a51FeF6a867E3091BCef17; // earnings reward rate uint public constant REWARD_RATE_X_100 = 2000; uint public constant REWARD_INTERVAL = 365 days; // staking fee uint public constant STAKING_FEE_RATE_X_100 = 0; // unstaking fee uint public constant UNSTAKING_FEE_RATE_X_100 = 25; // this % of earned rewards go to referrer uint public constant REFERRAL_FEE_RATE_X_100 = 500; // unstaking possible after 72 hours uint public constant LOCKUP_TIME = 30 days; uint public constant ADMIN_CAN_CLAIM_AFTER = 395 days; // ========================= END CONTRACT VARIABLES ============================== uint public totalClaimedRewards = 0; uint public totalClaimedReferralFee = 0; uint public immutable contractStartTime; // Contracts are not allowed to deposit, claim or withdraw modifier noContractsAllowed() { require(!(address(msg.sender).isContract()) && tx.origin == msg.sender, "No Contracts Allowed!"); _; } EnumerableSet.AddressSet private holders; mapping (address => uint) public depositedTokens; mapping (address => uint) public stakingTime; mapping (address => uint) public lastClaimedTime; mapping (address => uint) public totalEarnedTokens; mapping (address => uint) public rewardsPendingClaim; mapping (address => address) public referrals; mapping (address => uint) public totalReferralFeeEarned; mapping (address => EnumerableSet.AddressSet) private activeReferredAddressesOfUser; mapping (address => EnumerableSet.AddressSet) private totalReferredAddressesOfUser; constructor() public { contractStartTime = now; } function updateAccount(address account) private { uint pendingDivs = getPendingDivs(account); if (pendingDivs > 0) { uint referralFee = pendingDivs.mul(REFERRAL_FEE_RATE_X_100).div(100e2); uint pendingDivsAfterFee = pendingDivs.sub(referralFee); bool success = transferReferralFeeIfPossible(referrals[account], referralFee); uint amount = pendingDivs; if (success) { amount = pendingDivsAfterFee; } rewardsPendingClaim[account] = rewardsPendingClaim[account].add(amount); totalEarnedTokens[account] = totalEarnedTokens[account].add(amount); totalClaimedRewards = totalClaimedRewards.add(amount); } lastClaimedTime[account] = now; } function transferReferralFeeIfPossible(address account, uint amount) private returns (bool) { if (account != address(0) && amount > 0) { totalReferralFeeEarned[account] = totalReferralFeeEarned[account].add(amount); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(account, amount), "Could not transfer referral fee!"); totalClaimedReferralFee = totalClaimedReferralFee.add(amount); emit ReferralFeeTransferred(account, amount); return true; } return false; } function getPendingDivs(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint timeDiff; uint stakingEndTime = contractStartTime.add(REWARD_INTERVAL); uint _now = now; if (_now > stakingEndTime) { _now = stakingEndTime; } if (lastClaimedTime[_holder] >= _now) { timeDiff = 0; } else { timeDiff = _now.sub(lastClaimedTime[_holder]); } uint stakedAmount = depositedTokens[_holder]; uint pendingDivs = stakedAmount .mul(REWARD_RATE_X_100) .mul(timeDiff) .div(REWARD_INTERVAL) .div(1e4); return pendingDivs; } function getTotalPendingDivs(address _holder) external view returns (uint) { uint pending = getPendingDivs(_holder); uint awaitingClaim = rewardsPendingClaim[_holder]; return pending.add(awaitingClaim); } function getNumberOfHolders() external view returns (uint) { return holders.length(); } function getNumberOfReferredStakers(address referrer) external view returns (uint _activeStakers, uint _totalStakers) { _activeStakers = activeReferredAddressesOfUser[referrer].length(); _totalStakers = totalReferredAddressesOfUser[referrer].length(); } function getReferredStaker(address account, uint i) external view returns (address _staker, uint _totalEarned) { _staker = totalReferredAddressesOfUser[account].at(i); _totalEarned = totalEarnedTokens[_staker]; } function getActiveReferredStaker(address account, uint i) external view returns (address _staker, uint _totalEarned) { _staker = activeReferredAddressesOfUser[account].at(i); _totalEarned = totalEarnedTokens[_staker]; } function stake(uint amountToStake, address referrer) external noContractsAllowed { require(amountToStake > 0, "Cannot deposit 0 Tokens"); require(Token(TRUSTED_TOKEN_ADDRESS).transferFrom(msg.sender, address(this), amountToStake), "Insufficient Token Allowance"); updateAccount(msg.sender); uint fee = amountToStake.mul(STAKING_FEE_RATE_X_100).div(1e4); uint amountAfterFee = amountToStake.sub(fee); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(owner, fee), "Could not transfer deposit fee."); depositedTokens[msg.sender] = depositedTokens[msg.sender].add(amountAfterFee); holders.add(msg.sender); if (referrals[msg.sender] == address(0)) { referrals[msg.sender] = referrer; } totalReferredAddressesOfUser[referrals[msg.sender]].add(msg.sender); activeReferredAddressesOfUser[referrals[msg.sender]].add(msg.sender); stakingTime[msg.sender] = now; } function unstake(uint amountToWithdraw) external noContractsAllowed { require(depositedTokens[msg.sender] >= amountToWithdraw, "Invalid amount to withdraw"); require(now.sub(stakingTime[msg.sender]) > LOCKUP_TIME, "You recently staked, please wait before withdrawing."); updateAccount(msg.sender); uint fee = amountToWithdraw.mul(UNSTAKING_FEE_RATE_X_100).div(1e4); uint amountAfterFee = amountToWithdraw.sub(fee); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(owner, fee), "Could not transfer withdraw fee."); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, amountAfterFee), "Could not transfer tokens."); depositedTokens[msg.sender] = depositedTokens[msg.sender].sub(amountToWithdraw); if (holders.contains(msg.sender) && depositedTokens[msg.sender] == 0) { holders.remove(msg.sender); activeReferredAddressesOfUser[referrals[msg.sender]].remove(msg.sender); } } // emergency unstake without caring about pending earnings // pending earnings will be lost / set to 0 if used emergency unstake function emergencyUnstake(uint amountToWithdraw) external noContractsAllowed { require(depositedTokens[msg.sender] >= amountToWithdraw, "Invalid amount to withdraw"); require(now.sub(stakingTime[msg.sender]) > LOCKUP_TIME, "You recently staked, please wait before withdrawing."); // set pending earnings to 0 here lastClaimedTime[msg.sender] = now; uint fee = amountToWithdraw.mul(UNSTAKING_FEE_RATE_X_100).div(1e4); uint amountAfterFee = amountToWithdraw.sub(fee); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(owner, fee), "Could not transfer withdraw fee."); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, amountAfterFee), "Could not transfer tokens."); depositedTokens[msg.sender] = depositedTokens[msg.sender].sub(amountToWithdraw); if (holders.contains(msg.sender) && depositedTokens[msg.sender] == 0) { holders.remove(msg.sender); } } function claim() external noContractsAllowed { updateAccount(msg.sender); uint amount = rewardsPendingClaim[msg.sender]; if (amount > 0) { rewardsPendingClaim[msg.sender] = 0; require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, amount), "Could not transfer earned tokens."); emit RewardsTransferred(msg.sender, amount); } } function reInvest() external noContractsAllowed { updateAccount(msg.sender); uint amount = rewardsPendingClaim[msg.sender]; if (amount > 0) { rewardsPendingClaim[msg.sender] = 0; // re-invest here depositedTokens[msg.sender] = depositedTokens[msg.sender].add(amount); stakingTime[msg.sender] = now; emit Reinvest(msg.sender, amount); } } function getStakersList(uint startIndex, uint endIndex) public view returns (address[] memory stakers, uint[] memory stakingTimestamps, uint[] memory lastClaimedTimeStamps, uint[] memory stakedTokens) { require (startIndex < endIndex); uint length = endIndex.sub(startIndex); address[] memory _stakers = new address[](length); uint[] memory _stakingTimestamps = new uint[](length); uint[] memory _lastClaimedTimeStamps = new uint[](length); uint[] memory _stakedTokens = new uint[](length); for (uint i = startIndex; i < endIndex; i = i.add(1)) { address staker = holders.at(i); uint listIndex = i.sub(startIndex); _stakers[listIndex] = staker; _stakingTimestamps[listIndex] = stakingTime[staker]; _lastClaimedTimeStamps[listIndex] = lastClaimedTime[staker]; _stakedTokens[listIndex] = depositedTokens[staker]; } return (_stakers, _stakingTimestamps, _lastClaimedTimeStamps, _stakedTokens); } // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner { require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!"); require (Token(tokenAddress).transfer(recipient, amount), "Transfer failed!"); } // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyLegacyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner { require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!"); LegacyToken(tokenAddress).transfer(recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReferralFeeTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTransferred","type":"event"},{"inputs":[],"name":"ADMIN_CAN_CLAIM_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFERRAL_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRUSTED_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSTAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getActiveReferredStaker","outputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_totalEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"getNumberOfReferredStakers","outputs":[{"internalType":"uint256","name":"_activeStakers","type":"uint256"},{"internalType":"uint256","name":"_totalStakers","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getReferredStaker","outputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_totalEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getStakersList","outputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"stakingTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"lastClaimedTimeStamps","type":"uint256[]"},{"internalType":"uint256[]","name":"stakedTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getTotalPendingDivs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reInvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsPendingClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToStake","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedReferralFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReferralFeeEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyLegacyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526000600155600060025534801561001a57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260808181525050608051613e5761008c600039806112715280612c2b5280612ee952806131f15250613e576000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80639ca423b31161011a578063df4b70ba116100ad578063f2fde38b1161007c578063f2fde38b14610ac2578063f3f91fa014610b06578063f5326ada14610b5e578063f6af4dff14610b7c578063f749229e14610b9a57610206565b8063df4b70ba146109c0578063e7b62f58146109de578063ebe6cad114610a36578063f25b836414610a5457610206565b8063c6363892116100e9578063c6363892146108be578063d079490f14610916578063d493b9ac14610934578063d578ceab146109a257610206565b80639ca423b31461077a578063a35f7c7b146107fe578063c1665f4014610848578063c326bf4f1461086657610206565b80634e71d92d1161019d5780636270cd181161016c5780636270cd18146106145780637acb77571461066c5780637e44b933146106ba5780638da5cb5b146106d857806398896d101461072257610206565b80634e71d92d1461058a57806350be99ad14610594578063583d42fd1461059e5780635dbdda69146105f657610206565b80632a6b9bfd116101d95780632a6b9bfd146104515780632e17de78146104e6578063308feec31461051457806348f554d31461053257610206565b8063012ce5011461020b5780630c3d5157146102395780631808fdb8146102575780631911cf4a146102ec575b600080fd5b6102376004803603602081101561022157600080fd5b8101908080359060200190929190505050610bf9565b005b61024161126f565b6040518082815260200191505060405180910390f35b6102a36004803603604081101561026d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611293565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6103226004803603604081101561030257600080fd5b810190808035906020019092919080359060200190929190505050611332565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610371578082015181840152602081019050610356565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156103b3578082015181840152602081019050610398565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156103f55780820151818401526020810190506103da565b50505050905001858103825286818151815260200191508051906020019060200280838360005b8381101561043757808201518184015260208101905061041c565b505050509050019850505050505050505060405180910390f35b61049d6004803603604081101561046757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061164b565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b610512600480360360208110156104fc57600080fd5b81019080803590602001909291905050506116ea565b005b61051c611dd6565b6040518082815260200191505060405180910390f35b6105746004803603602081101561054857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de7565b6040518082815260200191505060405180910390f35b610592611dff565b005b61059c6120e0565b005b6105e0600480360360208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061236f565b6040518082815260200191505060405180910390f35b6105fe612387565b6040518082815260200191505060405180910390f35b6106566004803603602081101561062a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061238f565b6040518082815260200191505060405180910390f35b6106b86004803603604081101561068257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123a7565b005b6106c2612b80565b6040518082815260200191505060405180910390f35b6106e0612b85565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107646004803603602081101561073857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612baa565b6040518082815260200191505060405180910390f35b6107bc6004803603602081101561079057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612db6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610806612de9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610850612e01565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e06565b6040518082815260200191505060405180910390f35b610900600480360360208110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e1e565b6040518082815260200191505060405180910390f35b61091e612e36565b6040518082815260200191505060405180910390f35b6109a06004803603606081101561094a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3c565b005b6109aa6130c4565b6040518082815260200191505060405180910390f35b6109c86130ca565b6040518082815260200191505060405180910390f35b610a20600480360360208110156109f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130d0565b6040518082815260200191505060405180910390f35b610a3e61313e565b6040518082815260200191505060405180910390f35b610ac060048036036060811015610a6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613144565b005b610b0460048036036020811015610ad857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b005b610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613488565b6040518082815260200191505060405180910390f35b610b666134a0565b6040518082815260200191505060405180910390f35b610b846134a7565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610bb057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134af565b604051808381526020018281526020019250505060405180910390f35b610c183373ffffffffffffffffffffffffffffffffffffffff16613549565b158015610c5057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b610cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b62278d00610dcd600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261355c90919063ffffffff16565b11610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613dcd6034913960400191505060405180910390fd5b42600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610e91612710610e8360198561357390919063ffffffff16565b6135a290919063ffffffff16565b90506000610ea8828461355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610f6657600080fd5b505af1158015610f7a573d6000803e3d6000fd5b505050506040513d6020811015610f9057600080fd5b8101908080519060200190929190505050611013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110ae57600080fd5b505af11580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b810190808051906020019092919050505061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b6111ad83600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355c90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112043360036135bb90919063ffffffff16565b801561124f57506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561126a576112683360036135eb90919063ffffffff16565b505b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806112e783600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361b90919063ffffffff16565b9150600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509250929050565b60608060608084861061134457600080fd5b6000611359878761355c90919063ffffffff16565b905060608167ffffffffffffffff8111801561137457600080fd5b506040519080825280602002602001820160405280156113a35781602001602082028036833780820191505090505b50905060608267ffffffffffffffff811180156113bf57600080fd5b506040519080825280602002602001820160405280156113ee5781602001602082028036833780820191505090505b50905060608367ffffffffffffffff8111801561140a57600080fd5b506040519080825280602002602001820160405280156114395781602001602082028036833780820191505090505b50905060608467ffffffffffffffff8111801561145557600080fd5b506040519080825280602002602001820160405280156114845781602001602082028036833780820191505090505b50905060008b90505b8a8110156116305760006114ab82600361361b90919063ffffffff16565b905060006114c28e8461355c90919063ffffffff16565b9050818782815181106114d157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486828151811061155757fe5b602002602001018181525050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548582815181106115af57fe5b602002602001018181525050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484828151811061160757fe5b602002602001018181525050505061162960018261363590919063ffffffff16565b905061148d565b50838383839850985098509850505050505092959194509250565b60008061169f83600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361b90919063ffffffff16565b9150600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509250929050565b6117093373ffffffffffffffffffffffffffffffffffffffff16613549565b15801561174157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b62278d006118be600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261355c90919063ffffffff16565b11611914576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613dcd6034913960400191505060405180910390fd5b61191d33613651565b600061194761271061193960198561357390919063ffffffff16565b6135a290919063ffffffff16565b9050600061195e828461355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d6020811015611a4657600080fd5b8101908080519060200190929190505050611ac9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b505050506040513d6020811015611b8e57600080fd5b8101908080519060200190929190505050611c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b611c6383600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355c90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611cba3360036135bb90919063ffffffff16565b8015611d0557506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15611dd157611d1e3360036135eb90919063ffffffff16565b50611dcf33600c6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206135eb90919063ffffffff16565b505b505050565b6000611de260036138b9565b905090565b60096020528060005260406000206000915090505481565b611e1e3373ffffffffffffffffffffffffffffffffffffffff16613549565b158015611e5657503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b611ec8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b611ed133613651565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156120dd576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ffe57600080fd5b505af1158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b810190808051906020019092919050505061208e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e016021913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130826040518082815260200191505060405180910390a25b50565b6120ff3373ffffffffffffffffffffffffffffffffffffffff16613549565b15801561213757503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6121b233613651565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561236c576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061229681600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fbd654390d0d973e8c8376ed6053be8658870df892687852cc5c914d700291b87826040518082815260200191505060405180910390a25b50565b60066020528060005260406000206000915090505481565b6301e1338081565b60086020528060005260406000206000915090505481565b6123c63373ffffffffffffffffffffffffffffffffffffffff16613549565b1580156123fe57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600082116124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e6e6f74206465706f736974203020546f6b656e7300000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050506040513d60208110156125df57600080fd5b8101908080519060200190929190505050612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e73756666696369656e7420546f6b656e20416c6c6f77616e63650000000081525060200191505060405180910390fd5b61266b33613651565b600061269561271061268760008661357390919063ffffffff16565b6135a290919063ffffffff16565b905060006126ac828561355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561276a57600080fd5b505af115801561277e573d6000803e3d6000fd5b505050506040513d602081101561279457600080fd5b8101908080519060200190929190505050612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f74207472616e73666572206465706f736974206665652e0081525060200191505060405180910390fd5b61286981600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128c03360036138ce90919063ffffffff16565b50600073ffffffffffffffffffffffffffffffffffffffff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129d45782600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b612a8433600d6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138ce90919063ffffffff16565b50612b3533600c6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138ce90919063ffffffff16565b5042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b600081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612bc08260036135bb90919063ffffffff16565b612bcd5760009050612db1565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415612c1e5760009050612db1565b600080612c586301e133807f000000000000000000000000000000000000000000000000000000000000000061363590919063ffffffff16565b9050600042905081811115612c6b578190505b80600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612cba5760009250612d0f565b612d0c600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261355c90919063ffffffff16565b92505b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612da6612710612d986301e13380612d8a89612d7c6107d08961357390919063ffffffff16565b61357390919063ffffffff16565b6135a290919063ffffffff16565b6135a290919063ffffffff16565b905080955050505050505b919050565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601981565b60056020528060005260406000206000915090505481565b600b6020528060005260406000206000915090505481565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9557600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580612f195750612f16630208c0807f000000000000000000000000000000000000000000000000000000000000000061363590919063ffffffff16565b42115b612f8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301257600080fd5b505af1158015613026573d6000803e3d6000fd5b505050506040513d602081101561303c57600080fd5b81019080805190602001909291905050506130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60015481565b6101f481565b6000806130dc83612baa565b90506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050613135818361363590919063ffffffff16565b92505050919050565b6107d081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461319d57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580613221575061321e630208c0807f000000000000000000000000000000000000000000000000000000000000000061363590919063ffffffff16565b42115b613293576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561331a57600080fd5b505af115801561332e573d6000803e3d6000fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461339057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156133ca57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090505481565b62278d0081565b630208c08081565b6000806134f9600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138b9565b9150613542600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138b9565b9050915091565b600080823b905060008111915050919050565b60008282111561356857fe5b818303905092915050565b6000808284029050600084148061359257508284828161358f57fe5b04145b61359857fe5b8091505092915050565b6000808284816135ae57fe5b0490508091505092915050565b60006135e3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138fe565b905092915050565b6000613613836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613921565b905092915050565b600061362a8360000183613a09565b60001c905092915050565b60008082840190508381101561364757fe5b8091505092915050565b600061365c82612baa565b905060008111156138715760006136926127106136846101f48561357390919063ffffffff16565b6135a290919063ffffffff16565b905060006136a9828461355c90919063ffffffff16565b90506000613716600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b905060008490508115613727578290505b61377981600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061380e81600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138668160015461363590919063ffffffff16565b600181905550505050505b42600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60006138c782600001613d29565b9050919050565b60006138f6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613d3a565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146139fd576000600182039050600060018660000180549050039050600086600001828154811061396c57fe5b906000526020600020015490508087600001848154811061398957fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139c157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613a03565b60009150505b92915050565b600081836000018054905011613a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dab6022913960400191505060405180910390fd5b826000018281548110613a7957fe5b9060005260206000200154905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613aca5750600082115b15613d1e57613b2182600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b505050506040513d6020811015613c2957600080fd5b8101908080519060200190929190505050613cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e7366657220726566657272616c206665652181525060200191505060405180910390fd5b613cc18260025461363590919063ffffffff16565b6002819055508273ffffffffffffffffffffffffffffffffffffffff167fefdcb1f2ee8323554150b9eca5209dcd6a164266e8d1f04b95cbcecd0cad5219836040518082815260200191505060405180910390a260019050613d23565b600090505b92915050565b600081600001805490509050919050565b6000613d4683836138fe565b613d9f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613da4565b600090505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473596f7520726563656e746c79207374616b65642c20706c656173652077616974206265666f7265207769746864726177696e672e436f756c64206e6f74207472616e73666572206561726e656420746f6b656e732ea264697066735822122035ad17af8ccb15438edbc74575b259d9249a27da7c016204f140ca6ebe182f0064736f6c634300060b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c80639ca423b31161011a578063df4b70ba116100ad578063f2fde38b1161007c578063f2fde38b14610ac2578063f3f91fa014610b06578063f5326ada14610b5e578063f6af4dff14610b7c578063f749229e14610b9a57610206565b8063df4b70ba146109c0578063e7b62f58146109de578063ebe6cad114610a36578063f25b836414610a5457610206565b8063c6363892116100e9578063c6363892146108be578063d079490f14610916578063d493b9ac14610934578063d578ceab146109a257610206565b80639ca423b31461077a578063a35f7c7b146107fe578063c1665f4014610848578063c326bf4f1461086657610206565b80634e71d92d1161019d5780636270cd181161016c5780636270cd18146106145780637acb77571461066c5780637e44b933146106ba5780638da5cb5b146106d857806398896d101461072257610206565b80634e71d92d1461058a57806350be99ad14610594578063583d42fd1461059e5780635dbdda69146105f657610206565b80632a6b9bfd116101d95780632a6b9bfd146104515780632e17de78146104e6578063308feec31461051457806348f554d31461053257610206565b8063012ce5011461020b5780630c3d5157146102395780631808fdb8146102575780631911cf4a146102ec575b600080fd5b6102376004803603602081101561022157600080fd5b8101908080359060200190929190505050610bf9565b005b61024161126f565b6040518082815260200191505060405180910390f35b6102a36004803603604081101561026d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611293565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6103226004803603604081101561030257600080fd5b810190808035906020019092919080359060200190929190505050611332565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610371578082015181840152602081019050610356565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156103b3578082015181840152602081019050610398565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156103f55780820151818401526020810190506103da565b50505050905001858103825286818151815260200191508051906020019060200280838360005b8381101561043757808201518184015260208101905061041c565b505050509050019850505050505050505060405180910390f35b61049d6004803603604081101561046757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061164b565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b610512600480360360208110156104fc57600080fd5b81019080803590602001909291905050506116ea565b005b61051c611dd6565b6040518082815260200191505060405180910390f35b6105746004803603602081101561054857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de7565b6040518082815260200191505060405180910390f35b610592611dff565b005b61059c6120e0565b005b6105e0600480360360208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061236f565b6040518082815260200191505060405180910390f35b6105fe612387565b6040518082815260200191505060405180910390f35b6106566004803603602081101561062a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061238f565b6040518082815260200191505060405180910390f35b6106b86004803603604081101561068257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123a7565b005b6106c2612b80565b6040518082815260200191505060405180910390f35b6106e0612b85565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107646004803603602081101561073857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612baa565b6040518082815260200191505060405180910390f35b6107bc6004803603602081101561079057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612db6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610806612de9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610850612e01565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e06565b6040518082815260200191505060405180910390f35b610900600480360360208110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e1e565b6040518082815260200191505060405180910390f35b61091e612e36565b6040518082815260200191505060405180910390f35b6109a06004803603606081101561094a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3c565b005b6109aa6130c4565b6040518082815260200191505060405180910390f35b6109c86130ca565b6040518082815260200191505060405180910390f35b610a20600480360360208110156109f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130d0565b6040518082815260200191505060405180910390f35b610a3e61313e565b6040518082815260200191505060405180910390f35b610ac060048036036060811015610a6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613144565b005b610b0460048036036020811015610ad857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b005b610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613488565b6040518082815260200191505060405180910390f35b610b666134a0565b6040518082815260200191505060405180910390f35b610b846134a7565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610bb057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134af565b604051808381526020018281526020019250505060405180910390f35b610c183373ffffffffffffffffffffffffffffffffffffffff16613549565b158015610c5057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b610cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b62278d00610dcd600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261355c90919063ffffffff16565b11610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613dcd6034913960400191505060405180910390fd5b42600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610e91612710610e8360198561357390919063ffffffff16565b6135a290919063ffffffff16565b90506000610ea8828461355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610f6657600080fd5b505af1158015610f7a573d6000803e3d6000fd5b505050506040513d6020811015610f9057600080fd5b8101908080519060200190929190505050611013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110ae57600080fd5b505af11580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b810190808051906020019092919050505061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b6111ad83600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355c90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112043360036135bb90919063ffffffff16565b801561124f57506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561126a576112683360036135eb90919063ffffffff16565b505b505050565b7f00000000000000000000000000000000000000000000000000000000600f19dc81565b6000806112e783600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361b90919063ffffffff16565b9150600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509250929050565b60608060608084861061134457600080fd5b6000611359878761355c90919063ffffffff16565b905060608167ffffffffffffffff8111801561137457600080fd5b506040519080825280602002602001820160405280156113a35781602001602082028036833780820191505090505b50905060608267ffffffffffffffff811180156113bf57600080fd5b506040519080825280602002602001820160405280156113ee5781602001602082028036833780820191505090505b50905060608367ffffffffffffffff8111801561140a57600080fd5b506040519080825280602002602001820160405280156114395781602001602082028036833780820191505090505b50905060608467ffffffffffffffff8111801561145557600080fd5b506040519080825280602002602001820160405280156114845781602001602082028036833780820191505090505b50905060008b90505b8a8110156116305760006114ab82600361361b90919063ffffffff16565b905060006114c28e8461355c90919063ffffffff16565b9050818782815181106114d157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486828151811061155757fe5b602002602001018181525050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548582815181106115af57fe5b602002602001018181525050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484828151811061160757fe5b602002602001018181525050505061162960018261363590919063ffffffff16565b905061148d565b50838383839850985098509850505050505092959194509250565b60008061169f83600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361b90919063ffffffff16565b9150600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509250929050565b6117093373ffffffffffffffffffffffffffffffffffffffff16613549565b15801561174157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b62278d006118be600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261355c90919063ffffffff16565b11611914576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613dcd6034913960400191505060405180910390fd5b61191d33613651565b600061194761271061193960198561357390919063ffffffff16565b6135a290919063ffffffff16565b9050600061195e828461355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d6020811015611a4657600080fd5b8101908080519060200190929190505050611ac9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b505050506040513d6020811015611b8e57600080fd5b8101908080519060200190929190505050611c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b611c6383600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355c90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611cba3360036135bb90919063ffffffff16565b8015611d0557506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15611dd157611d1e3360036135eb90919063ffffffff16565b50611dcf33600c6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206135eb90919063ffffffff16565b505b505050565b6000611de260036138b9565b905090565b60096020528060005260406000206000915090505481565b611e1e3373ffffffffffffffffffffffffffffffffffffffff16613549565b158015611e5657503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b611ec8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b611ed133613651565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156120dd576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ffe57600080fd5b505af1158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b810190808051906020019092919050505061208e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e016021913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130826040518082815260200191505060405180910390a25b50565b6120ff3373ffffffffffffffffffffffffffffffffffffffff16613549565b15801561213757503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6121b233613651565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561236c576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061229681600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fbd654390d0d973e8c8376ed6053be8658870df892687852cc5c914d700291b87826040518082815260200191505060405180910390a25b50565b60066020528060005260406000206000915090505481565b6301e1338081565b60086020528060005260406000206000915090505481565b6123c63373ffffffffffffffffffffffffffffffffffffffff16613549565b1580156123fe57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600082116124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e6e6f74206465706f736974203020546f6b656e7300000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050506040513d60208110156125df57600080fd5b8101908080519060200190929190505050612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e73756666696369656e7420546f6b656e20416c6c6f77616e63650000000081525060200191505060405180910390fd5b61266b33613651565b600061269561271061268760008661357390919063ffffffff16565b6135a290919063ffffffff16565b905060006126ac828561355c90919063ffffffff16565b905073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561276a57600080fd5b505af115801561277e573d6000803e3d6000fd5b505050506040513d602081101561279457600080fd5b8101908080519060200190929190505050612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f74207472616e73666572206465706f736974206665652e0081525060200191505060405180910390fd5b61286981600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128c03360036138ce90919063ffffffff16565b50600073ffffffffffffffffffffffffffffffffffffffff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129d45782600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b612a8433600d6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138ce90919063ffffffff16565b50612b3533600c6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138ce90919063ffffffff16565b5042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b600081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612bc08260036135bb90919063ffffffff16565b612bcd5760009050612db1565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415612c1e5760009050612db1565b600080612c586301e133807f00000000000000000000000000000000000000000000000000000000600f19dc61363590919063ffffffff16565b9050600042905081811115612c6b578190505b80600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612cba5760009250612d0f565b612d0c600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261355c90919063ffffffff16565b92505b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612da6612710612d986301e13380612d8a89612d7c6107d08961357390919063ffffffff16565b61357390919063ffffffff16565b6135a290919063ffffffff16565b6135a290919063ffffffff16565b905080955050505050505b919050565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601981565b60056020528060005260406000206000915090505481565b600b6020528060005260406000206000915090505481565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9557600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580612f195750612f16630208c0807f00000000000000000000000000000000000000000000000000000000600f19dc61363590919063ffffffff16565b42115b612f8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301257600080fd5b505af1158015613026573d6000803e3d6000fd5b505050506040513d602081101561303c57600080fd5b81019080805190602001909291905050506130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60015481565b6101f481565b6000806130dc83612baa565b90506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050613135818361363590919063ffffffff16565b92505050919050565b6107d081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461319d57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580613221575061321e630208c0807f00000000000000000000000000000000000000000000000000000000600f19dc61363590919063ffffffff16565b42115b613293576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561331a57600080fd5b505af115801561332e573d6000803e3d6000fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461339057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156133ca57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090505481565b62278d0081565b630208c08081565b6000806134f9600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138b9565b9150613542600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206138b9565b9050915091565b600080823b905060008111915050919050565b60008282111561356857fe5b818303905092915050565b6000808284029050600084148061359257508284828161358f57fe5b04145b61359857fe5b8091505092915050565b6000808284816135ae57fe5b0490508091505092915050565b60006135e3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138fe565b905092915050565b6000613613836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613921565b905092915050565b600061362a8360000183613a09565b60001c905092915050565b60008082840190508381101561364757fe5b8091505092915050565b600061365c82612baa565b905060008111156138715760006136926127106136846101f48561357390919063ffffffff16565b6135a290919063ffffffff16565b905060006136a9828461355c90919063ffffffff16565b90506000613716600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b905060008490508115613727578290505b61377981600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061380e81600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138668160015461363590919063ffffffff16565b600181905550505050505b42600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60006138c782600001613d29565b9050919050565b60006138f6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613d3a565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146139fd576000600182039050600060018660000180549050039050600086600001828154811061396c57fe5b906000526020600020015490508087600001848154811061398957fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139c157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613a03565b60009150505b92915050565b600081836000018054905011613a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dab6022913960400191505060405180910390fd5b826000018281548110613a7957fe5b9060005260206000200154905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613aca5750600082115b15613d1e57613b2182600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461363590919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b505050506040513d6020811015613c2957600080fd5b8101908080519060200190929190505050613cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e7366657220726566657272616c206665652181525060200191505060405180910390fd5b613cc18260025461363590919063ffffffff16565b6002819055508273ffffffffffffffffffffffffffffffffffffffff167fefdcb1f2ee8323554150b9eca5209dcd6a164266e8d1f04b95cbcecd0cad5219836040518082815260200191505060405180910390a260019050613d23565b600090505b92915050565b600081600001805490509050919050565b6000613d4683836138fe565b613d9f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613da4565b600090505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473596f7520726563656e746c79207374616b65642c20706c656173652077616974206265666f7265207769746864726177696e672e436f756c64206e6f74207472616e73666572206561726e656420746f6b656e732ea264697066735822122035ad17af8ccb15438edbc74575b259d9249a27da7c016204f140ca6ebe182f0064736f6c634300060b0033
Deployed Bytecode Sourcemap
18045:12355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26245:1029;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19426:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23713:242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28192:1157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23472:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25039:1055;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23071:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19988:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27286:411;;;:::i;:::-;;27709:471;;;:::i;:::-;;19819:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18738:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19925:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23973:1054;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18818:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17000:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21900:911;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20053:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18554:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18901:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19764:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20105:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19374:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29537:348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19332:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19012:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22823:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18686:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30067:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17619:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19870:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19117:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19172:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23184:276;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;26245:1029;19593:32;19601:10;19593:30;;;:32::i;:::-;19591:35;:62;;;;;19643:10;19630:23;;:9;:23;;;19591:62;19583:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26372:16:::1;26341:15;:27;26357:10;26341:27;;;;;;;;;;;;;;;;:47;;26333:86;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19152:7;26448:32;26456:11;:23;26468:10;26456:23;;;;;;;;;;;;;;;;26448:3;:7;;:32;;;;:::i;:::-;:46;26440:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26645:3;26615:15;:27;26631:10;26615:27;;;;;;;;;;;;;;;:33;;;;26669:8;26680:55;26731:3;26680:46;18949:2;26680:16;:20;;:46;;;;:::i;:::-;:50;;:55;;;;:::i;:::-;26669:66;;26746:19;26768:25;26789:3;26768:16;:20;;:25;;;;:::i;:::-;26746:47;;18602:42;26822:37;;;26860:5;::::0;::::1;;;;;;;;;26867:3;26822:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;26814:94;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18602:42;26927:37;;;26965:10;26977:14;26927:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;26919:104;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27074:49;27106:16;27074:15;:27;27090:10;27074:27;;;;;;;;;;;;;;;;:31;;:49;;;;:::i;:::-;27044:15;:27;27060:10;27044:27;;;;;;;;;;;;;;;:79;;;;27148:28;27165:10;27148:7;:16;;:28;;;;:::i;:::-;:64;;;;;27211:1;27180:15;:27;27196:10;27180:27;;;;;;;;;;;;;;;;:32;27148:64;27144:123;;;27229:26;27244:10;27229:7;:14;;:26;;;;:::i;:::-;;27144:123;19690:1;;26245:1029:::0;:::o;19426:39::-;;;:::o;23713:242::-;23794:15;23811:17;23851:44;23893:1;23851:29;:38;23881:7;23851:38;;;;;;;;;;;;;;;:41;;:44;;;;:::i;:::-;23841:54;;23921:17;:26;23939:7;23921:26;;;;;;;;;;;;;;;;23906:41;;23713:242;;;;;:::o;28192:1157::-;28299:24;28339:31;28386:35;28436:26;28497:8;28484:10;:21;28475:31;;;;;;28527:11;28541:24;28554:10;28541:8;:12;;:24;;;;:::i;:::-;28527:38;;28576:25;28618:6;28604:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28576:49;;28636:32;28682:6;28671:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28636:53;;28700:36;28750:6;28739:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28700:57;;28768:27;28809:6;28798:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28768:48;;28842:6;28851:10;28842:19;;28837:408;28867:8;28863:1;:12;28837:408;;;28906:14;28923:13;28934:1;28923:7;:10;;:13;;;;:::i;:::-;28906:30;;28951:14;28968:17;28974:10;28968:1;:5;;:17;;;;:::i;:::-;28951:34;;29022:6;29000:8;29009:9;29000:19;;;;;;;;;;;;;:28;;;;;;;;;;;29075:11;:19;29087:6;29075:19;;;;;;;;;;;;;;;;29043:18;29062:9;29043:29;;;;;;;;;;;;;:51;;;;;29145:15;:23;29161:6;29145:23;;;;;;;;;;;;;;;;29109:22;29132:9;29109:33;;;;;;;;;;;;;:59;;;;;29210:15;:23;29226:6;29210:23;;;;;;;;;;;;;;;;29183:13;29197:9;29183:24;;;;;;;;;;;;;:50;;;;;28837:408;;28881:8;28887:1;28881;:5;;:8;;;;:::i;:::-;28877:12;;28837:408;;;;29273:8;29283:18;29303:22;29327:13;29265:76;;;;;;;;;;;;;28192:1157;;;;;;;:::o;23472:235::-;23547:15;23564:17;23604:43;23645:1;23604:28;:37;23633:7;23604:37;;;;;;;;;;;;;;;:40;;:43;;;;:::i;:::-;23594:53;;23673:17;:26;23691:7;23673:26;;;;;;;;;;;;;;;;23658:41;;23472:235;;;;;:::o;25039:1055::-;19593:32;19601:10;19593:30;;;:32::i;:::-;19591:35;:62;;;;;19643:10;19630:23;;:9;:23;;;19591:62;19583:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25157:16:::1;25126:15;:27;25142:10;25126:27;;;;;;;;;;;;;;;;:47;;25118:86;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19152:7;25233:32;25241:11;:23;25253:10;25241:23;;;;;;;;;;;;;;;;25233:3;:7;;:32;;;;:::i;:::-;:46;25225:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25357:25;25371:10;25357:13;:25::i;:::-;25403:8;25414:55;25465:3;25414:46;18949:2;25414:16;:20;;:46;;;;:::i;:::-;:50;;:55;;;;:::i;:::-;25403:66;;25480:19;25502:25;25523:3;25502:16;:20;;:25;;;;:::i;:::-;25480:47;;18602:42;25556:37;;;25594:5;::::0;::::1;;;;;;;;;25601:3;25556:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25548:94;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18602:42;25661:37;;;25699:10;25711:14;25661:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25653:104;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25808:49;25840:16;25808:15;:27;25824:10;25808:27;;;;;;;;;;;;;;;;:31;;:49;;;;:::i;:::-;25778:15;:27;25794:10;25778:27;;;;;;;;;;;;;;;:79;;;;25882:28;25899:10;25882:7;:16;;:28;;;;:::i;:::-;:64;;;;;25945:1;25914:15;:27;25930:10;25914:27;;;;;;;;;;;;;;;;:32;25882:64;25878:209;;;25963:26;25978:10;25963:7;:14;;:26;;;;:::i;:::-;;26004:71;26064:10;26004:29;:52;26034:9;:21;26044:10;26034:21;;;;;;;;;;;;;;;;;;;;;;;;;26004:52;;;;;;;;;;;;;;;:59;;:71;;;;:::i;:::-;;25878:209;19690:1;;25039:1055:::0;:::o;23071:101::-;23124:4;23148:16;:7;:14;:16::i;:::-;23141:23;;23071:101;:::o;19988:52::-;;;;;;;;;;;;;;;;;:::o;27286:411::-;19593:32;19601:10;19593:30;;;:32::i;:::-;19591:35;:62;;;;;19643:10;19630:23;;:9;:23;;;19591:62;19583:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27342:25:::1;27356:10;27342:13;:25::i;:::-;27378:11;27392:19;:31;27412:10;27392:31;;;;;;;;;;;;;;;;27378:45;;27447:1;27438:6;:10;27434:256;;;27499:1;27465:19;:31;27485:10;27465:31;;;;;;;;;;;;;;;:35;;;;18602:42;27523:37;;;27561:10;27573:6;27523:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;27515:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27659:10;27640:38;;;27671:6;27640:38;;;;;;;;;;;;;;;;;;27434:256;19690:1;27286:411::o:0;27709:471::-;19593:32;19601:10;19593:30;;;:32::i;:::-;19591:35;:62;;;;;19643:10;19630:23;;:9;:23;;;19591:62;19583:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27768:25:::1;27782:10;27768:13;:25::i;:::-;27804:11;27818:19;:31;27838:10;27818:31;;;;;;;;;;;;;;;;27804:45;;27873:1;27864:6;:10;27860:313;;;27925:1;27891:19;:31;27911:10;27891:31;;;;;;;;;;;;;;;:35;;;;28016:39;28048:6;28016:15;:27;28032:10;28016:27;;;;;;;;;;;;;;;;:31;;:39;;;;:::i;:::-;27986:15;:27;28002:10;27986:27;;;;;;;;;;;;;;;:69;;;;28110:3;28084:11;:23;28096:10;28084:23;;;;;;;;;;;;;;;:29;;;;28142:10;28133:28;;;28154:6;28133:28;;;;;;;;;;;;;;;;;;27860:313;19690:1;27709:471::o:0;19819:44::-;;;;;;;;;;;;;;;;;:::o;18738:47::-;18777:8;18738:47;:::o;19925:50::-;;;;;;;;;;;;;;;;;:::o;23973:1054::-;19593:32;19601:10;19593:30;;;:32::i;:::-;19591:35;:62;;;;;19643:10;19630:23;;:9;:23;;;19591:62;19583:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24089:1:::1;24073:13;:17;24065:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18602:42;24137:41;;;24179:10;24199:4;24206:13;24137:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;24129:124;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24274:25;24288:10;24274:13;:25::i;:::-;24320:8;24331:50;24377:3;24331:41;18864:1;24331:13;:17;;:41;;;;:::i;:::-;:45;;:50;;;;:::i;:::-;24320:61;;24392:19;24414:22;24432:3;24414:13;:17;;:22;;;;:::i;:::-;24392:44;;18602:42;24455:37;;;24493:5;::::0;::::1;;;;;;;;;24500:3;24455:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;24447:93;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24591:47;24623:14;24591:15;:27;24607:10;24591:27;;;;;;;;;;;;;;;;:31;;:47;;;;:::i;:::-;24561:15;:27;24577:10;24561:27;;;;;;;;;;;;;;;:77;;;;24659:23;24671:10;24659:7;:11;;:23;;;;:::i;:::-;;24740:1;24707:35;;:9;:21;24717:10;24707:21;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;24703:100;;;24783:8;24759:9;:21;24769:10;24759:21;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;24703:100;24823:67;24879:10;24823:28;:51;24852:9;:21;24862:10;24852:21;;;;;;;;;;;;;;;;;;;;;;;;;24823:51;;;;;;;;;;;;;;;:55;;:67;;;;:::i;:::-;;24901:68;24958:10;24901:29;:52;24931:9;:21;24941:10;24931:21;;;;;;;;;;;;;;;;;;;;;;;;;24901:52;;;;;;;;;;;;;;;:56;;:68;;;;:::i;:::-;;25016:3;24990:11;:23;25002:10;24990:23;;;;;;;;;;;;;;;:29;;;;19690:1;;23973:1054:::0;;:::o;18818:47::-;18864:1;18818:47;:::o;17000:20::-;;;;;;;;;;;;;:::o;21900:911::-;21962:4;21984:25;22001:7;21984;:16;;:25;;;;:::i;:::-;21979:40;;22018:1;22011:8;;;;21979:40;22062:1;22034:15;:24;22050:7;22034:24;;;;;;;;;;;;;;;;:29;22030:43;;;22072:1;22065:8;;;;22030:43;22094:13;22118:19;22140:38;18777:8;22140:17;:21;;:38;;;;:::i;:::-;22118:60;;22189:9;22201:3;22189:15;;22226:14;22219:4;:21;22215:75;;;22264:14;22257:21;;22215:75;22342:4;22314:15;:24;22330:7;22314:24;;;;;;;;;;;;;;;;:32;22310:155;;22374:1;22363:12;;22310:155;;;22419:34;22428:15;:24;22444:7;22428:24;;;;;;;;;;;;;;;;22419:4;:8;;:34;;;;:::i;:::-;22408:45;;22310:155;22477:17;22497:15;:24;22513:7;22497:24;;;;;;;;;;;;;;;;22477:44;;22542:16;22561:199;22756:3;22561:160;18777:8;22561:109;22661:8;22561:65;18727:4;22561:12;:46;;:65;;;;:::i;:::-;:99;;:109;;;;:::i;:::-;:143;;:160;;;;:::i;:::-;:194;;:199;;;;:::i;:::-;22542:218;;22792:11;22785:18;;;;;;;21900:911;;;;:::o;20053:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;18554:90::-;18602:42;18554:90;:::o;18901:50::-;18949:2;18901:50;:::o;19764:48::-;;;;;;;;;;;;;;;;;:::o;20105:55::-;;;;;;;;;;;;;;;;;:::o;19374:39::-;;;;:::o;29537:348::-;17430:5;;;;;;;;;;;17416:19;;:10;:19;;;17408:28;;;;;;18602:42:::1;29661:37;;:12;:37;;;;:91;;;;29708:44;19217:8;29708:17;:21;;:44;;;;:::i;:::-;29702:3;:50;29661:91;29652:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29815:12;29809:28;;;29838:9;29849:6;29809:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;29800:77;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29537:348:::0;;;:::o;19332:35::-;;;;:::o;19012:50::-;19059:3;19012:50;:::o;22823:236::-;22892:4;22909:12;22924:23;22939:7;22924:14;:23::i;:::-;22909:38;;22958:18;22979:19;:28;22999:7;22979:28;;;;;;;;;;;;;;;;22958:49;;23025:26;23037:13;23025:7;:11;;:26;;;;:::i;:::-;23018:33;;;;22823:236;;;:::o;18686:45::-;18727:4;18686:45;:::o;30067:330::-;17430:5;;;;;;;;;;;17416:19;;:10;:19;;;17408:28;;;;;;18602:42:::1;30197:37;;:12;:37;;;;:91;;;;30244:44;19217:8;30244:17;:21;;:44;;;;:::i;:::-;30238:3;:50;30197:91;30188:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30348:12;30336:34;;;30371:9;30382:6;30336:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30067:330:::0;;;:::o;17619:178::-;17430:5;;;;;;;;;;;17416:19;;:10;:19;;;17408:28;;;;;;17716:1:::1;17696:22;;:8;:22;;;;17688:31;;;::::0;::::1;;17759:8;17731:37;;17752:5;::::0;::::1;;;;;;;;;17731:37;;;;;;;;;;;;17783:8;17775:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;17619:178:::0;:::o;19870:48::-;;;;;;;;;;;;;;;;;:::o;19117:42::-;19152:7;19117:42;:::o;19172:53::-;19217:8;19172:53;:::o;23184:276::-;23261:19;23282:18;23330:48;:29;:39;23360:8;23330:39;;;;;;;;;;;;;;;:46;:48::i;:::-;23313:65;;23405:47;:28;:38;23434:8;23405:38;;;;;;;;;;;;;;;:45;:47::i;:::-;23389:63;;23184:276;;;:::o;1554:422::-;1614:4;1822:12;1933:7;1921:20;1913:28;;1967:1;1960:4;:8;1953:15;;;1554:422;;;:::o;614:113::-;672:7;700:1;695;:6;;688:14;;;;720:1;716;:5;709:12;;614:113;;;;:::o;185:147::-;243:7;259:9;275:1;271;:5;259:17;;295:1;290;:6;:20;;;;309:1;304;300;:5;;;;;;:10;290:20;283:28;;;;325:1;318:8;;;185:147;;;;:::o;338:270::-;396:7;487:9;503:1;499;:5;;;;;;487:17;;601:1;594:8;;;338:270;;;;:::o;14315:158::-;14395:4;14419:46;14429:3;:10;;14457:5;14449:14;;14441:23;;14419:9;:46::i;:::-;14412:53;;14315:158;;;;:::o;14080:149::-;14153:4;14177:44;14185:3;:10;;14213:5;14205:14;;14197:23;;14177:7;:44::i;:::-;14170:51;;14080:149;;;;:::o;15020:::-;15094:7;15137:22;15141:3;:10;;15153:5;15137:3;:22::i;:::-;15129:31;;15114:47;;15020:149;;;;:::o;733:133::-;791:7;807:9;823:1;819;:5;807:17;;843:1;838;:6;;831:14;;;;859:1;852:8;;;733:133;;;;:::o;20433:890::-;20492:16;20511:23;20526:7;20511:14;:23::i;:::-;20492:42;;20563:1;20549:11;:15;20545:730;;;20581:16;20600:51;20645:5;20600:40;19059:3;20600:11;:15;;:40;;;;:::i;:::-;:44;;:51;;;;:::i;:::-;20581:70;;20666:24;20693:28;20709:11;20693;:15;;:28;;;;:::i;:::-;20666:55;;20750:12;20765:62;20795:9;:18;20805:7;20795:18;;;;;;;;;;;;;;;;;;;;;;;;;20815:11;20765:29;:62::i;:::-;20750:77;;20856:11;20870;20856:25;;20900:7;20896:76;;;20937:19;20928:28;;20896:76;21045:40;21078:6;21045:19;:28;21065:7;21045:28;;;;;;;;;;;;;;;;:32;;:40;;;;:::i;:::-;21014:19;:28;21034:7;21014:28;;;;;;;;;;;;;;;:71;;;;21129:38;21160:6;21129:17;:26;21147:7;21129:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;21100:17;:26;21118:7;21100:26;;;;;;;;;;;;;;;:67;;;;21218:31;21242:6;21218:19;;:23;;:31;;;;:::i;:::-;21196:19;:53;;;;20545:730;;;;;21312:3;21285:15;:24;21301:7;21285:24;;;;;;;;;;;;;;;:30;;;;20433:890;;:::o;14559:117::-;14622:7;14649:19;14657:3;:10;;14649:7;:19::i;:::-;14642:26;;14559:117;;;:::o;13761:143::-;13831:4;13855:41;13860:3;:10;;13888:5;13880:14;;13872:23;;13855:4;:41::i;:::-;13848:48;;13761:143;;;;:::o;12635:129::-;12708:4;12755:1;12732:3;:12;;:19;12745:5;12732:19;;;;;;;;;;;;:24;;12725:31;;12635:129;;;;:::o;11005:1544::-;11071:4;11189:18;11210:3;:12;;:19;11223:5;11210:19;;;;;;;;;;;;11189:40;;11260:1;11246:10;:15;11242:1300;;11608:21;11645:1;11632:10;:14;11608:38;;11661:17;11702:1;11681:3;:11;;:18;;;;:22;11661:42;;11948:17;11968:3;:11;;11980:9;11968:22;;;;;;;;;;;;;;;;11948:42;;12114:9;12085:3;:11;;12097:13;12085:26;;;;;;;;;;;;;;;:38;;;;12233:1;12217:13;:17;12191:3;:12;;:23;12204:9;12191:23;;;;;;;;;;;:43;;;;12343:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;12438:3;:12;;:19;12451:5;12438:19;;;;;;;;;;;12431:26;;;12481:4;12474:11;;;;;;;;11242:1300;12525:5;12518:12;;;11005:1544;;;;;:::o;13303:204::-;13370:7;13419:5;13398:3;:11;;:18;;;;:26;13390:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13481:3;:11;;13493:5;13481:18;;;;;;;;;;;;;;;;13474:25;;13303:204;;;;:::o;21335:553::-;21421:4;21461:1;21442:21;;:7;:21;;;;:35;;;;;21476:1;21467:6;:10;21442:35;21438:420;;;21528:43;21564:6;21528:22;:31;21551:7;21528:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;21494:22;:31;21517:7;21494:31;;;;;;;;;;;;;;;:77;;;;18602:42;21594:37;;;21632:7;21641:6;21594:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21586:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21726:35;21754:6;21726:23;;:27;;:35;;;;:::i;:::-;21700:23;:61;;;;21804:7;21781:39;;;21813:6;21781:39;;;;;;;;;;;;;;;;;;21842:4;21835:11;;;;21438:420;21875:5;21868:12;;21335:553;;;;;:::o;12850:109::-;12906:7;12933:3;:11;;:18;;;;12926:25;;12850:109;;;:::o;10415:414::-;10478:4;10500:21;10510:3;10515:5;10500:9;:21::i;:::-;10495:327;;10538:3;:11;;10555:5;10538:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10721:3;:11;;:18;;;;10699:3;:12;;:19;10712:5;10699:19;;;;;;;;;;;:40;;;;10761:4;10754:11;;;;10495:327;10805:5;10798:12;;10415:414;;;;;:::o
Swarm Source
ipfs://35ad17af8ccb15438edbc74575b259d9249a27da7c016204f140ca6ebe182f00
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.290066 | 0.4096 | $0.1188 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.